Input 第一行四个正整数N,M,p,q Output 一共输出N行,第i行表示第i个馒头的最终颜色(如果最终颜色是白色就输出0). Sample Input 4 3 2 4 Sample Output 2 2 3 0 HINT       [分析] 想要不带log,就从后往前做,每个点只染色一次,用神奇的并查集维护即可.   #include<cstdio> #include<cstdlib> #include<cstring> #include<iostre…
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…
BZOJ 倒序处理,就是并查集傻题了.. 并查集就是确定下一个未染色位置的,直接跳到那个位置染.然而我越想越麻烦=-= 以为有线性的做法,发现还是要并查集.. 数据随机线段树也能过去. //18400kb 2520ms #include <cstdio> #include <algorithm> typedef long long LL; const int N=1e6+5; int fa[N],col[N]; char OUT[N*10],*O=OUT; inline int F…
题目链接 思路:因为每次染色都会将某些馒头的颜色彻底更改,所以每个馒头的最终的颜色其实是由最后一次染色决定的,那么我们只考虑最后一次染色即可.对此,我们可以从后往前倒着染色,当目前的染色区间中存在白色馒头时,就将其染成当前的颜色,对于已经染过色的馒头则不处理,因为当前这一次染色已经不是其最后一次染色了,其最终颜色已经确定了. 对以上思路,考虑用经过路径压缩优化的并查集来维护在每个馒头右侧的.距离最近的.未染色的馒头的位置,以减小时间复杂度. 总时间复杂度O(m+n). 代码: #include<…
题意:懒得写了有空再补上 链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2054 离线从后往前做,并查集维护下一个没染色的就可以啦- #include<bits/stdc++.h> using namespace std; ; long long n, m, p, q; int fa[MAXN], color[MAXN]; template <typename tn> void read (tn & a) { tn x…
传送门 BZOJ 4569 题解 ST表和并查集是我认为最优雅(其实是最好写--)的两个数据结构. 然鹅!他俩加一起的这道题,我却--没有做出来-- 咳咳. 正解是这样的: 类似ST表有\(\log n\)层一样,我们开\(\log n\)个并查集.当已知\([l_1, r_1]\)和\([l_2, r_2]\)相同的时候,设\(j = \lfloor \log (r_1 - l_1 + 1) \rfloor\),把\(l_1, l_2\)在\(j\)这层的并查集中合并,把\(r_1 - 2^j…
[BZOJ 4668]冷战(并查集+启发式合并) 题面 一开始有n个点,动态加边,同时查询u,v最早什么时候联通.强制在线 分析 用并查集维护连通性,每个点x还要另外记录tim[x],表示x什么时间与父亲相连.查询u,v的时候显然可以看出,答案就是u到v路径上的点tim的最大值.所以像求lca一样暴力向上跳就可以了.然后按秩合并,树高是\(O(\log n)\)的,所以每次查询是\(O(\log n)\)的 代码 #include<iostream> #include<cstdio>…
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们反正想,那么题目就变成每次添加一个点(其实就是添加若干条边)之后连通块个数.这就可以使用并查集了.. vector<int> g[N];int n,m,Q,a[N],s[N],sz[N],h[N],ans[N]; int find(int x){    if(s[x]!=x) s[x]=find(…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2959 [题意] n个点,提供操作:连边,修改点权,查询自定义边的方向后起点a终点b能经过的最大点权和. [思路] 对于一个边的双连通分量,显然可以将权值全部获得. 如果没有连边操作,我们只需要将一个bcc缩点后求得a->b路径上的点权和即可. 加上连边后,使用并查集代表一个bcc,如果u,v之间不连通直接连边,如果已经连通则构成一个bcc,使用并查集将LCT的所有节点合并. 注意缩点…
每一连通块砸开一个就可以拿到所有的钱, 所以用并查集求连通块数 ------------------------------------------------------------------- #include<bits/stdc++.h>    #define rep(i, n) for(int i = 0; i < n; i++) #define clr(x, c) memset(x, c, sizeof(x))   using namespace std;   const i…
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆向思维,先处理出所有操作完成后的最终图,题目中破坏点的操作对于这个图来说就变成了加点扔到并查集的操作了,题目说的图一开始的联通块个数其实就是最终的图加上k个点后联通块的数量,第k个点被删后的图就是一开始处理得到的最终图, 实现代码: #include<bits/stdc++.h> using na…
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 思路: 先将每条边的权值排个序优先小的,然后从小到大枚举每一条边,将其存到并查集里,如果得到的比值比之前的小,那么判断下s与t能否连通,如果连通就替换就好了 实现代码: #include<bits/stdc++.h> using namespace std; ; int f[M],vis[M],a[M]; int n,m; int Find(int x){ if(x==f[x…
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节点1,隐士则住在号节点N.小E需要通过这一片魔法森林,才能够拜访到隐士. 魔法森林中居住了一些妖怪.每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击.幸运的是,在号节点住着两种守护精灵:A型守护精灵与B型守护精灵.小E可以借助它们的力量,达到自己的目的. 只要小E带上足够多的守护精灵,妖怪们…
要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j-1)=1.由这些方程可以推出对于每个方格: 如果i,j都是偶数,则有a(i,j)^a(1,1)^a(i,1)^a(1,j)=1. 否则,a(i,j)^a(1,1)^a(i,1)^a(1,j)=0.枚举a(1,1)的染色情况.可以由a(i,j)的染色情况推出a(i,1)和a(1,j)是否颜色相同或者…
此题的二分图匹配做法很容易想,就是把属性当做s集,武器当做t集,如果该武器拥有该武器则连一条边. 那么答案就是求该二分图的最大前i个匹配.将匈牙利算法改一改,当前找不到增广路就break. 但是过这个题需要常数优化,不能每次都fillchar一遍used数组.可以用队列将使用的used点加入,然后需要初始化的时候弹出即可. # include <cstdio> # include <cstring> # include <cstdlib> # include <i…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4025 [题目大意] 给出一张图,有些边只存在一段时间,问在一个每个时间段, 这张图是否是二分图 [题解] 判断是否是二分图只要判断是否存在奇环即可, 我们对时间进行分治,在操作树上加删边, 保留涵盖时间区间的有效操作,将剩余操作按时间划分到两端的子树, 退出子树的时候撤销加边操作. 对于判断奇环,我们用并查集维护每个点与标兵的相对距离的奇偶性即可, 由于需要撤销操作,我们放弃对并查集…
题目大意:给定一些点之间的位置关系,求两个点之间的曼哈顿距离 此题土豪题.只是POJ也有一道相同的题,能够刷一下 别被题目坑到了,这题不强制在线.把询问离线处理就可以 然后就是带权并查集的问题了.. . 将权值设为方向向量,重载+和-,依照正常权值并查集做即可了 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 40400 using nam…
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2333 ..题意概述就不写了,各位老爷如果是看着玩的可以去搜一下,如果是做题找来的也知道题干的.实际上是题干无法缩减懒得复制ORZ 首先处理一下集合的合并和单点值查询的问题.使用并查集,记录两个数组w,d:w记录对这个点单点操作的值,d记录对这个点代表的集合进行的操作累计的值,对于每个点find的时候把这个点到代表元路径上的点的d(不包括代表元)的d加起来更新这个点的d,每一次查询某个点的…
题目可以表述成:给定一个无向图G,每次删除它的一个点和与点相关的边集,每次询问该操作后图G的连通度(连通分量的个数).和上一题一样都是考察逆向思维,虽然删除点的做法不会,但是每次加点后询问连通度却是并查集的经典用法,所以答案可以逆过来推,具体做的时候每次加入一个点,将所有和这个点有边相连的点集合并,然后输出当前有多少个集合.细节部分需要注意的是由于点的数量十分庞大,邻接表是十分有必要的 #include<iostream> #include<cstdio> #include <…
看起来像是并查集,但是是拆集合,考虑时间倒流,先把标记都打上,然后把并查集做出来 每次到一个修改点就把这个点的计数s[u]--,当这个s为0时就把这个点和他的父亲合并(因为可能有多次标记) #include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,q,h[N],cnt,s[N],a[N],f[N],fa[N],ans[N],tot; char c[N][5]; struct…
等于有传递性,所以hash一下把等于用并查集连起来,然后再判断不等于是否合法即可 #include<iostream> #include<cstdio> #include<algorithm> #include<map> using namespace std; const int N=200005; int T,n,x,y,v,f[N],g[N],tot,has; bool fl; map<int,int>mp; struct qwe { in…
画图可知,每一行的状态转移到下一行只有两种:奇数列不变,偶数列^1:偶数列不变,奇数列^1 所以同一行相邻的变革染色格子要放到同一个并查集里,表示这个联通块里的列是联动的 最后统计下联通块数(不包括第一行的这一列已经被染色的情况)快速幂一下即可. #include<iostream> #include<cstdio> #include<vector> using namespace std; const int N=100005,mod=1e9; int n,m,k,f…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1050 没思路的话想想暴力就好了... 首先,比值最小就是确定最小值后最大值最小: 怎样确定最小值?其实就是暴枚: 然后从最小值往上加边,并查集维护连通性,当 s 和 t 连通时的边就是最小的最大值. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm&g…
思路: 考虑时光倒流 这不就是并查集裸题了-----. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 500500 int n,q,xx,yy,v[N],first[N],next[N],tot,fa[N],f[N],ask[N],vis[N],ans[N];char op[N][5]; int find(in…
http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后nlg^2n被tle成翔了.............................. 然后看题解QAQ,,,这... 神题做法...待会再写...(upd:[BZOJ]3319: 黑白树) tle的hld: #include <cstdio> #include <cstring> #i…
1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2946  Solved: 1384[Submit][Status][Discuss] Description 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3...n-1,n), .当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai…
可并堆水题 --------------------------------------------------------- #include<bits/stdc++.h>   using namespace std;   const int maxn = 1000009;   struct Node { Node *l, *r, *ch; int v, id; } pool[maxn], *null, *pt = pool, *q[maxn];   Node* newNode(int v,…
2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树…
题意: 一张图0,1两种边,构造一个恰有k条0边的生成树 优先选择1边构造生成树,看看0边是否小于k 然后保留这些0边,补齐k条,再加1边一定能构成生成树 类似kruskal的证明 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; , M=1e5+; typedef long long ll; inline in…
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这样就把原来的删点变为了加点,加点的话计算连通块就方便的多,具体参见代码. #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<sstream&…