[BZOJ 2054]疯狂的馒头
这题一看是区间染色,直接上线段树。数据范围N<= 106,M <= 107,如果跑线段树复杂度为O(MlogN),但是时间限制10s,所以复杂度能过。
具体操作就是倒着算区间,因为每个馒头最后的颜色是最后一次染上的颜色,如果我们倒着染色,那么被染色过的点就是最后的颜色,之后再染这个点就没用了。所以直接上代码:
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define N 1000100 #define ls (x << 1) #define rs (x << 1 | 1) #define mid ((l + r) >> 1) using namespace std; int tree[4 * N]; void push_up(int x) {tree[x] = tree[ls] && tree[rs];//除了叶子节点之外的点只需要保存是否染过色就行return; } void modify(int x,int nl,int nr,int l,int r,int k) {if(tree[x]) return;if(l == r) {tree[x] = k;//叶子节点直接保存颜色return;}if(nl <= mid) modify(ls,nl,nr,l,mid,k);if(nr > mid) modify(rs,nl,nr,mid + 1,r,k);push_up(x);return; } void print(int x,int l,int r) {if(l == r) {printf("%d\n",tree[x]);//输出叶子节点return;}print(ls,l,mid);print(rs,mid + 1,r); } int p,q,n,m; int main() {scanf("%d %d %d %d",&n,&m,&p,&q);for(int i = m;i >= 1;i--){int l = (int)((long long)(i * p + q) % n + 1ll);//这里强制类型转换防止在做乘法的时候爆intint r = (int)((long long)(i * q + p) % n + 1ll);if(l > r) swap(l,r);modify(1,l,r,1,n,i);}print(1,1,n); }
转载于:https://www.cnblogs.com/lijilai-oi/p/10945070.html
[BZOJ 2054]疯狂的馒头相关推荐
- [BZOJ 2054]疯狂的馒头(并查集)
Description CQF十分喜欢吃馒头.兴奋之下他一下子买了N 个馒头请所有认识他的人吃. 但是CQF不喜欢白色,喜欢红色.黄色.绿色等鲜艳的颜色.于是他把所有白色的馒头排成一列.然后进行M 次 ...
- bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...
- Bzoj 2054: 疯狂的馒头
题目 我们先想一想暴力模拟,算出l,r,染色,最后输出,很明显会超时.想一下每个点的最终颜色仅与它最后一次被染色的情况决定,这就是NOIP2011D1T1铺地毯复杂版. 我们可以用倒序将并查集将从左向 ...
- [BZOJ] 2054 疯狂的馒头
只有最后一次染色有效,时光倒流,用并查集保证每个点只被染一次,染够n次及时退出,复杂度O(n) #include<iostream> #include<cstdio>using ...
- BZOJ 2054 疯狂的馒头
[Description] n个点,m次操作,每次把(i*p+q)%n+1与(i*q+p)%n+1之间的点染上颜色i,被染过色的会被新颜色覆盖,求最后每个点的颜色. [题解] 因为被染过的颜色会被新的 ...
- Codevs 2054疯狂的馒头
AC通道: http://www.lydsy.com/JudgeOnline/problem.php?id=2054 [分析] 对于任何一个馒头,只有最后一次刷才有意义.无论之前刷过多少次,它的颜色都 ...
- Bzoj P2054 疯狂的馒头 | 并查集
题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色 ...
- 2054:疯狂的馒头/2375:疯狂的染色
题目链接 题目大意:给定染色的顺序,每次染一个区间,每次染色会覆盖之前颜色,输出m次涂色后的每个点的颜色 题解:只有最后一次有用,所以倒着做 用f[i]=x来表示i到x-1这段区间已经被染过色了.当染 ...
- 【BZOJ 2054】 疯狂的馒头
2054: 疯狂的馒头 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 449 Solved: 175 [ Submit][ Status] D ...
最新文章
- 调整Win7资源管理器中导航栏和计算机的位置
- 64匹马8个跑道需要多少轮才能挑选出最快的4匹马?
- VTK:vtkBalloonWidget用法实战
- 浅析php中的stdClass
- Fluent NHibernate之旅
- scrapy mysql测试连接_scrapy连接MySQL
- 图解 Go 切片的深拷贝和浅拷贝
- Win7 连接局域网共享之后 提示错误代码:0x800704b3(实测可用)
- 计算机应用基础 东师 离线,奥鹏东师秋季计算机应用基础离线作业答案
- 搭建一个自己的文件上传服务器。
- Java解压Zip 压缩包
- Win10搭建gym运行atari游戏pong
- 新浪微博相册图片外链限制,图床不显示解决方法总结!
- React的箭头函数详解
- python生成测试数据_Python基于Hypothesis测试库生成测试数据
- J2EE工作流管理系统jBPM详解(二)
- 突发!又一MCU大厂暂停接单!
- 帮转|腾讯云市场新版上线:大不同
- 中科大科学岛计算机复试,2020年中国科学技术大学研究生院科学岛分院复试办法及复试内容...
- 企业网络营销中需要避免的九大忌