| 记录编号 |
462038 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
2514.艺术 |
最终得分 |
100 |
| 用户昵称 |
BaDBoY |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
0.158 s |
| 提交时间 |
2017-10-21 08:25:58 |
内存使用 |
1.67 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100005
char buf[N*30], *ptr=buf-1;
inline int read(){
register int x=0,f=1,c=*++ptr;
while (c<48) c=='-'&&(f=-1),c=*++ptr;
while (c>47) x=x*10+c-48,c=*++ptr;
return x * f;
}
bool dead[N];
int Fa[N],Time[N],n;
long long val[N],ans,Ans[N];
int find(int x) {return Fa[x]==x?x:Fa[x]=find(Fa[x]);}
int Main() {
freopen("art.in","r",stdin);
freopen("art.out","w",stdout);
fread(buf,1,sizeof(buf),stdin);
n=read();
for(int i=1; i<=n; ++i) Fa[i]=i,val[i]=read();
for(int i=1; i<=n; ++i) Time[i]=read();
Fa[0]=0,Fa[n+1]=n+1;
memset(dead,false,sizeof(dead));
for(int i=n; i; --i) {
Ans[++Ans[0]]=ans;
dead[Time[i]]=true;
ans=max(ans,val[Time[i]]);
int pre=find(Time[i]-1),nxt=find(Time[i]+1);
Time[i]=find(Time[i]);
if(dead[pre]) {
if(pre!=Time[i]) {
Fa[pre]=Time[i];
val[Time[i]]+=val[pre];
ans=max(ans,val[Time[i]]);
}
}
if(dead[nxt]) {
if(nxt!=Time[i]) {
Fa[nxt]=Time[i];
val[Time[i]]+=val[nxt];
ans=max(ans,val[Time[i]]);
}
}
} for(int i=n; i; --i) printf("%lld\n",Ans[i]);
return 0;
}
int hehe=Main();
int main(){;}