自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 FFT模板+NTT模板

嫖的模板,原理未知,用于多项式乘法。将a多项式的系数赋值给a[i].x,b多项式的系数赋值给b[i].x然后solve(n,m)即可。#include<iostream>#include<cstdio>#include<cmath>using namespace std;const int MAX_N=10100000;const double Pi=acos(-1.0);inline int read(){ char c=getchar();

2020-10-16 11:51:34 208

原创 网络流模板+费用流模板

注意tot是从1开始,边的数量m为点的平方,即n*n。复杂度o(n * m * m)。初始化memset(head,0,sizeof(head))#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<cstring>using n...

2019-12-05 18:42:48 135

原创 树链剖分模板

基于边#include<iostream>#include<cstdio>using namespace std;const int MAX_N=50100;int size[MAX_N],wson[MAX_N],dfn[MAX_N],deep[MAX_N],pre[MAX_N],top[MAX_N],fa[MAX_N];int head[MAX_N],Next...

2019-11-15 16:19:23 119

原创 树链剖分模板

学习笔记const int MAX_N=100100;vector<int>v[MAX_N];struct node{ int sum,lazy,l,r,ls,rs;}node[2*MAX_N];int root,n,m,r,a[MAX_N],cnt,head[MAX_N],fa[MAX_N],deep[MAX_N],size[MAX_N],son[MAX_N],seq[M...

2019-09-27 14:34:25 142

原创 LCA模板

用vector写的会T,o2优化才过的改成邻接表应该就不会T了P3379 【模板】最近公共祖先(LCA)#include<iostream>#include<cstdio>#include<vector>using namespace std;vector<int>edge[501000];int dp[501000][20],hav...

2019-09-26 21:49:24 228

原创 点分治

用于求树上的满足条件的点对个数例如最基本的求树上所有满足x到y的距离为k,是k的倍数等等的点对个数模板#include<iostream>#include<cstdio>#include<vector>using namespace std;const int MAX_N=20100; const int INF=0x3f3f3f3f;int ...

2019-09-26 15:55:47 175

原创 主席树模板

int num=0;struct skt{ int l,r,sum;}f[MAX_N*40];int root[MAX_N],b[MAX_N];void build(int k,int l,int r){ if(l==r){ f[k].sum=0; if(k>num) num=k; return; } else{ int mid=(l+r)>&...

2019-08-27 00:06:23 151

原创 线段树模板

单点更新区间查询struct node{ int l,r,max;}a[MAX_N*4];int b[MAX_N];void update(int k){ a[k].max=max(a[k<<1].max,a[k<<1|1].max);}void build(int k,int l,int r){ a[k].l=l;a[k].r=r; if(l==r){...

2019-08-05 14:43:23 310

原创 Codeforces Round #723 (Div. 2) E. Oolimry and Suffix Array

E. Oolimry and Suffix Array题意:给长度为n的数组a,代表字符串的后缀数组的rk值,给一个值k代表字符串的字符集个数。求符合后缀数组为数组a的字符集大小<=k的方案数。思路:按照rk排序遍历,比较rk[i]和rk[i]+1这两个后缀,如果这两个后缀第一个字母不同,肯定合法,如果相同,就通过a数组看一看是否合法,如果不合法则代表这个必须严格大于。我们就可以把模型抽象成0,1,1代表右移,0代表左移,求(1,1)到(n,k)的方案数这样如果不合法则一定是1后面跟着个0,

2021-06-07 18:26:48 234

原创 Codeforces Round #724 (Div. 2) E. Omkar and Forest

E. Omkar and Forest题意:给n*m的字符矩阵,有0和#两种,你可以把#改成任意非负整数,满足以下两种条件,1.这个单元格中的数于其相邻的单元格差的绝对值小于等于1。2.这个单元格的数如果大于0,则其必须严格大于其相邻的至少一个单元格的数。问有多少种构造方案。感觉cf题目最近的标的分数有点偏高,这个题感觉1900左右吧。思路:首先猜了个结论,就是一个格子的值一定为它到理它最近的0的曼哈顿距离x。首先很明显它不可能大于x,大于x明显明显不合法。然后证明它不可能小于x,如果这

2021-06-07 13:05:03 183

原创 实验四 LR语法分析器

#include<iostream>#include<cstdio>#include<string>#include<map>#include<cstring>using namespace std;const int MAX_N=1010;int st1[MAX_N],tot1=0,tot2=0;char st2[MAX_N];string LR[15][15]={{"s5"," "," ","s4"," "," ","1",

2021-06-03 17:36:20 511

原创 LL(1)递归下降语法分析器 和 LL(1)预测分析器

LL(1)递归下降语法分析器/*E->TQ Q->+TQ|eT->FRR->*FR|eF->a|(E)*/#include<iostream>#include<cstdio>#include<string>#include<vector>#include<cstring> using namespace std;const int MAX_N=101000;char s[MAX_N];

2021-05-27 17:12:25 873 3

原创 E.Trees of Tranquillity

E. Trees of Tranquillity题意:多组输入,给两个都是n个节点的树A和树B然后给一个n个节点的图,然后如果两个点x和y同时满足以下两个条件则连边,1.在树A中x是y的祖先或者y是x的祖先,2,在树B中x和y谁也不是谁的祖先求图的最大团的大小n<=3e5输入的树边为a2到an,ai代表i的父亲是ai,1<=ai<i思路:A树上的肯定在一条链上,B树则为dfs序的不重叠区间这个题的巧妙之处在于输入ai<i这个限制,这样一条链上的各个点标号一定是递增

2021-05-25 23:42:53 413

原创 Codeforces Round #721 (Div. 2) E - Partition Game

E - Partition Game题意:给一个长度为n的数组,将其分成k段,每段的权值定义为这段数组中每个不同的数的cost和,对于一个数的cost为这个数在这一段中最后一次出现和第一次出现的距离差。求分成连续k段的最小权值和。昨天打cf看了一下这个题,和银川B好像,于是就想能不能巧妙的dp一下,想了挺长时间也没有dp的思路,感觉现在这种题就像我的梦魇似的,银川B题因为比赛前一天看了很多数据结构的题导致完全没想dp,而这个题又因为银川B题的折磨也没想数据结构,真的感觉现在处于一个知识量和思维和做题状态

2021-05-21 12:08:23 171

原创 斯坦纳树

斯坦纳树:给n个点m条边的无向图,然后给出k个点的集合,找一个最小的生成树使得包含这k个点(这个生成树必须包含这k个点,其他点可以有也可以没有,但是必须保证最后是个生成树,然后找最小的生成树)。利用状压加最短路算法实现,目前没有多项式时间复杂度的算法。dis[x][p]代表以x为根,k个点集合中选择了状态为p的点的最小生成树权值。两个核心转移方程 dis[x][p]=min(dis[x][p],dis[x][i]+dis[x][p^i]);和 dis[x][p]=min(dis[x][p],dis

2021-01-16 23:03:35 469

原创 E. Devu and Flowers(生成函数)

题意:有n类鲜花,每类鲜花有fi个,每类鲜花都是相同的,然后询问能凑成s朵鲜花的种类数。对1e9+7取模。n<=20,fi<=1e12,s<=1e14。思路:组合数学,但是肯定不能直接搞,因为s和fi太大了,而且模数也太大了,所以卢卡斯啥的肯定不行,于是考虑生成函数。先写一个式子,这个式子之前真的从来没见过,虽然很弱智但是真的没用过。1+x+x2+x3+...+xn=1−xn+11−x1+x+x^2+x^3+...+x^n=\frac{1-x^{n+1}}{1-x}1+x+x

2020-11-25 17:09:46 301 3

原创 两个多项式的卷积(对询问分块)

两个多项式的卷积思路:对询问分块,当凑够一定数量的修改时进行一次NTT,然后每次查询就直接暴力求还没有进行NTT的那一部分的贡献,块大小为sqrt(n*log(n))最合适,注意坑点:输入的a[i]和b[i]是有可能小于0的!#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int MAX_N=100100;

2020-10-28 22:07:22 524

原创 牛客练习赛71 E 神奇的迷宫(点分治+NTT)

E 神奇的迷宫思路:点分治+NTT裸题,NTT初始化很重要!!!NTT中limit,L,a数组和b数组都得初始化。这个题中点分治的sum和主函数中的sum求和弄混了因此一直T,心态崩了。#include<iostream>//注意此模板点的下标应为1到n!!!#include<cstdio>#include<vector>using namespace std;const int MAX_N=600100;const int G=3;const in

2020-10-16 17:44:58 183

原创 Codeforces Global Round 11 C. The Hard Work of Paparazzi(巧妙的暴力)

C. The Hard Work of Paparazzi题意:r,n代表一个r * r的矩阵,n代表有n个金币,初始时间是0,现在你站在(1,1)位置,然后给出n个金币出现的位置(x,y)和出现的时间t,这个金币只在t这一分钟出现,过了t就消失,然后保证给出的t是严格递增的,求你能获得的最大收益。每分钟你能向四周移动一个单位。思路:dp状态很好想,但是转移感觉怎么二维偏序都没法搞,后来听了题解的思路才知道原来这是个暴力,而且t是严格递增的是个很巧妙的条件。r<=500,因此在一个点经过1000分

2020-10-16 00:09:22 182

原创 牛客练习赛71 F 红蓝图

牛客练习赛71 F 红蓝图思路:又是Kruskal重构树,按照正常思路建重构树即可,最后模型会转化为每个询问,询问a数组中(l1,r1)这段序列和b数组中(l2,r2)这段序列中的具有的相同数的个数(a数组和b数组可以看作一个置换数组,即值只有1-n且每个数只出现正好一次)。这个就可以用主席树搞了,把b数组中的每个数替换成a数组中的相应的那个数的位置,这样就成了区间查询b数组的某一段中数值在(l,r)这个范围的个数,然后就可以主席树弄了。ps:没用快读快输1.3s,所以应该用不用都行。#inclu

2020-10-15 23:23:19 151

原创 Codeforces Round #317 [AimFund Thanks-Round] (Div. 1) D. Campus(Kruskal重构树 两个线段树加两个Kruskal重构树)

D. Campus题意:思路:两个线段树加 Kruskal乱搞,第一个单秒的3100分的题,无敌,这题稍微卡内存,线段树只能开三个变量。总的来说,这个题恶心人。250行,真恶心。#include<iostream>#include<cstdio>#include<vector>using namespace std;const int MAX_N=1001000;struct skt{ char s[2]; int x,y;}qy[.

2020-10-14 23:16:16 226 1

原创 线性基+前缀线性基学习笔记

学习于这个博客首先,线性基是一个集合,对于任何一个序列一定有至少一个线性基,取线性基中的某些数异或起来一定可以得到原序列中的任何一个数。线性基三大性质:1.原序列中的任何一个数都可以由线性基里面的一些数异或得到。2.线性基中任意数异或起来都得不到0(换句话说,一个数只能由线性基中特固定的几个数异或得到)。3.线性基中数的个数是唯一的,并且在满足所有性质的条件下个数是最少的。线性基构造函数:void add(long long x){ int i; for(i=60;i>=

2020-10-14 18:42:15 340

原创 Codeforces Round #673 (Div. 1) D.Graph and Queries

D.Graph and Queries题意:一开始n个点m条边的无向图,这个无向图不一定是联通的,每个点都有一个点权然后有q个操作,操作1给出一个x,然后询问x的所在的连通图中权值最大的点的权值,然后将这个点的点权改为0,操作2给出一个x,将第x条边断开。思路:可以离线,所以可以倒着合并每条断开的边,每次合并断开的边就有可能合并两个集合,因此可以用链表代表两个集合,合并时直接用splic函数o(1)合并,所以总结就是倒着来两遍,第一遍用链表合并,使得每次断开一条边得到的两个集合是相邻的,这样就可以进

2020-10-14 13:42:34 135 1

原创 E.Avoid Rainbow Cycles (生成树模型)

E.Avoid Rainbow Cycles题意:有m个集合,n个点,每个集合有一些1到n的数,这些数代表的点构成一个完全图,边的颜色为i(第i个集合),然后定义彩虹环是一个环,这个环上的所有边都是不同颜色的,每次操作可以删除一个集合中的一个点,花费为a[i]+b[j],代表第i个集合的第j点,求最小花费使得最终不存在彩虹环。思路:这个题很难下手,因为彩虹环定义和完全图这些东西太绕了,但是其实可以定义一个点n+i,连着第i集合中的所有点,这样其实也就成了完全图,就抽象为了某个点,经过第n+i个点(即

2020-10-05 00:16:26 209

原创 E - Egor in the Republic of Dagestan

线性dp的本质其实就是DAG上递推,而最短路的本质其实就是dp,而最短路的dp其实就是处理有环图的一种dp处理方法。首先最短路是基于贪心的dp,如果是不基于贪心,其实本质就是跑n次o(m)的dp转移,但是由于有了贪心加上优先队列优化,就成了m*logn的,而这种贪心应用于某些有环的dp上就成了最短路dp问题。题意:给出 n 个点和 m 条边的有向图,每条边的长度为 1 ,有一个属性由 0 或 1 表示,现在需要给每个节点赋值,使得:1.如果点 u 的权值为 0 ,则 u 只能走 ( u , v ) 且

2020-09-10 13:14:36 279

原创 Codeforces Round #668 (Div. 2) E

题意:给出一个长度为 n 的数列 a ,规定当 a[ i ] == i 时,位置 i 可以被删除掉,后面位置会合并上来,现在需要回答 m 次询问,每次询问会问禁用掉后面 x 个数字和后面的 y 个数字后,最多可以删除掉多少个数字,每个询问都相互独立,举个例子比较好看:思路:首先询问给出的可以转化为给出l,r,然后对于一个区间的询问有一个很明显的贪心,就是每次把能去掉的最右边的去掉,这样就可以使得去掉的个数最大化。但是很明显多组询问就爆了,这时候就考虑怎么优化,其实对于一个数a[i]有三种情况:1.a

2020-09-07 23:00:53 195

原创 HDU 6856 Breaking Down News 2020多校第8场1002

题意:嫖了一张题意图。思路:一开始以为是dp,发现dp个????,然后因为dp[i]的取值为max(dp[j]+{sum[i]-sum[j]}),所以应该是个线段树问题。当x=0时,{x}=0;当x<0时,{x}=-1;当x>0时,{x}=1;然后就是区间的x+{y}问题。一开始线段树各种没想法,后来突然想到权值线段树,然后就很明显正解,然后再中途还需要配个单调队列。因为y是由sum[i]-sum[j]决定的,所以可以在sum[j]放入dp[j],这样sum[i]减去(1,sum[i

2020-09-01 15:06:36 163

原创 2019 ICPC Asia Jakarta 问题 G: Performance Review

题意:有一个公司,有n个员工,然后每个员工都有一个能力值,每年会淘汰r[i]个员工,然后再新招聘r[i]个新员工,同样有能力值,这样就使得公司一直有n个人。然后q个更改,如果把第i年招聘的第j个员工的能力值改为z,那么m年后一号员工还能在公司里吗。修改是永久性修改,一开始看错题了,md白写了。思路:首先如果假设第一个员工,也就是我,比我大的人为x个,那么我的rank排名就是x+1,那么只要我还在公司里,那么比我大的人一定在公司里,如果说某一年淘汰r个人,那么我就得是前n-r名才行,这样即为只有我的rk满足

2020-09-01 11:20:40 167

原创 2019 ICPC Asia Jakarta 问题 J: Tiling Terrace

题意:给n,k,g1,g2,g3,然后给一个长度为n的只包含’.‘和‘#‘的字符串,有三种type,type 1:单个的’.’,贡献为g1,type 2:两个连着的’.’,贡献为g2.type 3:".#.",连续的点#点,贡献为g3.求最优划分使得贡献最大,每个字符只能用于1个type。字符串中’#'顶多出现50次。type 1最多用n次。思路:显然dp,一开始看错了题意以为是个垃圾题,后来发现这个题还是有点东西的。这一开始感觉应该是个二维dp,但是第一维为字符串前i项,如果第二维为用了

2020-08-31 14:01:45 208

原创 笛卡尔树 模板

int lc[MAX_N],rc[MAX_N],st[MAX_N],rt,a[MAX_N];bool vis[MAX_N];void build(int n){ int i; for(i=1;i<=n;i++){ lc[i]=rc[i]=-1; vis[i]=false; } int cnt=0,tp=0; for(i=1;i<=n;i++){ tp=cnt; while(cnt&&a[i]<a[st[cnt]]) cnt--; if.

2020-08-27 13:54:02 88

原创 牛客挑战赛42 B.小睿睿的伤害(树上启发式合并)

题意:思路:上面是官方题解,套路加树上启发式合并,就是这个启发式之前没写过,代码写的感觉有点繁琐。总结:当碰到关于点对的lca具有某些性质时,可以考虑对于每个点,当这个点成为lca时求把这个点当作lca的点对对其的贡献。#include<iostream>#include<cstdio>#include<vector>using namespace std;const int MAX_N=101000;vector<int>v[MAX_N]

2020-08-24 21:54:10 234

原创 2020牛客第七场 C题 A National Pandemic(树链剖分+小技巧)

C题 A National Pandemic题意:一棵树,n个点,m个操作,操作有三种。操作1,给出x和w,将所有的点y的权值加上w-dis(x,y)。操作2,给出x,将x与0取min。操作3,给出x,求x的权值。n,m<=40000.思路:难点就是操作1。w-dis(x,y)=w-dis(1,x)-dis(1,y)+2 * dis(1,lca(x,y));dis(1,lca(x,y))的处理是难点,其余直接弄一个变量计数即可。问题化为:给出x点,对于每个点y的权值加上dis(1,l

2020-08-03 21:03:39 360

原创 牛客练习赛66 E-骚区间

骚区间题意:给一个长度为n的全排列,求有多少个骚区间。骚区间定义,对于[l,r]这个区间满足在这个区间中只有1个数小于al,只有1个数大于ar,那么这个区间就为骚区间。n<=1000000,ai数组为全排列。思路:明显枚举每个端点作为骚区间的左端点,假设我们枚举ai作为左端点,然后在他右边找到第一个小于ai的数的位置x,然后再在x的右边找第一个小于ai的数的位置y,明显以ai为左端点的骚区间只能在[x,y)这个区间中选择右端点,同理也可以枚举每个数作为右端点,然后找他左边第一个第二个大于ai的数x

2020-06-28 18:38:16 259

原创 BFS树

BFS树就是通过bfs遍历一个图构成出来的树,特点就是在无权图上的非树边连接的两点一定在同一层(即深度相同)或者相邻的两层(即深度差的绝对值为1)。原理:首先bfs树中每个点的深度就是这个点到树根的最短距离,这个想成权值为1的dijkstra就很容易理解,然后如果两个点隔了三层,而他们直接的边的权值为1,那么其中一个深度小的点就可以优化另一个深度大的点,所以这两个点深度绝对值最大为1.H. Heat Pipes这个题就是将所有的点的权值赋值为[a,b]中的一个数,使得任意一条边连着的两个点的权值的绝对

2020-05-27 23:22:58 1527

原创 【美团杯2020】平行四边形(原根)

G. 【美团杯2020】平行四边形原根定义:对于任意质数p都有一个原根g,满足gi%p!= gj%p,对于任意i!=j且i,j属于[1,p-1]都满足。思路:设p=n+1,对于每个点为(i,gi%p)证明 假设存在平行四边形,即存在四个点(a,ga%p),(b,gb%p)(c,gc%p),(d,gd%p)为平行四边形,则a-b=c-d,假设a>=b,c>=d;ga%p-gb%p=gc%p-g ^d%p,即为gb(g(a-b)-1)%p=gd(g(c-d)-1)%p,因为a-b=

2020-05-19 11:14:41 201

转载 杜教BM 模板

用于解决:求一个递推方程,暴力求出前几项之后放进去,然后跑这个算法就可以求出递推方程式来或者直接就跑F[n]的答案,复杂度挺小的。放的话放8个以上,最好10个左右。模板求任意模数的BM模板#include <bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds...

2020-05-08 13:54:54 221 1

原创 最大独立集 最大团

最大团就是一个无向图中找到一个点集,这集合中的任意两个点直接都有边直接相连,点数最大的点集就是最大团。最大独立集就是一个集合中的任意两个点之间都没有边相连接,最大的点集就是最大独立集。图G的最大独立集点数就是图G的补图Gv的最大团。Bron-Kerbosch 算法求最大团,本质上就是爆搜加剪枝,最多能跑100的稠密图和1000左右甚至上万的稀疏图。...

2020-05-05 13:30:10 354

原创 求斐波那契数列循环节

当斐波那契数列%mod时一定存在一个循环节,根据鸽巢原理,mod*(mod-1)一定是一个循环节,但不一定是最短的。然后求斐波那契数列%n的循环节时,先把n质因数分解,n=p1a1* p2a2*…*pkak,然后循环节就是每个pa 的循环节的最小公倍数,pa的循环节即为num[p]*pow(p,a-1),num[p]是p的循环节。即为num[p1] pow(p1,a1-1)与num[p2]...

2020-05-03 23:07:20 553

原创 数论公式

n∑ i*(n-i+1)=1 * n+2 * (n-1)+3*(n-2)+…+n1=n * (n+1)(n+2)=i=1

2020-04-30 19:52:40 168

原创 Kruskal重构树

Kruskal重构树就是一个图利用最小生成树算法建树,但是建树代码如下 int tot=n; for(i=1;i<=m;i++){ int fx=find(edge[i].x); int fy=find(edge[i].y); if(fx!=fy){ pre[fx]=pre[fy]=++tot; kv[tot].push_back(fx); kv[tot]....

2020-04-29 21:10:33 380

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除