Destroying Array CodeForces

来源:互联网 发布:最近网络疯传的名校 编辑:程序博客网 时间:2024/05/31 19:13

点击打开链接

逆序考虑 这样问题就转换为每插入一个数 查询当前所有连续区间的最大值

插入时看左右是否有相邻的其他区间 有就合并

#include <bits/stdc++.h>using namespace std;#define ll long longll num[100010],sum[100010],ans[100010];int pre[100010],f[100010];int n;int getf(int p){    if(f[p]==p) return p;    else    {        f[p]=getf(f[p]);        return f[p];    }}int main(){    ll maxx;    int i,p,fp;    while(scanf("%d",&n)!=EOF)    {        for(i=1;i<=n;i++)        {            scanf("%lld",&num[i]);        }        for(i=1;i<=n;i++)        {            scanf("%d",&pre[i]);        }        memset(f,-1,sizeof(f));        memset(sum,0,sizeof(sum));        maxx=0;        for(i=n;i>=2;i--)        {            p=pre[i];            f[p]=p;            sum[p]=num[p];            if(f[p-1]!=-1)            {                fp=getf(p-1);                f[fp]=p;                sum[p]+=sum[fp];            }            if(f[p+1]!=-1)            {                fp=getf(p+1);                f[fp]=p;                sum[p]+=sum[fp];            }            maxx=max(maxx,sum[p]);            ans[i]=maxx;        }        for(i=2;i<=n;i++)        {            printf("%lld\n",ans[i]);        }        printf("0\n");    }    return 0;}