bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054
线段树写法:
点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前被染过了,就不用再染了,对区间染色我们可以暴力在线段树上进行更新,并用线段树维护下那些区间已经被染色了,被染色的区间更新的时候直接跳过,这样可以节省很多时间。
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define mid int m = (l + r) >> 1
- const int M = 1e6 + ;
- int sum[M<<];
- void pushup(int rt){
- sum[rt] = sum[rt<<]&&sum[rt<<|];
- }
- void update(int L,int R,int c,int l,int r,int rt){
- if(sum[rt]) return ;
- if(l == r){
- sum[rt] = c;
- return ;
- }
- mid;
- if(L <= m) update(L,R,c,lson);
- if(R > m) update(L,R,c,rson);
- pushup(rt);
- }
- void ct(int l,int r,int rt){
- if(l == r){
- printf("%d\n",sum[rt]);
- return ;
- }
- mid;
- ct(lson); ct(rson);
- }
- int main()
- {
- int n,m,p,q;
- scanf("%d%d%d%d",&n,&m,&p,&q);
- for(int i = m;i >= ;i --){
- int x = ((i*p+q)%n)+;
- int y = ((i*q+p)%n)+;
- if(x > y) swap(x,y);
- update(x,y,i,,n,);
- }
- ct(,n,);
- }
并查集写法:
和线段树的思路一样,我们需要快速跳过已染色区间,这里用并查集维护已染色的区间,区间更新时可以利用并查集快跳过被染色的区间。
实现代码:
- #include<bits/stdc++.h>
- using namespace std;
- const int M = 1e6+;
- int ans[M],f[M];
- int Find(int x){
- if(x == f[x]) return x;
- return f[x] = Find(f[x]);
- }
- int main()
- {
- int n,m,p,q;
- scanf("%d%d%d%d",&n,&m,&p,&q);
- for(int i = ;i <= n+;i ++) f[i] = i;
- for(int i = m;i >= ;i --){
- int x = ((i*p+q)%n)+,y = ((i*q+p)%n)+;
- if(x > y) swap(x,y);
- for(int j = Find(x);j <= y;j = Find(j+)){
- f[j] = Find(j+); ans[j] = i;
- }
- }
- for(int i = ;i <= n;i ++)
- printf("%d\n",ans[i]);
- return ;
- }
bzoj 2054: 疯狂的馒头(线段树||并查集)的更多相关文章
- 【BZOJ 4662】 4662: Snow (线段树+并查集)
4662: Snow Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 136 Solved: 47 Description 2333年的某一天,临冬突 ...
- [WC2005]双面棋盘(线段树+并查集)
线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...
- 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)
2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...
- BZOJ.2054.疯狂的馒头(并查集)
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...
- bzoj2054疯狂的馒头——线段树
中文题面,一排有n个馒头,用刷子把整个连续的区间刷成一种颜色.因为颜色会覆盖掉之前的.所以我们可以用线段树来反着处理.如果这段区间之前刷到过就不要再遍历进去了,因为这次已经被上次刷的颜色给覆盖了.最后 ...
- Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集
4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq...然后就咕咕了qwq 今天看到了 疯狂的馒头 ,发现一毛一样OvO.. ...
- [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
- BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集
用并查集维护联通块. 用线段树的合并来合并联通块. 自己YY了一个写法. #include <map> #include <cmath> #include <queue& ...
- BZOJ 1453 (线段树+并查集)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...
随机推荐
- ubuntu 添加开机启动服务
新建umpserver.service [Unit] Description=UMPServer After=syslog.target network.target remote-fs.target ...
- Python云端系统开发入门 pycharm代码
html <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title& ...
- B-Tree 和 B+Tree
B-Tree和B+Tree 本文来自 Hubery_James 的CSDN 博客 ,全文地址请点击:原文地址-干货满满 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索 ...
- js基础语法之函数
普通函数 function foo(a, b){ return a + b; } foo(10, 20) >>> 30 匿名函数 var f = function(){console ...
- Java ME Technology - CDC(Connected Device Configuration)
Java ME Technology - CDChttps://www.oracle.com/technetwork/java/javame/tech/index-jsp-139293.html Ne ...
- 三、如何设置npm镜像
一.临时使用 npm --registry https://registry.npm.taobao.org install express 二.永久使用 npm config set registry ...
- react render
实际上react render方法返回一个虚拟dom 并没有去执行渲染dom 渲染的过程是交给react 去完成的 这就说明了为什么要在所有数据请求完成后才去实现render 这样做也提高了性能.只调 ...
- h5简易手写板
............. 我该说点什么呢,开头居然不知道想说点什么!好吧不知道说什么,我们就来说说这个手写板吧,虽然这个手写板现在没什么用,但是.....,好像的确没什么用啊! 只是存粹哪里练手的的 ...
- spring 给一个类 生成test
右击一个类,然后:GoTo==>test ,就可以新建这个类的测试用例了,简单粗暴, 如果想要不污染数据库,就在一个测试用例 的标签@Test 下面在加上@RollBack 这样: @Test ...
- vue & iview
vue & iview ui components https://codepen.io/webgeeker/pen/EJmQxQ https://www.iviewui.com/docs/g ...