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;
}
浙公网安备 33010602011771号