cogs2514 艺术

           艺术

              ★★   输入文件:art.in   输出文件:art.out   简单对比
                 时间限制:1 s   内存限制:256 MB

【题目描述】

Marvolo正看着刚刚入手的北京市地图,路痴的他表示一脸懵逼。刚刚开完会的两人如释负重,决定在帝都游玩一下放松心情,但是就去哪一直拿不定主意。”接下来去哪?”Marvolo问道。”不如去798吧,那里听说挺好玩的”,Mike满脸向往。”怎么,你也想去那里买一个仿真枪,然后在安检处被查水表吗?”Marvolo戏虐道。”假使这些完全无中生有的东西,你再说一遍,你等于..你也有责任吧……”Mike无语的说。

到达798的两人在广场上发现了N件艺术品,两人决定欣赏一番。每个艺术品都有其审美价值Pi。但是这些艺术品要被安排到新的地方,每隔一段时间就会有员工搬走其中剩余的一件艺术品。二人对此很无奈,他们决定每次欣赏的时候都要从剩余的艺术品中挑出连续一段艺术品来欣赏,获得的美感为这一段艺术品的审美价值之和。我们认为一个位置上的艺术品如果被搬走后,其审美价值为负无穷大。现在两人想知道,每次搬走一件艺术品后,他们能获得的美感最大是多少。

【输入格式】

第一行一个数N,表示有N个艺术品。

第二行有N个整数,表示每个艺术品的审美价值。

第三行有N个整数,表示每次搬走的艺术品编号。

【输出格式】

一共N行,表示每一次搬走后获得的美感最大值。

【样例输入】

4

1 3 2 5

3 4 1 2

【样例输出】

5

4

3

0

【提示】

搬走第三件艺术品后,剩余审美价值的序列为1,3,-∞,5。则获得美感最大为5。搬走第四见后,为1,3,-∞,-∞。最大美感为1+3=4。由此类推,在最后搬完所有艺术品后,可以选择不看,美感为0。

Solution:

  倒序并查集,每次去掉一个相当于到这来每次合并,用并查集维护一下就好,但我不会告诉你这题考试数据卡常卡到丧心病狂

  

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 #define N 100005
 7 char buf[N*30], *ptr=buf-1;
 8 inline int read(){
 9     register int x=0,f=1,c=*++ptr;
10     while (c<48) c=='-'&&(f=-1),c=*++ptr;
11     while (c>47) x=x*10+c-48,c=*++ptr;
12     return x * f;
13 }
14 bool dead[N];
15 int Fa[N],Time[N],n;
16 long long val[N],ans,Ans[N];
17 int find(int x) {return Fa[x]==x?x:Fa[x]=find(Fa[x]);}
18 int Main() {
19     freopen("art.in","r",stdin);
20     freopen("art.out","w",stdout);
21     fread(buf,1,sizeof(buf),stdin);
22     n=read();
23     for(int i=1; i<=n; ++i) Fa[i]=i,val[i]=read();
24     for(int i=1; i<=n; ++i) Time[i]=read();
25     Fa[0]=0,Fa[n+1]=n+1;
26     memset(dead,false,sizeof(dead));
27     for(int i=n; i; --i) {
28         Ans[++Ans[0]]=ans;
29         dead[Time[i]]=true;
30         ans=max(ans,val[Time[i]]);
31         int pre=find(Time[i]-1),nxt=find(Time[i]+1);
32         Time[i]=find(Time[i]);
33         if(dead[pre]) {
34             if(pre!=Time[i]) {
35                 Fa[pre]=Time[i];
36                 val[Time[i]]+=val[pre];
37                 ans=max(ans,val[Time[i]]);
38             }
39         }
40         if(dead[nxt]) {
41             if(nxt!=Time[i]) {
42                 Fa[nxt]=Time[i];
43                 val[Time[i]]+=val[nxt];
44                 ans=max(ans,val[Time[i]]);
45             }
46         }
47     } for(int i=n; i; --i) printf("%lld\n",Ans[i]);
48     return 0;
49 }
50 int hehe=Main();
51 int main(){;}

 

posted @ 2017-10-21 08:45  Forever_goodboy  阅读(128)  评论(0编辑  收藏  举报