链接: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: 疯狂的馒头(线段树||并查集)的更多相关文章

  1. 【BZOJ 4662】 4662: Snow (线段树+并查集)

    4662: Snow Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 136  Solved: 47 Description 2333年的某一天,临冬突 ...

  2. [WC2005]双面棋盘(线段树+并查集)

    线段树+并查集维护连通性. 好像 \(700ms\) 的时限把我的常数超级大的做法卡掉了, 必须要开 \(O_2\) 才行. 对于线段树的每一个结点都开左边的并查集,右边的并查集,然后合并. \(Co ...

  3. 2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集)

    2022.02.27 CF811E Vladik and Entertaining Flags(线段树+并查集) https://www.luogu.com.cn/problem/CF811E Ste ...

  4. BZOJ.2054.疯狂的馒头(并查集)

    BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...

  5. bzoj2054疯狂的馒头——线段树

    中文题面,一排有n个馒头,用刷子把整个连续的区间刷成一种颜色.因为颜色会覆盖掉之前的.所以我们可以用线段树来反着处理.如果这段区间之前刷到过就不要再遍历进去了,因为这次已经被上次刷的颜色给覆盖了.最后 ...

  6. Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集

    4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq...然后就咕咕了qwq 今天看到了 疯狂的馒头 ,发现一毛一样OvO.. ...

  7. [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)

    [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...

  8. BZOJ 2733 [HNOI2012]永无乡 ——线段树 并查集

    用并查集维护联通块. 用线段树的合并来合并联通块. 自己YY了一个写法. #include <map> #include <cmath> #include <queue& ...

  9. BZOJ 1453 (线段树+并查集)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1453 题意:一个 n*n 的矩阵,每个位置有黑/白两种颜色,有 m 次操作,每次可以翻转 ...

随机推荐

  1. 二十:让行内元素在div中垂直居中

    (1)使用display:table-cell配合vertical-align:center(淘宝也是这样用的) <div class="method4"> <s ...

  2. 使用insert ignore来避免向数据库重复插入数据

    mysql中 insert ignore 的使用示例如下: INSERT IGNORE INTO `table_name` (`reportid`, `content`) VALUES (‘11111 ...

  3. H5 字符实体

    41-字符实体 (greater than) © 版权符号 --> 我   爱你 到此为止我们的HTML的基础标签就学习完毕了, 例如我们学习了<h1>标签, <table&g ...

  4. Selenium库

    '''自动化测试工具,支持多种浏览器.爬虫中主要用来解决JavaScrip渲染的问题.''''''基本使用'''from selenium import webdriverfrom selenium. ...

  5. applicationContext.xml 模板

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. Survey项目总结

    1.Ioc深入理解 Inverse of control org.springframework.scheduling.quartz.SchedulerFactoryBean org.mybatis. ...

  7. P124黎曼可积性刻画 的两个备注

    1.这里为什么是开集?   2.请问为什么说了是开集马上就说是有界可测函数? 开集为可测集

  8. 使用npm安装一些包失败了,更换npm源

    镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...

  9. 为什么js中要用void 0 代替undefined

    这个是Backbone.js中的一句源码 if (callback !== void 0 && 'context' in opts && opts.context == ...

  10. 6s ios9.0平台 微信小程序的fixed定位兼容性问题

    如果不设置top和left的话  就会出现不显示问题