题目大意:给出一个长度为n的序列,每次删除一个(删除之后序列断开),求最大连续子段和。(序列中数为正整数)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<vector> 7 #include<cmath> 8 #include<ctime> 9 #include<cstring> 10 #define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout); 11 #define llg long long 12 #define maxn 100010 13 #define md 50000 14 #define inf 0x7fffffff 15 using namespace std; 16 llg i,j,k,n,m,a[maxn],f1,f2,maxl,c[maxn],ans[maxn],dad[maxn],bj[maxn],x,val[maxn]; 17 18 llg find (llg x) 19 { 20 return dad[x]==x?x:dad[x]=find(dad[x]); 21 } 22 23 int main() 24 { 25 // yyj("c"); 26 cin>>n; 27 for (i=1;i<=n;i++) scanf("%I64d",&a[i]),dad[i]=i; 28 for (i=1;i<=n;i++) scanf("%I64d",&c[i]); 29 for (i=n;i>=1;i--) 30 { 31 maxl=max(maxl,a[c[i]]); 32 bj[c[i]]=1; val[c[i]]+=a[c[i]]; 33 x=c[i]; 34 if (bj[x-1]!=0 && bj[x+1]!=0) 35 { 36 f1=find(x-1); 37 dad[find(x)]=f1; 38 f2=find(x+1); 39 dad[f2]=f1; 40 val[f1]+=a[x]+val[x+1]; 41 maxl=max(maxl,val[f1]); 42 } 43 else 44 if (bj[x-1]!=0) 45 { 46 f1=find(x-1); 47 dad[find(x)]=f1; 48 val[f1]+=val[x]; 49 maxl=max(maxl,val[f1]); 50 } 51 else 52 if (bj[x+1]!=0) 53 { 54 f2=find(x+1); 55 dad[f2]=find(x); 56 val[find(x)]+=val[f2]; 57 maxl=max(maxl,val[find(x)]); 58 } 59 else 60 { 61 dad[x]=x; 62 val[x]=a[x]; 63 maxl=max(maxl,a[x]); 64 } 65 ans[i]=maxl; 66 } 67 for (i=2;i<=n;i++) cout<<ans[i]<<endl; 68 cout<<0; 69 return 0; 70 }