- 博客(72)
- 收藏
- 关注

原创 acm训练情况总结索引
2019.4.1训练情况总结:https://mp.csdn.net/postedit/889588682019.4.13 训练情况总结:https://mp.csdn.net/postedit/890529982019.4.27.训练情况总结:https://mp.csdn.net/postedit/89414291...
2019-04-02 19:45:16
219
原创 PAT甲级题库考点
共155题,基本输入输出2题,单源最短路1题,树的遍历1题1001 A+B Format 基本输入输出 1002 A+B for Polynomials 基本输入输出 1003 Emergency 单源最短路 1004 Counting Leaves 树的遍历 ...
2021-03-01 18:29:03
258
原创 树上差分
边权差分 将边权转化成子节点的点权,在a到b路径上边权加c等于在a和b上分别加c,在lca(a,b)上减2c,此时边权和等于子树差分和点权差分 在a到b路径上点权加c等于在a和b上分别加c,在lca(a,b)和fa[lca(a,b)]上减c,此时点权和等于子树差分和#include<iostream>#include<cstdio>#include<cstring>#include<vector>using name...
2020-10-14 09:37:07
187
原创 树上启发式合并
统计子树出现最多的颜色编号之和#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;const int N=1e5+10;int h[N],con=1,nex[N*2],to[N*2];int col[N],sz[N],son[N],f,cnt[N],mc;ll ans[N],sum;void add(int a,int
2020-10-12 23:53:22
227
原创 点分治
#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1e4+10;int h[N],w[N*2],nex[N*2],to[2*N],con=1;int sz[N],ms,rt,sum;int del[N],vis[100000010],dis[N],res[N],ires,m,q[128],ans[128],gc[N],igc;void ad.
2020-10-08 10:46:03
114
原创 单调栈
#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef long long ll;int h[100010];int st1[100010],r1,p1[100010],m1[100010];int st2[100010],r2,p2[100010],m2[100010];int main(){ //freopen("1.txt","r",st.
2020-10-04 21:59:05
1264
原创 线性基
将每个整数看成是一个向量,这些整数的线性基是这些整数的极大异或无关组,每个整数都能唯一的通过线性基内的数异或出来,整数直接互相异或的结果也能通过线性基异或出来,线性基的所有异或结果能通过这些整数异或出来.构造 线性基是一个一维数组,下标表示二进制位,每个二进制位对应一个线性基的整数向量. 构造时将每个整数逐个插入线性基.设插入值为x. 从高位到低位检查x,为0的位直接跳过,否则检查线性基该位是否已有整数向量,若有则将x异或该向量并跳过该位,否则有两种处理方法....
2020-08-24 23:03:07
263
原创 2020牛客多校第八场A All-Star Game 线段树+可撤销并查集
1.球员编号从1-n,球迷编号从1-m,有重叠部分,可以将球迷编号整体加n. 2.求最小球员个数等于求球迷的连通分量数,如果某个球迷的度为0表示没有喜欢的球员,此时无解输出-1. 3.变量con表示度为0的球迷的数量,初始值为m,用来判断是否无解,变量ans表示球迷的连通分量数,初始值为m. 4.先将初始状态直接存入map中,key为边,value为边存在的起始时间1. 5.输入修改时,在map中查询是否有这条边,如果有表示此次为删边修改,向线段树插入这条边,插入区间为这条边的存...
2020-08-13 21:13:02
245
原创 可撤销并查集
解决在树上加边或删边后的两点联通性问题,线段树线段表示时间,结点存储这个时间段内存在的边,线段树使用区间修改,单点查询.查询时先把每个结点储存的边的两端利用并查集合并,离开时需要利用栈进行撤销.#include<iostream>#include<cstdio>#include<cstring>#include<map>#include<vector>#include<stack>using namespace st.
2020-08-13 12:55:32
575
原创 线段树
单点修改 无需lazy标记,直接写,此时每个点存这个区间对应的答案.区间修改,单点查询 修改被修改区间包括的区间,查询时一路加到底.此时每个点并没有直接存这个区间对应的答案.区间修改,区间查询 需要lazy标记或者标记永久化,此时每个点不一定存的这个区间对应的答案...
2020-08-04 20:42:01
94
原创 __int128
inline __int128 read() { __int128 x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch.
2020-08-04 15:40:48
174
原创 最小异或生成树Xor-MST
1.将每个点的权值转换成二进制,从高位往低位依次插入01字典树. 2.dfs遍历该字典树的每个结点,如果某个结点有两个子节点,这两个子节点的子树分别会构成两个连通块,要在这两个连通块之间各选一个点连边并使它们的异或值最小,通过find函数递归处理这个问题.ans还要加上此时产生的二进制位对应的值. 3.find函数中先考虑能不能同时往0子节点或同时往1子节点走,此时这两条边异或值为0,返回值取这两种走法的最小值.如果不能同时往0或往1,只能一个往1一个往0,此时...
2020-07-27 23:50:10
417
原创 广义后缀自动机
同时处理多个字符串的字串问题在线写法const int N=1e6+10;int len[2*N],link[2*N],tr[2*N][32],con=2,last=1;int add(int c,int last){ if(tr[last][c]) { if(len[last]+1==len[tr[last][c]]) return tr[last][c]; int ne=con++,p=last,r=tr[last][c];
2020-07-24 21:47:52
116
原创 后缀自动机
求本质不同的字串个数#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1000000+10;char s[N];int len[2*N],tr[2*N][32],link[2*N],con=2,last=1;void add(int c){ int p,now=con++; len[now]=len[last]+1;
2020-07-24 13:54:04
208
原创 无向图的双连通分量
无向图的双连通分量 边双连通分量 指极大的不存在桥的联通分量.去掉桥会使图不连通. tarjan算法,时间复杂度O(n+m) 1.以未建立时间戳的点为起点进行dfs,将该点压入栈中,建立该点的时间戳(f数组)并初始化从该点出发的最小的时间戳(mf数组). 2.遍历以该点为起点的所有终点,若未建立时间戳则继续进行dfs,结束后更新mf数组;否则若不为来时的边上的点,也更新mf数组.如果终点的mf值大于该点的f值,说明这条边是桥....
2020-06-30 23:22:19
139
原创 有向图的强连通分量
有向图的强连通分量 tarjan算法,时间复杂度O(n+m),可以有重边,自环.有向图的强连通分量是指极大联通分量,其内部所有点互相可达. 1.以未建立时间戳的点为起点进行dfs,将该点压入栈中,建立该点的时间戳(f数组)并初始化从该点出发的最小的时间戳(mf数组). 2.遍历以该点为起点的所有终点,若未建立时间戳则继续进行dfs,结束后更新mf数组;否则若在栈中,也更新mf数组. 3.递归回到该点后,该点的mf值如果等于f值表示它是一个强连通...
2020-06-29 23:36:34
312
原创 次小生成树
严格次小生成树1.先求出最小生成树2.枚举不在最小生成树上的每一条边,加入最小生成树构成环3.每个环上找到原来最小生成树上的最长的边和次长的边4.如果最长的边小于新加的边,将最长边去掉,否则去掉次长的边,如果次长的边等于最长的边,不存在严格次小生成树.5.求权值非严格次小生成树只需要找到原来最小生成树上的最长的边去掉即可,允许出现结果权值与最小生成树相同....
2020-06-24 09:22:32
107
原创 差分约束
求最小值转换成最长路,求最大值转换成最短路 最小值xi<=xj+c,出现负环无解,最大值xi>=xj+c,出现正环无解. 常数不等式xi>=c转换成xi>=c+x0,x0为超级源点. 源点需要能到达所有边....
2020-06-23 11:53:02
145
原创 输入整行未知个数的数据
char c; while(scanf("%c",&c)!=EOF) { int res=0; res=res*10+c-'0'; while(scanf("%c",&c)!=EOF&&c!=' '&&c!='\n') {res=res*10+c-'0';} r[con++]=res; ...
2020-06-03 14:28:58
288
原创 无穷大值
整数 memset(d,0x3f,sizeof(d)) (1061109567)浮点数 memset(d,0x42,sizeof(d)) (1.56842e+11) memset(d,0xc2,sizeof(d)) (-4.12554e+13)
2020-06-02 20:20:00
275
原创 二分图
染色法判断二分图#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=1e5+10;int h[N],nex[N<<1],to[N<<1],con=1;int c[N],vis[N];int dfs(int x)//O(n+m)不含奇数环即为二分图{ vis[x]=1; int d=c[x]==1?-
2020-06-01 19:09:20
114
原创 最小生成树
Prim算法#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int N=512,M=2e5+10,inf=0x3f3f3f3f;int h[N],nex[M],to[M],v[M],con=1;int d[N],vis[N];void prim(int n)//O(n^2) 可处理重边,自环,负权边,负环{ int ans=0; .
2020-06-01 16:31:36
218
原创 有向图的拓扑序列
#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<queue>using namespace std;int h[100000*2+10],nex[100000*2+10],to[100000+10],con=1,n;int et[100000+10];void bfs(){ queue<int>q; .
2020-05-24 20:11:00
368
原创 SG函数
SG函数 将每个状态看成有向图中的一个点,这个点的SG函数值就是自然数中不属于(以这个点为起点的所有终点的SG函数值)这个集合的最小值,结束状态SG函数为0,该点无出边.必胜状态 每个子游戏的起点的SG函数值异或和是整个游戏起点的SG函数值,SG函数为1先手必胜,SG函数值为0后手必胜.#include<iostream>#include<cstdi...
2020-04-29 10:32:37
211
原创 容斥原理
容斥原理 二进制位枚举遍历所有情况,时间复杂度O(2^n) for(int i=1;i<(1<<n);++i) { int mid=i,j=0; while(mid) { if(mid&1) { } ...
2020-04-23 15:13:49
177
原创 扩展欧几里得
扩展欧几里得 求不定方程ax+by=gcd(a,b)的解(a,b为正整数),求得特解x1,y1,通解x=x1-b/d*k,y=y1+a/d*k.当ax+by=d,且d%gcd(a,b)==0时,通解为x*d/gcd(a,b),y*d/gcd(a,b).int exgcd(int a,int b,int &x,int &y){ if(!b) { ...
2020-04-22 16:34:53
116
原创 win10内置应用全部失效、打不开、损坏,同时防火墙无法启动,防火墙服务未启动,windows defender被删除无法启动解决方法
环境 win10 64位家庭版(正版)背景 某次系统更新以后,照片应用无法运行,继而通过在PowerShell(以管理员身份运行)中输入Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocati...
2020-02-21 20:57:53
13510
14
原创 线段树区间最大连续子段和
区间最大连续字段线段树多维护三个值:当前区间从左端开始最大连续和cl,从右端开始最大连续和cr,区间内最大连续和mcl等于max(左子区间和s+右子区间cl,左子区间cl)cr等于max(右子区间和s+左子区间cr,右子区间cr)m等于max(左子区间m,右子区间m,左子区间cr+右子区间cl)查询时返回区间段并不断合并。struct node{ int s,c...
2019-11-10 15:25:44
339
原创 欧拉函数
1-N中与N互质的数的个数 for(int i=0;i<n;++i) { int mid,ans,sum; scanf("%d",&sum); mid=sqrt(sum); ans=sum; for(int j=2;j<=mid;++j) { ...
2019-10-26 20:41:19
152
原创 分解质因数+唯一分解定理+所有因数之和
唯一分解定理:任何一个大于1的自然数N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。求所有因数之和:,其中分解质因数,一个数n的质因数只能全部小于等于sqrt(n),或者只有一个大于sqrt(n) map<int,long long>q; fo...
2019-10-26 09:46:09
1150
原创 高精度加法(组合数+压位)
const int mod=1000000000;//压9位int c[520][520][32],ans[256];void Add(int x[],int y[],int z[])//x=y+z;{ if(y[0]<z[0]) { int *t; t=z; z=y; y=t; } in...
2019-10-25 20:45:52
302
原创 P2261 余数求和(整除分块)
1.其中i从1增加到n为等差数列, 的值随i的增加具有阶梯性(下降),故可将其分为一个一个台阶进行计算。即整除分块对于一个 ,值与其相同的最后一个 有 ,利用该性质对每个台阶左端点可求出台阶右端点。2.对于每个台阶,相同,i的值为等差数列,设l,r分别为台阶左、右端点。每个台阶的值 :3.ans=n*k-所有台阶的值之和。注意判断的情况,以及台阶右端点不能大于...
2019-10-20 14:39:55
164
原创 P2154 虔诚的墓主人(树状数组+排序降维)
1.进行二维离散化。 2.对坐标排序,先按x从小到大排序,如果x相同则按y从小到大排序。 3.求出各行各列有几棵树,预处理组合数。 4.从1开始到离散后x坐标最大值结束,遍历x坐标。 5.遍历每个x坐标时y坐标从小到大,需要维护当前已经遍历到的棵数(down),用该列的总数(col)减去已经遍历的(down)就是上面一部分的。 6.对遍历到的坐标(x,y),...
2019-10-19 23:45:55
143
原创 逆元
费马小定理如果p是素数,ll pow(ll x,int y){ int b=1; while(y) { if(y&1) b=(b*x)%mod; x=x*x%mod; y>>=1; } return b;}mid=Pow(mid,mod-2);求阶乘逆元...
2019-10-18 23:20:39
185
原创 高精度快速幂(乘法)
取后500位struct node{ int n[516],l;};node mul(node &a,node &b){ node c; memset(c.n,0,sizeof(c.n)); for(int i=1;i<=b.l;++i) for(int j=1;j<=a.l;++j) { ...
2019-10-12 09:24:16
261
原创 矩阵快速幂
struct Mat{ ll m[8][8];}mat;Mat mul(Mat &a,Mat &b){ Mat c; c.m[1][1]=c.m[1][2]=c.m[2][1]=c.m[2][2]=0; for(int i=1;i<=2;++i) for(int j=1;j<=2;++j) for...
2019-10-11 21:05:41
71
原创 求组合数
c[1][1]=c[0][1]=1; for(int i=2;i<=k;++i) for(int j=0;j<=min(i,n);++j) { if(!j) c[j][i]=1; else c[j][i]=c[j-1][i-1]+c[j][i-1]; }
2019-10-11 17:29:10
83
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人