CodeForces722C Destroying Array【瞎搞】

题意:
先给你一个序列,然后给你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
",q[sp[i]].s,q[sp[i]].t);
    }
    for(int i=1;i<=n;i++)
        printf("%lld
",ans[i]);
    return 0;
}


原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777515.html