我本题的思路是反过来考虑,即应该从全部销毁的状态,一个一个的恢复这些数字。这样可以用并查集的思想解决问题,不至于导致Time Limit Exceeded。
ac代码:
#include <bits/stdc++.h>
#define FOR(I,A,B) for(int I = (A); I < (B); I++)
#define FORE(I,A,B) for(int I = (A); I <= (B); I++)
#define PRII pair<int,int>
#define ll long long
#define INF 1000000001
using namespace std;
int n;
ll a[100005];
int b[100005],bcj[100005];
ll res[100005];
PRII lr[100005];
int main()
{
cin>>n;
FORE(i,1,n){
scanf("%d",&a[i]);
a[i]+=a[i-1];
}
FORE(i,1,n) scanf("%d",&b[i]);
ll mx=0;
for(int i=n;i>=1;i--){
res[i]=mx;
int l=b[i]-1;
int r=b[i]+1;
bcj[b[i]]=b[i];
if(bcj[l]){
bcj[b[i]]=bcj[l];
l=lr[bcj[l]].first;
}
if(bcj[r]){
r=lr[bcj[r]].second;
bcj[r-1]=bcj[b[i]];
}
lr[bcj[b[i]]].first=l;
lr[bcj[b[i]]].second=r;
ll sum=a[r-1]-a[l];
if(sum>mx) mx=sum;
}
FORE(i,1,n) printf("%lld\n",res[i]);
return 0;
}