CodeForces722C Destroying Array【瞎搞】
题意:
先给你一个序列,然后给你n个1-n的一个数,让你求前i个元素销毁的时候,区间字段和区间最大;
思路:
先给你一个序列,然后给你n个1-n的一个数,让你求前i个元素销毁的时候,区间字段和区间最大;
思路:
离线处理,维护新区间首尾位置的起点和终点,倒着处理;
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int>PII; const double eps=1e-5; const double pi=acos(-1.0); //const int mod=1e9+7; const int INF=0x3f3f3f3f; const int N=1e5+10; struct asd{ int s,t; }; asd q[N]; LL a[N]; LL ans[N],sum[N]; int sp[N],temp[N]; int main() { int n; scanf("%d",&n); sum[0]=0; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum[i]=sum[i-1]+a[i]; } for(int i=1;i<=n;i++) scanf("%d",&sp[i]); memset(temp,0,sizeof(temp)); for(int i=1;i<=n;i++) q[i].s=q[i].t=i; ans[n]=0; LL TMAX=0; for(int i=n;i>=2;i--) { temp[sp[i]]=1; if(temp[sp[i]-1]) q[sp[i]].s=q[sp[i]-1].s; if(temp[sp[i]+1]) q[sp[i]].t=q[sp[i]+1].t; q[q[sp[i]].t].s=q[sp[i]].s; q[q[sp[i]].s].t=q[sp[i]].t; TMAX=max(TMAX,sum[q[sp[i]].t] - sum[q[sp[i]].s-1]); ans[i-1]=TMAX; // printf("%d %d\n",q[sp[i]].s,q[sp[i]].t); } for(int i=1;i<=n;i++) printf("%lld\n",ans[i]); return 0; }