毁灭序列

发布时间: 2017年7月4日 20:58   最后更新: 2017年7月6日 22:23   时间限制: 1000ms   内存限制: 512M

描述

给出一个n(1≤n≤2×105)个非负整数a1,a2,...,an的序列,你要按一定顺序毁灭序列的中的数,在每次毁灭一个数后,输出不包括已毁灭元素的子段的最大字段和(空子段的字段和视为0)

输入

第一行输入一个整数n为序列的长度

第二行输入n个数a1,a2,...,an(0≤ai≤109)

第三行输入一个1到n的整数的排列,为毁灭元素的顺序

输出

输出n行,每一行包含一个整数,意义见题目描述

样例输入1 复制

4
1 3 2 5
3 4 1 2

样例输出1

5
4
3
0

样例输入2 复制

5
1 2 3 4 5
4 2 3 5 1

样例输出2

6
5
5
1
0

样例输入3 复制

8
5 5 4 4 6 6 5 5
5 2 8 7 1 3 4 6

样例输出3

18
16
11
8
8
6
6
0

提示

第一个样例中:

第一次毁灭第三个元素,数组为`1 3 * 5`,最大字段和为5

第二次毁灭第四个元素,数组为`1 3 * *`,最大子段和为4

第三次毁灭第一个元素,数组为`* 3 * *`,最大子段和为3

第四次毁灭第二个元素,最大子段和为0

题解:

这道题目正向处理并不好处理,而反着想却非常简单。

这里用到的知识是倒跑并查集,我们把操作逆向处理,删除一个元素的逆操作就是增加一个元素,当这个元素增加到这个序列里面的时候,只有可能影响到它两边的字段,因此,我们将这个元素加入序列时候,把两边字段并入到刚加入的元素中,形成一个新的字段,这个字段的和就是两侧字段和加该元素的值。并用这个新的字段和和max_ans做更新,然后得到此次操作的答案。

字段做并操作就是并查集的合并。

这样的话,把得到的答案逆序输出就可以了。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 2e5+8;
int n;
int a[MAX];
int stack[MAX];
long long out_stk[MAX];
int pt_sp;
int sp = 0;
int parent[MAX];
long long vis[MAX];
int find(int x){while(x != parent[x]) x = parent[x];return x;
}
void init(){for(int i = 0;i < MAX;i++){parent[i] = i;}
}
int main(){while(~scanf("%d",&n)){memset(vis,0,sizeof(vis));init();sp = 0;for(int i = 0;i < n;i++){scanf("%d",&a[i]);}for(int i = 0;i < n;i++){scanf("%d",&stack[sp++]);} pt_sp = 0;long long max_ans = 0;while(sp--){out_stk[pt_sp++] = max_ans;int pos = stack[sp]-1;vis[pos] += a[pos];if(pos > 0 && vis[pos-1]){int p = find(pos-1);vis[pos] += vis[p];parent[p] = pos;}if(pos < n-1 && vis[pos+1]){int p = find(pos+1);vis[pos] += vis[p];parent[p] = pos;}max_ans = max(max_ans,vis[pos]);}while(pt_sp--){printf("%lld\n",out_stk[pt_sp]);}}return 0;
}

2017西安交大ACM小学期 毁灭序列[倒跑并查集]相关推荐

  1. 2017西安交大ACM小学期 敏感词汇[AC自动机]

    敏感词汇 发布时间: 2017年7月5日 00:23   最后更新: 2017年7月6日 14:40   时间限制: 1500ms   内存限制: 128M 描述 我们知道,在进行聊天时,有些词汇是敏 ...

  2. 2017西安交大ACM小学期 美妙音乐[差分KMP匹配]

    美妙音乐 发布时间: 2017年7月3日 13:14   最后更新: 2017年7月5日 13:47   时间限制: 500ms   内存限制: 128M 描述 一段音乐是由若干个音符组成的,音乐中的 ...

  3. 2017西安交大ACM小学期 选择困难症[折半枚举+二分查找]

    选择困难症 发布时间: 2017年7月4日 12:44   最后更新: 2017年7月4日 12:45   时间限制: 5000ms   内存限制: 128M 描述 GG有严重的选择困难症. 早上起床 ...

  4. 2017西安交大ACM小学期 刷墙[折半枚举+异或]

    刷墙 发布时间: 2017年7月3日 12:17   最后更新: 2017年7月6日 22:29   时间限制: 3000ms   内存限制: 128M 描述 小明有一面黑白混搭的墙,他想给把墙重新粉 ...

  5. 2017西安交大ACM小学期数论 [更新学号]

    发布时间: 2017年6月24日 20:27   最后更新: 2017年7月3日 09:27   时间限制: 3000ms   内存限制: 128M 描述 某知名高校有n个学生,每个学生有一个唯一ID ...

  6. 2017西安交大ACM小学期数论 [水题]

    水题 发布时间: 2017年6月25日 14:06   最后更新: 2017年7月3日 09:27   时间限制: 1000ms   内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂 ...

  7. 2017西安交大ACM小学期数据结构 [树状数组 离散化]

    Problem E 发布时间: 2017年6月28日 12:53   最后更新: 2017年6月29日 21:35   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为n的序列a ...

  8. 2017西安交大ACM小学期数据结构 [树状数组,极大值]

    Problem D 发布时间: 2017年6月28日 10:51   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  9. 2017西安交大ACM小学期数据结构 [树状数组]

    Problem C 发布时间: 2017年6月28日 11:38   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

最新文章

  1. Java 垃圾回收机制,13张图给你讲清楚!
  2. jquery ajax下拉联动,jQuery Ajax MVC 下拉框联动
  3. 删除trigger 禁用触发器 启用触发器 查看触发器
  4. Linux 及其它类 Unix 系统的系统服务管理和控制程序(初始化系统/init system)简单梳理
  5. spring mvc学习(22):/textpath/*/helen
  6. Reservoir Sampling 蓄水池采样算法
  7. mysql 日期循环_如何在mysql存储过程中循环日期时间
  8. PyTorch中为什么需要使用squeeze()和unsqueeze()操作?
  9. Android通话记录CallLog简单摘要
  10. MongoDB 学习笔记之 手动预先分片
  11. 把lighttpd配置为系统服务
  12. 一份平面设计指南分享给大家
  13. 数据读取入门——xlsread
  14. html英文期刊参考文献,英文参考文献标准格式
  15. 运维(20) 制作启动U盘安装Win10
  16. 共享的计算机用户账户限制,win10系统使用共享功能被提示用户账户限制的方案...
  17. 循环优化与多面体模型
  18. 计算机考研855专业课,人大计算机855考研经验分享
  19. word 文本框插入图片
  20. 数据中心趋势:提高功率密度

热门文章

  1. 嵌入式linux pcie网卡配置,嵌入式Linux下PCIE数据采集卡驱动开发
  2. linux java升级版本_为嵌入式Linux设备实现更新/升级系统
  3. 深圳店匠笔试题-4.01
  4. mysql id 字段类型转换_mysql 数据类型转换
  5. [Spring5]IOC容器_底层原理
  6. 折半搜索+洛谷 P2962 [USACO09NOV]Lights G
  7. 反转字符串中的单词 III leetcode
  8. Sequence II (HDU 5919)(主席树)
  9. P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)
  10. P4827 [国家集训队] Crash 的文明世界