并查集,以前只会用来做模板题以及实现最小生成树。所以做题时从来没有考虑过用并查集优化什么的。通过这次比赛,学到了。
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long ll;
ll n;
ll a[maxn];
ll d[maxn];
ll f[maxn];
ll v[maxn];
ll s[maxn];
ll fa(ll x)
{
return f[x]==x?x:f[x]=fa(f[x]);
}
int main()
{
scanf("%I64d",&n);
for(ll i=1;i<=n;i++)
{
scanf("%I64d",a+i);
f[i]=i;
}
for(ll i=1;i<=n;i++) scanf("%I64d",d+i);
ll MAX=0;
stack<ll>S;
for(ll i=n;i>=1;i--)
{
S.push(MAX);
ll now=d[i];
ll val=a[now];
ll ans=0;
v[now]=true;
if(v[now+1]&&v[now-1])
{
ll fn=fa(now-1);
ll fp=fa(now+1);
ans=val+s[fn]+s[fp];
f[fn]=now;
f[fp]=now;
}
else if(!v[now+1]&&v[now-1])
{
ll fn=fa(now-1);
ans=val+s[fn];
f[fn]=now;
}
else if(v[now+1]&&!v[now-1])
{
ll fp=fa(now+1);
ans=val+s[fp];
f[fp]=now;
}
else ans=val;
s[now]=ans;
MAX=max(MAX,ans);
}
while(!S.empty())
{
printf("%I64d\n",S.top());
S.pop();
}
return 0;
}