【BZOJ 2054】 疯狂的馒头
来源:互联网 发布:中国移动暂停数据流量 编辑:程序博客网 时间:2024/06/11 05:10
2054: 疯狂的馒头
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 449 Solved: 175
[Submit][Status]
Description
Input
第一行四个正整数N,M,p,q
Output
一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0)。
Sample Input
4 3 2 4
Sample Output
2
2
3
0
2
3
0
HINT
并查集。
(一看这道题认为是简单的线段数打标记,但是数据范围显然不可以)
每个馒头的颜色取决于最后染他的是什么颜色,那么我们倒着来处理染色。
可是如何判断当前要染的区间是否在之前就被染过色了?
用并查集!!
f[i]表示i到f[i]-1这段区间已经被染过色了,那么我们把i染过色之后,f[i]=i+1。
处理一段区间,只要一直顺着f[i]染就可以了~
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#define M 10000000+5using namespace std;int f[M],n,m,p,q,c[M];int Getfather(int x){if (f[x]==x||!f[x])return f[x]=x;return f[x]=Getfather(f[x]);}int main(){scanf("%d%d%d%d",&n,&m,&p,&q);int tot=0; for (int i=m;i;i--){int l=((long long)i*p+q)%n+1,r=((long long)i*q+p)%n+1;if (l>r) swap(l,r);for (int k=Getfather(l);k<=r;k=Getfather(k)){c[k]=i;tot++;f[k]=k+1;}if (tot==n) break;}for (int i=1;i<=n;i++)printf("%d\n",c[i]);return 0;}
感悟:
1.RE是因为没有处理f[n]=n+1
2.并查集维护区间信息~
1 0
- 【BZOJ 2054】 疯狂的馒头
- bzoj 2054 疯狂的馒头
- bzoj 2054: 疯狂的馒头
- [BZOJ]2054: 疯狂的馒头
- BZOJ 2054 疯狂的馒头 并查集
- 【BZOJ 2054】疯狂的馒头 并查集
- bzoj 2054: 疯狂的馒头 并查集
- BZOJ 2054: 疯狂的馒头 并查集题解
- Codevs 2054疯狂的馒头
- bzoj2054: 疯狂的馒头
- BZOJ2054疯狂的馒头
- 【BZOJ2054】疯狂的馒头
- bzoj2054 疯狂的馒头
- BZOJ2054 疯狂的馒头
- bzoj2054 疯狂的馒头
- 【BZOJ2054】疯狂的馒头
- 【bzoj2054】疯狂的馒头
- 2054:疯狂的馒头/2375:疯狂的染色
- Android应用程序签名详解
- Android-Studio 缓存文件夹配置
- 1183 守形数
- 双列集合Map简介
- 企业应用架构学习一
- 【BZOJ 2054】 疯狂的馒头
- poj 3233 矩阵快速幂
- Windows核心编程--线程的切换
- 使A物体慢慢地看向一个B物体
- Facebook数据中心实践分析,OCP主要工作成果介绍
- 欢迎使用CSDN-markdown编辑器
- URAL 1001. Reverse Root
- nyoj.114 某种序列【大数问题】 2015/03/09
- 关于c++中的取模运算