Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集
4月的时候在luogu上做过 白雪皑皑 这道题,当时一遍AC可高兴了qwq,后来去了个厕所,路上忽然发现自己的做法是错的qwq。。。然后就咕咕了qwq
今天看到了 疯狂的馒头 ,发现一毛一样OvO。。。还是好好做一下吧QWQ
先上个错误代码(虽然BZOJ和Luogu都A了)
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#define R register int
#define getchar() *S++
using namespace std;
char RR[],*S=RR;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,p,q;
int vl[],pre[],nxt[];
signed main() {
fread(RR,sizeof(RR),,stdin);
n=g(),m=g(),p=g(),q=g();
for(R i=;i<=n;++i) pre[i]=i-,nxt[i]=i+;
for(R i=m;i>=;--i) {R l=(i*p+q)%n+,r=(i*q+p)%n+; if(l>r) swap(l,r);
if(!vl[l]) for(R j=l;j<=r;j=nxt[j]) vl[j]=i,nxt[pre[j]]=nxt[j],pre[nxt[j]]=pre[j];
if(!vl[r]) for(R j=r;j>=l;j=pre[j]) vl[j]=i,nxt[pre[j]]=nxt[j],pre[nxt[j]]=pre[j];
} for(R i=;i<=n;++i) printf("%d\n",vl[i]);
}
首先倒序处理显然吧。。。已经染过色的就不用再染了。。
但是这样判断显然是不对的:只判了左右端点不能确定中间有没有染色。。。问题是不能动态更新fa
刚刚本来想hack一下自己,结果发现不会造数据。。。。莫非这数据是有规律的导致我AC了???不知。。。懒得对拍了。。。如果大佬有想法可以评论,救救这只不知所对(不知所错)的蒟蒻、、qwq
好,扯完皮说正解:
用并查集当做链表(???)。。。还是倒序处理,如果这个区间已经染了,那么向右合并。注意每次读取fa时是要用getf来路径压缩,而不能直接取fa,否则不能更新
#include<cstdio>
#include<iostream>
#define R register int
using namespace std;
const int N=1E+,M=1E+;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,p,q,cnt;
int fa[N],a[N];
inline int getf(int x) {return x==fa[x]?x:fa[x]=getf(fa[x]);}
signed main() {
n=g(),m=g(),p=g(),q=g();
for(R i=;i<=n+;++i) fa[i]=i;
for(R i=m;i;--i) { R l=(i*p+q)%n+,r=(i*q+p)%n+;
if(l>r) swap(l,r);
for(R j=getf(l);j<=r;j=getf(j)) {a[j]=i,fa[j]=j+,++cnt; if(cnt==n) break;}
if(cnt==n) break;
} for(R i=;i<=n;++i) printf("%d\n",a[i]);
}
AC!=correct 2019.05.06
Luogu P2391 白雪皑皑 && BZOJ 2054: 疯狂的馒头 并查集的更多相关文章
- BZOJ.2054.疯狂的馒头(并查集)
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400 ...
- 【BZOJ 2054】 2054: 疯狂的馒头 (并查集特技)
Input 第一行四个正整数N,M,p,q Output 一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0). Sample Input 4 3 2 4 Sample Outp ...
- Bzoj P2054 疯狂的馒头 | 并查集
题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色 ...
- bzoj 2054: 疯狂的馒头(线段树||并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2054 线段树写法: 点的颜色只取决于最后一次染的颜色,所以我们可以倒着维护,如果当前区间之前 ...
- BZOJ2054 疯狂的馒头 并查集
题意:懒得写了有空再补上 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2054 离线从后往前做,并查集维护下一个没染色的就可以啦- #incl ...
- BZOJ 2054 疯狂的馒头
并查集把染过色的并在一起.倒着染色. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- [luogu P2391] 白雪皑皑
[luogu P2391] 白雪皑皑 题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖 ...
- BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化
LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...
- bzoj 2936 [Poi 1999] 降水 - 并查集
题目传送门 需要root权限的传送门 题目大意 有一个$n\times m$的网格图,每一格都有一个高度.一次降雨过后问最多能积多少水. 考虑算每一高度能储存的水的量. 如果小于等于这个高度的格子和边 ...
随机推荐
- 九省联考2018 D1T1 一双木棋
Alice和Bob轮流在n*m的棋盘上放棋子 a[i][j]表示Alice放在这的收益,b[i][j]表示Bob放在这的收益 一个地方没有棋子且它的左边上边都有棋子才能放棋子,边界外视为有一圈棋子 n ...
- 图的Tarjan算法
“Tarjan有三种算法 你们知道吗”——Tar乙己 void tarjan(int x) { low[x]=dfn[x]=++ind; q[++top]=x;mark[x]=; for(int i= ...
- XP系统下显示文件或文件的安全选项卡
在很多的时候,我们需要设置文件或文件夹的权限,这里一般就要用到安全选项卡,但在xp系统下,默认是不显示的,如何调出我们的“安全”选项卡呢? 具体做法:点击“工具”菜单下的"文件夹选项(o). ...
- [转]HTTP头的Expires与Cache-control
1.概念 Cache-control用于控制HTTP缓存(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache) 数据包中的格式: Cache-Control: cache- ...
- GrayCode for state machine
How & Why use Gray Code A gray counter is a binary counter where only one bit changes at a time. ...
- Centos6.5上的iptables
1.Centos6.5默认开启了iptables 当Centos6.5上安装了MySQL后,在远程连接它,如果出现10060的错误,说明iptables在起作用. 关闭iptables即可,sudo ...
- 对象流demo1----
对象流demo1: package com.etc.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStr ...
- python 字典 get 小例子
语法 get()方法语法: dict.get(key, default=None) 参数 key -- 字典中要查找的键. default -- 如果指定键的值不存在时,返回该默认值值. 返回值 返回 ...
- play的job执行方式
除了使用Quartz CRON trigger, 还可以写一个action来专门触发job,这样子就可以随时启动job的开始,而且还能并行其他的任务.较方便.
- [codeforces821E]Okabe and El Psy Kongroo
题意:(0,0)走到(k,0),每一部分有一条线段作为上界,求方案数. 解题关键:dp+矩阵快速幂,盗个图,注意ll 关于那条语句为什么不加也可以,因为我的矩阵C,就是因为多传了了len的原因,其他位 ...