算法竞赛进阶指南0x41并查集】的更多相关文章

并查集简介 并查集的两类操作: Get 查询任意一个元素是属于哪一个集合. Merge 把两个集合合并在一起. 基本思想:找到代表元. 注意有两种方法: 使用一个固定的值(查询方便,但是在合并的时候需要修改大量的值,比较复杂) 使用树形结构,这样合并的时候可以直接让一个叫另一个 eg. f[root1] = root2 并查集的路径压缩以及按秩合并 路径压缩:在每一次进行合并的时候,顺便更改每一个节点的值.(均摊复杂度:\(O(logN)\)) 按秩合并:每一次查询的均摊复杂度是\(O(logN…
题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合理的乘车方式,可以使得他们去往公园需要的所有汽车行驶的总公里数最少. 为此,他们愿意通过很多人挤在同一辆车的方式,来减少汽车行驶的总花销. 由此,他们可以很多人驾车到某一个兄弟的家里,然后所有人都钻进一辆车里,再继续前进. 公园的停车场能停放的车的数量有限,而且因为公园有入场费,所以一旦一辆车子进入…
目录 线段树简介 线段树的简单代码实现 建树代码 修改操作 查询操作 线段树的查询操作的时间复杂度分析: AcWing245. 你能回答这些问题吗 思路 代码[时间复杂度:\(O( \space(N+M)logN)\) ] 错误分析 AcWing246. 区间最大公约数 思路 代码 总结 延迟标记 回顾并查集 概览 AcWing243. 一个简单的整数问题2 总结与反思 代码 扫描线 AcWing247. 亚特兰蒂斯 思路 DeBug 代码 思路解析 AcWing248. 窗内的星星 思路 代码…
Hash的基本知识 字符串hash算法将字符串看成p进制数字,再将结果mod q例如:abcabcdefg 将字母转换位数字(1231234567)=(1*p9+2*p8+3*p7+1*p6+2*p5+3*p4+4*p3+5*p2+6*p1+7*p0)%q=0~q-1经验值 p=131,1331时,冲突最小q取2^64(unsigned long long) 例如abd=(124)131=(1*131^2+2*131^1+4*131^0)=hash("abd")溢出不用管 先预处理出字…
137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花. 例如ai,1,ai,2,-,ai,6和ai,2,ai,3,-,ai,6,ai,1 就是形状相同的雪花. ai,1,ai,2,-,ai,6和ai,6,ai,5,-,ai,1 也是形状相同的雪花. 我们称两片雪花形状相同,当且仅当它…
题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通过这些道路可以走遍Y岛的所有城市. 神奇的是,乘车经过每条道路所需要的费用都是一样的. 小可可,小卡卡和小YY经常想聚会,每次聚会,他们都会选择一个城市,使得3个人到达这个城市的总费用最小. 由于他们计划中还会有很多次聚会,每次都选择一个地点是很烦人的事情,所以他们决定把这件事情交给你来完成. 他们…
放在原来这个地方不太方便,影响阅读体验.为了读者能更好的刷题,另起一篇随笔. 0x00 基本算法 0x01 位运算 [题目][64位整数乘法] 知识点:快速幂思想的灵活运用 [题目][最短Hamilton路径] 知识点: 状压DP.我的题解总是写得不好,大家还是看书吧qwq P2114 [NOI2014]起床困难综合症 知识点:状态压缩 0x02 递推与递归 [题目][费解的开关] 知识点:搜索?递推?模拟? +状压 [题目] 4座塔的Hanoi 知识点:递推 [题目][约数和问题] 知识点:数…
// 快速幂,求a^b mod p int power(int a, int b, int p) { int ans = 1; for (; b; b >>= 1) { if (b & 1) ans = (long long)ans * a % p; a = (long long)a * a % p; } return ans; } // 64位整数乘法的O(log b)算法 long long mul(long long a, long long b, long long p) {…
组成部分: 哈希函数: 链表 AcWing137. 雪花雪花雪花 因为所需要数据量过于大,所以只能以O(n)的复杂度. 所以不可能在实现的过程中一一顺时针逆时针进行比较,所以采用一种合适的数据结构. 如果使用set里面存储pair套上pair,维护起来稍微有一点麻烦. 取一个两片相同雪花都有的共同特征,(不同的重复也没事). tips: 如果已经发现两片雪花不一样,直接return 0即可. 普及一个比较大的质数: 99991 #include <bits/stdc++.h> using na…
142. 前缀统计 给定N个字符串S1,S2-SN,接下来进行M次询问,每次询问给定一个字符串T,求S1-SN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106,仅包含小写字母. 输入格式 第一行输入两个整数N,M. 接下来N行每行输入一个字符串Si. 接下来M行每行一个字符串T用以询问. 输出格式 对于每个询问,输出一个整数表示答案. 每个答案占一行. 输入样例: 3 2 ab bc abc abc efg 输出样例: 2 0 #include <iostream> using n…
快速幂 #include<cstdio> #include<cmath> #include<iostream> using namespace std; long long a,b,p; long long read(){ ,f=;char c;c=getchar(); ;c=getchar();} +c-';c=getchar();} return w*f; } long long ksm(long long t,long long tt){ ,k=t,kk=tt;…
原题连接 题目描述 给定一个整数数组\(a_1,a_2,-,a_n\). 定义数组第 i 位上的减操作:把\(a_i\)和\(a_{i+1}\)换成\(a_i - a_{i+1}\). 用con(a,i)表示减操作,可以表示为: \[ con(a,i)=[a_1,a_2,-,a_{i-1},a_i-a_{i+1},a_{i+2},-,a_n] \] 长度为 n 的数组,经过 n-1 次减操作后,就可以得到一个整数t. 例如数组[12,10,4,3,5]经过如下操作可得到整数4: \[ con([…
二进制是计算机的根本! 你了解她它吗? int lowbit(int x) { return x&(-x);//x&(~x+1),~x=-1-x; } int __builtin_ctz(unsigned int x) int __builtin_ctzll(unsigned long long x) 返回x的二进制表示下最低位的1后面有多少个0 int __builtin_popcount(unsigned int x) int __builtin_popcountll(unsigned…
题目在这里啊题目在这里~ Hamilton路径:将所有点都遍历刚好一次的路径 思路: 数据范围比较小(1~20),所以我们可以考虑暴力中的枚举 数组f[i][j]​ i的二进制表示选取了哪些点 j表示以哪个点结尾 然后就是状态压缩 由于求的是最小值,所以一开始的时候要赋初值INF 为了有解,f[1][0]应该赋值为0. #include<bits/stdc++.h> #define INF 0x7f7f7f7f #define Max (1<<n) using namespace…
在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= x) l = mid; else r = mid - 1; }…
while (l < r) { int mid = (l + r) / 2; if (a[mid] >= x) r = mid; else l = mid + 1; }…
// lowbit运算,找到二进制下所有是1的位 int H[37]; // 预处理 for (int i = 0; i < 36; i++) H[(1ll << i) % 37] = i; // 对多次询问进行求解 while (cin >> n) { while (n > 0) { cout << H[(n & -n) % 37] << ' '; n -= n & -n; } cout << endl; }…
// hamilton路径 int f[1 << 20][20]; int hamilton(int n, int weight[20][20]) { memset(f, 0x3f, sizeof(f)); f[1][0] = 0; for (int i = 1; i < 1 << n; i++) for (int j = 0; j < n; j++) if (i >> j & 1) for (int k = 0; k < n; k++) if…
背包问题是线性背包中的一类重要问题. 0/1背包 模型: 给定N个物品,每一个物品具有两种属性,一个是体积 \(v_i\) ,另一个是容积 \(w_i\) . 有一个容积为M的背包,求一种方案,使得选择的物品的体积不超过背包体积的情况下,使得获得的总价值最大. 0/1背包的时间复杂度是\(O(n*m)\). 空间复杂度随着写法的不同而不同. 方法一:按照定义写 #include <bits/stdc++.h> using namespace std; int n, m;//n表示的是商品的数目…
AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置.(这样状态表示仅仅需要每一行的人数就行了) 下一行的人数不能多余上一行 有两种思考方式: lyd思考方式: 现在已经安排好学生了,dp[a][b][c][d][e]是按照这种方法安排的总的方案数.然后往以后的情况推倒. y总思考方式: 思考怎样才能推倒到现在的情况. 时间复杂度分析: 第一排,第二…
目录 AcWing895. 最长上升子序列 方法一 方法二 当询问最长子序列是哪些的时候 896. 最长上升子序列 II 思路 O(NlogN)做法:贪心+二分 代码 AcWing\897. 最长公共子序列 思路 代码 AcWing898. 数字三角形 思路 参考资料 AcWing895. 最长上升子序列 方法一 采用从前往后推的方法 #include <bits/stdc++.h> using namespace std; #define N 1006 typedef long long l…
概述 AcWing211. 计算系数 #include <bits/stdc++.h> using namespace std; const int mod = 10007 ; int ksm(int a, int b, int p) { int ans = 1%p; a = a%p; while(b) { if(b&1) ans = (long long)ans * a % p; a = (long long)a*a%p; b>>=1; } return ans; } i…
定义 如果整数a,b除以正整数m的余数相同,那么a,b模m同余 . 知识点 拓展欧几里得算法 代码 #include <bits/stdc++.h> using namespace std; int exgcd(int a, int b, int &x, int &y) { if(b==0) { x = 1; y = 0; return a; } int d = exgcd(b, a%b, x, y);//代表答案 int z = x; x = y; y = z-(a/b)*y…
高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装备购买 代码 总结: AcWing210. 异或运算 思路:注意线性空间的推广! DEBUG总结 高斯消元对应的矩阵有两种: 常规的线性方程组 异或操作(不需要乘上一个数再相减,直接异或即可) 概念理解起来不太费力,重点是代码实现. ACWing207. 球形空间产生器(点击访问) 这道题目重点是考…
文章目录 矩阵的相关性质再回顾 矩阵加速大法: ACWing205. 斐波那契 代码 ACWing206. 石头游戏 解题思路: 感受: 代码 矩阵的相关性质再回顾 对于一个矩阵 满足结合律 满足乘法对于加法的分配率 但是不满足交换律! 对于特殊一点的矩阵来说: 把最左边还有最右面的看成一个数组.. 矩阵加速大法: 因为矩阵满足结合律,所以可以使用快速幂来进行计算. 规律总结: 矩阵加速设计到两个东西: 状态矩阵 转移矩阵 可以抽象出一个一维向量,在每一次递推就变化一次: 状态转移方程不发生变化…
K M P模式匹配 #include <bits/stdc++.h> using namespace std; #define N 100 char s[N]; char m[N]; int nxt[N]; void process() { nxt[1] = 0; int len = strlen(m+1); for(int i = 2, j = 0; i <= len; i++)//注意:必须要从2开始. { while(j > 0 && m[i] != m[j+…
题目链接  2016 CCPC东北地区大学生程序设计竞赛 B题 题意  给定一个无向图和一棵树,树上的每个结点对应无向图中的一条边,现在给出$q$个询问, 每次选定树中的一个点集,然后真正被选上的是这些点以及这些点的所有祖先. 只有标号在树中真正被选上的点代表的这些原图中的边是存在的,这样就构成了一个新的图.求这个图的连通块个数. dfs整棵树,记$f[x]$为若$x$以及$x$的所有祖先被选上,那么构成的新的图的并查集) 这个实现比较简单,搜索的时候打上标记,回来的时候撤销即可. 这样预处理的…
转自:https://libhappy.com/2016/03/algs-1.3/ 假设在互联网中有两台计算机需要互相通信,那么该怎么确定它们之间是否已经连接起来还是需要架设新的线路连接这两台计算机.这就是动态连通性问题. 动态连通性问题在日常生活中十分常见,比如上文所说的通信网络中的连通性问题,比如物理化学中的渗流问题.通过并查集这种数据结构及union-find 算法可以解决动态连通性问题. 动态连通性问题 概念 给出一系列的对象时,让其支持以下的两个操作: 判断两个对象是否相连 使两个对象…
太菜了才做到并查集啊啊啊啊啊啊啊啊啊啊啊 还是很有收获的说 水 bzoj4195: [Noi2015]程序自动分析 好题 poj1456 感受到并查集传递性的美妙啊!对于一个商品,去找他过期前那天的集合假如大于0相当于可以在这天卖出,然后这个集合和前一个集合合并! #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm>…
next[1] = 0; for (int i = 2, j = 0; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) j = next[j]; if (a[i] == a[j+1]) j++; next[i] = j; } for (int i = 1, j = 0; i <= m; i++) { while (j > 0 && (j == n || b[i] != a[j+1])) j = next[…