博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 722C(并查集 + 思维)
阅读量:5324 次
发布时间:2019-06-14

本文共 1386 字,大约阅读时间需要 4 分钟。

本文链接:

题目链接:

思路:

  题目给的操作数从第 1 个到第 N 个数是删除原数组中的一个数, 那么反过来从后往前就是增加原数组中的一个数, 每增加一个值, 那么就有四种情况: 第一种和前后都不连续, 即自成一个集合; 第二种:和前面的数连续, 即和前一个数在一个集合; 第三种和之后一个数连续, 即和之后的一个数在一个集合; 第四种既和前面一个数连续也和后面一个数连续,那么说明前后两个集合被这个数合并成一个集合. 然后合并的时候维护每个集合的元素和 sum, 利用 max 记录当前集合 sum 和新增集合的 sum 中的最大值.

代码:

1 #include 
2 3 typedef long long LL; 4 const int MAXN = 100000; 5 using namespace std; 6 LL pre[MAXN + 3], cnt[MAXN + 3], a[MAXN + 3], pos[MAXN + 3], visit[MAXN + 3], ans[MAXN + 3]; 7 8 int Find(int x) { return x == pre[x] ? x : pre[x] = Find(pre[x]); } 9 10 void mix(int x, int y) {11 int fx = Find(x), fy = Find(y);12 if(fx != fy) pre[fy] = fx, cnt[fx] += cnt[fy]; //合并两个集合的同时维护新集合的 sum13 }14 15 int main() {16 ios_base::sync_with_stdio(0); cin.tie();17 int n; cin >> n;18 for(int i = 1; i <= n; i++) {19 cin >> a[i];20 pre[i] = i, visit[i] = 0;21 }22 for(int i = 0; i < n; i++) cin >> pos[i];23 LL maxn = 0;24 for(int i = n - 1; i >= 0; i--) {25 int tp = pos[i];26 cnt[tp] = a[tp], visit[tp] = 1, ans[i] = maxn;27 if(tp != 1 && visit[tp - 1]) mix(tp, tp - 1); // 新增一个元素后形成的四种情况28 if(tp != n && visit[tp + 1]) mix(tp, tp + 1);29 maxn = max(maxn, cnt[ Find(tp) ]);30 }31 for(int i = 0; i < n; i++) cout << ans[i] << endl;32 return 0;33 }

 

转载于:https://www.cnblogs.com/Ash-ly/p/5932712.html

你可能感兴趣的文章
Tile的更新
查看>>
在同一个页面设置两个选项卡菜单 滑动式导航
查看>>
Mybatis: 无效的列类型:1111错误
查看>>
DataGridView隔行显示不同的颜色
查看>>
封装数据库配置文件App配置文件
查看>>
python 执行shell命令
查看>>
Mybatis的mapper文件中$和#的区别
查看>>
Find the total area covered by two rectilinear rectangles in a 2D plane. 208MM
查看>>
C#学习笔记-观察者模式
查看>>
常用原生JS兼容性写法汇总
查看>>
微信公众号网页开发——阻止微信客户端内点击任何图片自动放大
查看>>
hadoop2.6.0实践:004 启动伪分布式hadoop的进程
查看>>
12 生成器和生成器表达式
查看>>
bzoj2424: [HAOI2010]订货
查看>>
go语言reflect实验
查看>>
再谈AutoResetEvent和ManualResetEvent 之详细解说
查看>>
sql server日期与时间函数
查看>>
leetcode Minimum Depth of Binary Tree python
查看>>
IOS开发--动画篇-->计时定时器
查看>>
二月主题读书整理——元技能系列
查看>>