Maximum Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total
Submission(s): 1887 Accepted Submission(s): 671
Given two integer sequences {ai} and {bi} with the same length n, you are to find the next n numbers of {ai}: a
Now Steph finds it too hard to solve the problem, please help him.
For each test case, the first line consists of one integer n. The next line consists of n integers representing {ai}. And the third line consists of n integers representing {bi}.
1≤n≤250000, n≤a_i≤1500000, 1≤b_i≤n.
a: 8 11 8 5
a[i]-i: 7 9 5 1
b:3 1 4 2
先将b排序得到 b: 1 2 3 4
那么取第一个b[0]=1 那么取到9
a:8 11 8 5 9
a[i]-i: 7 9 5 1 4
b[1]=2 还是取到 9
a: 8 11 8 5 9 9
a[i]-i: 7 9 5 1 4 3
后面继续这样取最终得到的是
a: 8 11 8 5 9 9 5 4 多出来的就是 27
那么从模拟的这个过程可以发现,只要记录当前位置到n中间的最大值 和更新出来的数中的最大值
进行比较取最大的那个,就是答案啦~
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 300009
#define mod 1000000007
long long a[N], b[N], maxa[N];
int main()
{
int n;
while(scanf("%d", & n) != EOF)
{
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(maxa, 0, sizeof(maxa));
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
a[i] = a[i] - i;
}
for(int i = 1; i <= n; i++)
scanf("%lld", &b[i]);
sort(b, b+n+1);
for(int i = n ; i >= 1; i--)
{
maxa[i] = max(maxa[i+1], a[i]);
}
long long ans = 0;
ans += maxa[b[1]];
ans %= mod;
long long t = maxa[b[1]] - n - 1;
for(int i = 2; i <= n; i++)
{
maxa[b[i]] = max(maxa[b[i]], t);
ans += maxa[b[i]];
ans %= mod;
t = max(t, maxa[b[i]] - n - i);
}
printf("%lld
", ans);
}
}