题目:
Maximum Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Given two integer sequences {ai} and {bi} with the same length n, you are to find the next n numbers of {ai}: an+1…a2n . Just like always, there are some restrictions on an+1…a2n : for each number ai , you must choose a number bk from {bi}, and it must satisfy ai ≤max{ aj -j│ bk ≤j<i}, and any bk can’t be chosen more than once. Apparently, there are a great many possibilities, so you are required to find max{ ∑2nn+1ai } modulo 109 +7 .
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.
4 8 11 8 5 3 1 4 2
27HintFor the first sample: 1. Choose 2 from {bi}, then a_2…a_4 are available for a_5, and you can let a_5=a_2-2=9; 2. Choose 1 from {bi}, then a_1…a_5 are available for a_6, and you can let a_6=a_2-2=9;
题意:给你长度为n的两个数组a和b。求 an+1…a2n 。满足两个条件:在数组b中选择 bk , ai ≤max{ aj -j│ bk ≤j<i},而且 bk 只能用一次。1≤n≤250000, n≤a_i≤1500000, 1≤b_i≤n.所以用__int64。
思路:不知道怎么讲,就是求
aj
-j的值给数组c。a_n+1~a_2*n就是max(c[j>=b[i]]),自己动手写下就明白了。例如:
an+1…a
a_i 8 11 8 5 9 9 5 4
a_i-i 7 9 5 1 4 3 -2 -4
b_i 3 1 4 2
所以答案为9+9+5+4=27.
CODE:
#include<bits/stdc++.h>
using namespace std;
#define maxn 250005
__int64 a[maxn],b[maxn],c[maxn];
int main()
{
int n,i;
__int64 maxr,sum,mod=1e9+7;
while(~scanf("%d",&n)){
for(i=1;i<=n;i++){
scanf("%I64d",&a[i]);
a[i]-=i;
if(i>1) maxr=max(maxr,a[i]);
else maxr=a[i];
}
maxr-=(n+1);
for(i=n;i>=1;i--){
c[i]=max(maxr,a[i]);
if(i<n) c[i]=max(c[i],c[i+1]);
}
sum=0;
for(i=1;i<=n;i++){
scanf("%I64d",&b[i]);
sum=(sum+c[b[i]])%mod;
}
printf("%I64d\n",sum);
}
return 0;
}
b_ian+1…a2n