CodeForces722C Destroying Array【瞎搞】

来源:互联网 发布:金岩财富 知乎 编辑:程序博客网 时间:2024/05/16 00:48
题意:
先给你一个序列,然后给你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;}


0 0