2014年3月6日 星期四
[HOJ] 332 - 交換數列
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
struct P{
int val,in;
}s[500005];
int cmp(P a,P b){
return a.val<b.val;
}
vector<long long int> arr,vec[500005];
long long int dp[1000005]={0},L=0;
bool is[1000005]={0};
int main(){
int n,m,l=0,x,i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&m);
if(is[m]==0){
is[m]=1;
arr.push_back(m);
}
l=max(l,m);
s[i].val=m,s[i].in=i;
vec[i].push_back(0);
for(j=0;j<m;j++){
scanf("%d",&x);
long long int pre=0;
pre=vec[i][j];
vec[i].push_back(pre+x);
}
}
arr.push_back(0);
sort(arr.begin(),arr.end());
sort(s,s+n,cmp);
for(i=1;i<=l;i++)
dp[i]=-100000000000000001LL;
long long int ans=-100000000000000001LL;
for(i=1;i<arr.size();i++){
int r=arr[i],l=arr[i-1];
while(L<n && s[L].val<r) L++;
if(L==n) break;
for(j=L;j<n;j++){
dp[r]=max(dp[r],dp[l]+vec[s[j].in][r]-vec[s[j].in][l]);
}
ans=max(ans,dp[r]);
}
printf("%lld\n",ans);
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言