模板类
小菜鸡加油
菜鸡
什么都能折磨
展开
-
1242B - 0-1 MST(求补图的连通块)
https://codeforces.com/problemset/problem/1242/B思路:trick。边太多考虑点。先放下所有点的集合。然后把在原图中无法一次遍历到的点就是在补图上有边相连的。然后这些点可以相成一个连通块。就是补图的连通块。补图连通块的两两之间需要代价为1的原图上的边。#include<iostream>#include<vector>#include<queue>#include<cstring>#inclu原创 2021-04-03 19:27:58 · 259 阅读 · 2 评论 -
欧拉函数板子
求单个ll eular(ll n){ ll ans = n; for(int i=2; i*i <= n; ++i) { if(n%i == 0) { ans = ans/i*(i-1); while(n%i == 0) n/=i; } } if(n > 1) ans = ans/n*(n-1); return..原创 2021-03-15 15:57:15 · 96 阅读 · 0 评论 -
F. 生命(菱形转矩阵+二维前缀和)
思路:模拟发现是菱形,转化到矩形,然后跑矩形的二位前缀和#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) c..原创 2021-02-28 15:41:44 · 199 阅读 · 0 评论 -
牛牛与交换排序(deque的手写和lazy标记翻转)
https://ac.nowcoder.com/acm/contest/9982/F牛牛有一个数组,数组元素是1到n的排列,即数组的值在1~n范围内,且每个数字仅出现1次。牛牛想要将该数组变为升序排列的,他可以进行如下的操作。首先他要确定一个长度k,k的范围在1~n之间。接下来他将会进行若干次操作。在每轮操作中他都可以选择一段长度为k的子数组,然后进行区间的翻转操作。他可以做任意次数的操作,但是要求他每次选择的子数组区间满足li≤li+1,并且区间长度等于一开始选定的k,也就是说一旦某一次操原创 2021-02-06 11:05:37 · 349 阅读 · 1 评论 -
幂塔个位数的计算(欧拉降幂板子)
https://ac.nowcoder.com/acm/contest/9981/H思路:欧拉降幂。由于没怎么接触,补一下这块知识。由于我们取个位数,所以对于本题目来说是mod10(p=10)至于欧拉降幂的递归形式,就是如下面两个图所示.举个小例子模拟一下:还有一个问题。我们都是整数,这个题这么大,怎么看取多少位呢。mod10递归几次就结束了,我们打不了取100层。对于这个底数a。我们要观察。对于其%2这一层,相当于判奇偶,只要知道个位。对于%4,则要..原创 2021-02-03 00:26:32 · 1402 阅读 · 4 评论 -
F. 1.小W 的质数(prime)[欧拉筛再理解]
Description小X是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感。小X认为,质数是一切自然数起源的地方。在小X的认知里,质数是除了本身和1以外,没有其他因数的数字。但由于小X对质数的热爱超乎寻常,所以小X同样喜欢那些虽然不是质数,但却是由两个质数相乘得来的数。 于是,我们定义,一个数是小X喜欢的数,当且仅当其是一个质数,或是两个质数的乘积。 而现在,小X想要知道,在L到R之间,有多少数是他喜欢的数呢?Input第一行输入一个正整数Q,表示询问的组数...原创 2021-01-30 17:49:28 · 329 阅读 · 0 评论 -
三分模板(update)
摘自网络:https://www.cnblogs.com/lukelmouse/p/12545973.html今天朋友打了南京的说板子锅了。整数的那个, midl和midr改下 ,然后重新赋值那边+-1的去掉。整数三分模板int l = 1,r = 100;while(l < r) { int lmid = l + (r - l) / 3; int rmid = r - (r - l) / 3; lans = f(lmid),rans = f(rmid);.原创 2020-12-20 18:47:44 · 249 阅读 · 4 评论 -
SP3267 DQUERY - D-query (求区间内不同数的个数-在线主席做法)
扫描序列建立可持续化线段树。对每个pos建立主席树。pos对应单点修改的位置,找到+=val;如果未出现,就赋值当前位置去找。不然先在root[i-1]基础上减去上次这个数字的贡献,再加这次这个数字的贡献。同时维护每一个元素上一次出现的位置。query的时候:每一个主席树维护的是1~i(当前位置)的不同数字有多少个。找到时候在root【r】中找,树中区间编号>=l的,就是1-r中,l~r的贡献所求。理解可以结合代码模拟一下样例。#include<iostream&.原创 2020-11-30 00:15:17 · 154 阅读 · 0 评论 -
SP10707 COT2 - Count on a tree II(求树中两点路径的不同颜色数量+树上莫队)
https://www.luogu.com.cn/problem/SP10707树上莫队板子。罗老师的思路:1、把树的结点用欧拉序转为一维数组 用DFS遍历树的结点,有两种遍历方式,得到两种欧拉序: (1)在每个结点第一次进和最后一次出都加进序列; (2)每遇到一个结点就把它加进序列。 这里用第(1)种形式的欧拉序。下图的例子,欧拉序:{1, 2, 2, 3, 5, 5, 6, 6, 7, 7, 3, 4, 8, 8, 4, 1}。图8 一棵树 (u, v)上的路径原创 2020-11-28 00:02:49 · 610 阅读 · 0 评论 -
P2617 Dynamic Rankings(动态区间第k大——树状数组套主席树)详解
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) cout<<#a<<"="<&...原创 2020-11-25 00:06:33 · 359 阅读 · 0 评论 -
P3038 [USACO11DEC]Grass Planting G(树链剖分边权转点权)
https://www.luogu.com.cn/problem/P3038给出一棵n个节点的树,有m个操作,操作为将一条路径上的边权加一或询问某条边的权值思路:边权转点权过程:参考罗老师如果把边权转为点权,就能按前面给出的“树链剖分 + 线段树”来解决。 例如下图(1),若把边权转为点权,显然只能把每条边上的边权赋给这条边下层的结点,得到图(2)。编程操作是:比较边(u, v)的两点的deep[u]、deep[v],把边权赋给更深的那个结点。图4 图(1)边权树原创 2020-11-20 19:44:46 · 300 阅读 · 0 评论 -
P3384 【模板】轻重链剖分(树链剖分建线段树维护板子)
https://www.luogu.com.cn/problem/P3384 内容参考罗老师的博客 重链,有重要特征:一条重链内部结点的DFS序是连续的。这个特征使得可以用数据结构(一般是线段树)来维护重链,从而高效率地解决一些树上的问题,例如以下问题: (1)修改点x到点y的路径上各点的权值。 (2)查询点x到点y的路径上结点权值之和。 (3)修改点x子树上各点的权值。 (4)查询点x子树上所有结点的权值之和。 其中的(1)是“树上差分”问题.树上差...原创 2020-11-20 18:32:58 · 415 阅读 · 0 评论 -
树链剖分求LCA板子
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#define debug(a) cout<<#a<<"="<&l...原创 2020-11-20 15:45:27 · 88 阅读 · 0 评论 -
Lomsat gelral(dsu on tree模板理解)
https://www.luogu.com.cn/problem/CF600E题意翻译有一棵nn个结点的以11号结点为根的有根树。 每个结点都有一个颜色,颜色是以编号表示的,ii号结点的颜色编号为c_ici。 如果一种颜色在以xx为根的子树内出现次数最多,称其在以xx为根的子树中占主导地位。显然,同一子树中可能有多种颜色占主导地位。 你的任务是对于每一个i\in[1,n]i∈[1,n],求出以ii为根的子树中,占主导地位的颜色的编号和。 n\le 10^5,c_...原创 2020-11-13 00:20:12 · 305 阅读 · 0 评论 -
brz的序列(思维+凸包构造等差序列)
https://ac.nowcoder.com/acm/contest/8282/C题意:多次操作使一个数变成旁边两个数的平均值,求序列中数字和最小是多少来自chsyao的详解:多次操作使一个数变成旁边两个数的平均值,求序列中数字和最小是多少。可以发现当一段区间变成等差数列后就不能再进行修改了。问题变为选定若干等差数列的首项末项,使数列和最小。又注意到一段区间能变成等差数列当且仅当这段区间除了首项末项以外的数都比变成等差数列后对应位置上的数大。于是可以转化问题,有n个点,坐标分别为...原创 2020-11-07 11:49:24 · 307 阅读 · 0 评论 -
E. Singhal and Numbers(质因数快速分解倍增优化版本)
https://codeforces.com/gym/102767/problem/E思路比较直接:套用大数质因数分解的板子。然而我威海的板子T了..没错板子T了。于是更新板子,去洛谷找了一个优化版本的。板子源自网络。这道题用时400ms,相当优秀。#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdio>原创 2020-11-04 23:22:28 · 259 阅读 · 0 评论 -
2020ccpc威海D题 ABC Conjecture(规律+pollard_rho大数质因数分解模板)
思路1:打表可得如果有两个以及以上的相同质因数,即可yes;/*来自:李双智学长模板*/#include<iostream>#include<cmath>#include<cstring>#include<algorithm>#include<cstdio>#include<map>#include<stdlib.h>#include<time.h>#define times 20us.原创 2020-10-27 20:19:04 · 770 阅读 · 0 评论 -
hdu 4417(区间内小于等于k的数字有多少)[主席树+二分)
Super Mariohdu 4417题目描述:给定一个整数序列,有n个数。有m个询问,询问区间[L,R]内小于k的整数有多少个。输入:第一行是整数T,表示测试用例个数。对每个测试,第一行是整数n,m。下一行是n个整数a1, a2, …, an,后面有m行,每行有3个整数L、R、k。输出:对每个测试用例,输出m行,每行是一个询问的答案。数据范围:1 ≤ n, m ≤ 105, 0 ≤ ai ≤10^5, 1 ≤ L ≤ R ≤ n,1 ≤ ai, k ≤10^9思路:主席树+二分。对于给定的H,.原创 2020-10-24 00:23:36 · 358 阅读 · 0 评论 -
P3834 【模板】可持久化线段树 2(主席树)[模板]
主席树学习链接:https://blog.csdn.net/weixin_43914593/article/details/108861279#comments_13569118静态区间第k小板子:#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set&原创 2020-10-24 00:16:41 · 161 阅读 · 0 评论 -
ACM Contest and Blackout(非严格次小生成树板子+LCA)
https://vjudge.net/problem/UVA-10600/origin板子题。求非严格次小生成树树有大致有两种。一种是暴力,枚举不在最小生成树的边,然后跑n-1次最小生成树。(O(n^2logn)大致)或者dfs找最小生成树环上的最长边替换掉。借xayata_大佬的图。优化的办法就是在最小生成树中,看成一颗树,然后化成有根树,用倍增的思路融合ST的思路,维护u,v的lca(u,v)的最长边。一个倍增数组记录父亲,一个倍增数组记录(u,lca(u,v))之间的最长边原创 2020-10-05 20:43:45 · 164 阅读 · 0 评论 -
点双连通分量(模板)
void tarjan2(LL x){ dfn[x]=low[x]=++times; s.push(x); LL child=0; if(fa[x]==-1&&g[x].size()==0){ dcc[++cnt].push_back(x); return; } for(LL i=0;i<g[x].size();i++){ LL to=g[x][i]; if(!dfn[to]) { fa[to]=x;child++; tarjan2(to.原创 2020-10-04 18:31:53 · 182 阅读 · 0 评论 -
VIRUS OUTBREAK(高精度+斐波那契数列)
https://ac.nowcoder.com/acm/contest/7818/J关于斐波那契的高精度其实不必用那么复杂大整数板子,参考蜜蜂路线那题写个单纯的高精度加法就好了。#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <string>#include <map&原创 2020-10-02 20:13:12 · 494 阅读 · 0 评论 -
SUM OF SUB RECTANGLE AREAS(打表+oeis+c++大数类板子)
https://ac.nowcoder.com/acm/contest/7818/F思路:打表发现是平方数。去掉平方之后发现是组合数。把组合数拆开发现就是n*(n+1)*(n+2)/6的整体平方。赛中队友python过的(python牛逼!#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include &原创 2020-10-02 19:58:42 · 327 阅读 · 0 评论 -
B - Network(tarjan求割点和桥板子)
https://www.luogu.com.cn/problem/UVA315板子:#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>#def原创 2020-09-30 17:10:50 · 225 阅读 · 0 评论 -
int_128(读写板子)
#include <bits/stdc++.h>using namespace std;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'&&.原创 2020-09-17 09:30:22 · 499 阅读 · 0 评论 -
kmp板子(2.0)
typedef long long LL;int nxt[maxn];int a[maxn],b[maxn];int p[maxn+10];//模式 int s[maxn+10];//文本 int n,w;void build(int s[],int n)//构造nxt数组相当于把匹配串错开一位自己进行比较{ int k=0;nxt[0]=0; for(int i=1;i<n;i++) { while(k&&s[i]!=.原创 2020-09-17 09:18:47 · 97 阅读 · 0 评论 -
dijkstra板子
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<algorithm>using namespace std;const int maxn=1e5;typedef long long LL;typedef pair<int,int>P;///first最短距离,second顶点的编号 struct edge{ int.原创 2020-09-17 09:14:20 · 110 阅读 · 0 评论 -
C. Link Cut Centroids(求树的重心)
https://codeforces.com/contest/1406/problem/C做这个题前提是要知道树的重心。百度拉了一下。引用一下:https://blog.csdn.net/weixin_43810158/article/details/88391828树的重心定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。如下图,当去掉点1后,树将分成两个连通块:(2,4,5),(3,6,7),则最大的连通块包含节点个数为3。若原创 2020-09-13 09:24:21 · 2886 阅读 · 2 评论 -
ST表查询区间最大最小值下标[模板]
issue哥哥的quq上次用过应该没锅~#include <bits/stdc++.h>using namespace std;const int maxn=2e5+10;int n,m;int a[maxn][23],b[maxn][23],numa[maxn][23],numb[maxn][23];void init(){ for(int j=1;j<=21;j++) for(int i=1;i+(1<<j)-1<=n;i++) { i原创 2020-09-17 09:07:16 · 277 阅读 · 0 评论 -
倍数法求正约数集合
题意:求1-N每个数的正约数集合,如果用O(sqrt(n))的试除法去做,总复杂度O(Nsqrt(N))复杂度太高,当N=1e6的时候就卡了思路:反过来考虑,对于每个数d,1-N中以d为约数的数就是d的倍数d,2d,3d,4d…[N/d]*d;时间复杂度O(NlogN):怎么算?N+N/2+N/3+N/4+N/5+N/6+….N/N=N(1+1/2+1/3+1/4+1/5+…..1/N)=O(NlogN)后面是个调和级数,关于调和级数的和大致的答案我之前有写http://www.yyyc原创 2020-07-21 17:24:12 · 252 阅读 · 0 评论 -
质因数分解板子
对2-sqrt(n)每个数d进行扫描,如果d|n,则d是n的因子,则从N中除去所有的因子d,同时累计除去的d的个数。因为一个合数的因子一定会在扫描到这个合数之前就从N中被去除,所有筛出来的是质数。举个例子: 20,当从2开始的时候,就会把2的倍数都剔除了。20–>10–>5,直到不能被2除#include<iostream>#include<vector>#include<queue>#include<cstring>#inc原创 2020-07-21 12:29:26 · 268 阅读 · 0 评论 -
组合数板子
typedef long long ll;using namespace std;const int MAXN=2e5+50;const int inf=0x3f3f3f3f;const int M=5000*4;const int mod=998244353;ll fac[MAXN];ll quick(ll a,ll b){ ll ans=1; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod; .原创 2020-08-16 21:06:11 · 249 阅读 · 0 评论 -
P2341 [USACO03FALL][HAOI2006]受欢迎的牛 G(缩点)
https://www.luogu.com.cn/problem/P2341题目背景本题测试数据已修复。题目描述每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果AA喜欢BB,BB喜欢CC,那么AA也喜欢CC。牛栏里共有NN头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。输入格式第一行:两个用空格分开的整数:NN和MM。接下来MM行...原创 2020-08-24 14:58:06 · 306 阅读 · 0 评论 -
D. Good Substrings(双模数哈希)
https://codeforces.com/problemset/problem/271/DYou've got strings, consisting of small English letters. Some of the English letters aregood, the rest arebad.A substrings[l...r](1 ≤ l ≤ r ≤ |s|) of strings = s1s2...s|s|(where|s|is the len...原创 2020-08-29 15:20:36 · 681 阅读 · 0 评论 -
P3373 【模板】线段树 2
#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1e5+10;typedef long long LL;struct SegmengTree{ LL.原创 2020-09-17 08:56:08 · 89 阅读 · 0 评论 -
P3372 【模板】线段树 1
题目描述如题,已知一个数列,你需要进行下面两种操作:将某区间每一个数加上kk。 求出某区间每一个数的和。输入格式第一行包含两个整数n, mn,m,分别表示该数列数字的个数和操作的总个数。第二行包含nn个用空格分隔的整数,其中第ii个数字表示数列第ii项的初始值。接下来mm行每行包含33或44个整数,表示一个操作,具体如下:1x y k:将区间[x, y][x,y]内每个数加上kk。 2x y:输出区间[x, y][x,y]内每个数的和。...原创 2020-07-08 21:57:23 · 134 阅读 · 0 评论 -
Vasiliy‘s Multiset(字典树)
https://www.luogu.com.cn/problem/CF706Dhttps://codeforces.com/problemset/problem/706/D题目描述Author has gone out of the stories about Vasiliy, so here is just a formal task description.You are givenqqqueries and a multisetAA, initially containing ...原创 2020-08-29 15:17:15 · 250 阅读 · 0 评论 -
P3376 【模板】网络最大流
最大流EK板子对板子的一个小优化。取edge的时候多加一个const.从洛谷的500ms吸氧气加到260ms#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<cstdio>#include<algorithm>#define debu原创 2020-08-09 20:49:31 · 118 阅读 · 0 评论 -
线性筛
核心思想:对于埃式筛法有重合的地方,线性筛令每个数被他的最小质因子筛去,这样就不会有重的地方了。时间复杂度O(n)模拟:i 2 3 4 5 6 7 8 9 10P<=v[i] 2 2,3 2 2,3,5 2 2,3,5,7 2 2,3 2筛去的数(i*p) 4 6,9 8 10,15,25 12 14,21,35,49 19 18,27 20达到每个数只被他的最小质因子筛去的目的。比如这个10被2筛去,这个15被3筛去,这个21被3筛去板子:#include<ios原创 2020-07-21 11:59:49 · 232 阅读 · 0 评论 -
LCA模板
源自网络树差分 & 倍增LCA// 链式前向星// maxn不要随便开很大 -> 容易MLEconst int maxn = 4e4 + 5;// 存无向边 -> 边要开两倍const int maxm = (maxn - 1) << 1;// 与maxn有关// 1e6 -> 21// 4e4 -> 17// 1e3 -> 11const int maxLog = 17;// 起始边int node[maxn];原创 2020-07-15 23:55:51 · 763 阅读 · 0 评论