模板
qq_45778406
这个作者很懒,什么都没留下…
展开
-
Mike and Friends(后缀数组 + 线段树)
题意:给你n个字符串,和x, y, k, 问你从第x个字符串到第y个字符串中一共有多少个这些字符串的子串和第k个字符串相等。思路:参考题解, 也可以等价转换为求和第k个字符串相等的子串有多少,根据后缀数组定义我们可以在我们可以求所有和s[k]相等的子串的数量,定义母串为所有字符串拼起的字符串(因为sa[i]是按照字典序排序的结果, 我们只需以s[k]母串中的位置为中心P,分别求出LCP(L,P)==len(s[k]),LCP(P,R)==len(s[k])LCP(L, P) == len(s[k]), L原创 2021-05-10 21:21:56 · 227 阅读 · 0 评论 -
Sightseeing HDU - 1688(最短路 + 次最短路)
题意:给你一个有向带权图, 让你求出最短路条数, 如果次最短路的距离 = 最短路 + 1, 那么结果再加上次最短路的条数板子题:#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int inf = 0x3f3f3f3f;int h[N], e[N<<2], ne[N<<2], f[N<<2], cnt;void add(int u, int v, int w)原创 2021-05-09 20:37:45 · 118 阅读 · 0 评论 -
线段树模板(区间修改, 区间求和)
#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#define N 100005#define ll long long int#define lowbit(i) (i & -i)using namespace std;ll tree[4 * N], lazy[4 * N], a[4 * N];原创 2021-04-17 17:24:53 · 195 阅读 · 0 评论 -
KMP模板
#include <iostream>using namespace std;const int N = 1e5+5, M = 1e6+5;int n, m;char s[N], p[M];int ne[N];int main() { cin >> n >> p + 1 >> m >> s + 1; // 求ne数组过程,其实就是自己匹配自己的过程 for (int i = 2, j = 0;原创 2021-04-14 16:43:37 · 71 阅读 · 0 评论 -
后缀数组模板RMQ
Link#include <bits/stdc++.h>#include <cstring>#include <algorithm>using namespace std;const int N = 1000010;int n, m;char s[N];int sa[N], x[N], y[N], c[N], rk[N], height[N];//sa[i]排名为i的后缀是哪一个void get_sa(){ for(int i = 1; i &原创 2021-03-31 19:18:52 · 146 阅读 · 0 评论 -
大数模板,刘汝佳支持负数
已重载的运算符,转载支持负数运算符类型 运算符双目运算符 +(加), -(减), *(乘), /(整除), %(取模)关系运算符 ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)逻辑运算符 ||(逻辑或), &&(逻辑与), !(逻辑非)单目运算符 +(正), -(负)自增自减运算符 ++(自增), –(自减)赋值运算符 =, +=, -=, *=, /=, %转载 2021-03-18 20:07:46 · 135 阅读 · 0 评论 -
AC自动机模板(HDU - 2222)
题目描述给定 n 个长度不超过 50 的由小写英文字母组成的单词准备查询,以及一篇长为 m 的文章,问:文中出现了多少个待查询的单词。多组数据。输入格式第一行一个整数 T,表示数据组数;对于每组数据,第一行一个整数 n,接下去 n 行表示 n 个单词,最后一行输入一个字符串,表示文章。输出格式对于每组数据,输出一个数,表示文中出现了多少个待查询的单词。输入样例15shehesayshrheryasherhs输出样例3数据范围对于全部数据,1≤n≤104,1≤m≤原创 2021-03-16 20:59:10 · 213 阅读 · 0 评论 -
Country Meow Gym - 101981D (最小覆盖球, 爬山法)
#include <bits/stdc++.h>using namespace std;typedef double db;const int N = 1e5+ 10;struct node{ db x, y, z;}q[N];db r = 1e8;int n;double get_dist(node a, node b){ db dx = a.x - b.x, dy = a.y - b.y, dz = a.z - b.z; return dx *原创 2021-03-12 18:30:32 · 143 阅读 · 0 评论 -
利用差分求非齐次多项式的通项公式
as原创 2021-03-12 17:12:07 · 566 阅读 · 0 评论 -
星星还是树(模拟退火)
LINK在二维平面上有 n 个点,第 i 个点的坐标为 (xi,yi)(x_i,y_i)(xi,yi)。请你找出一个点,使得该点到这 n 个点的距离之和最小。该点可以选择在平面中的任意位置,甚至与这 n 个点的位置重合。输入格式第一行包含一个整数 n。接下来 n 行,每行包含两个整数 xi,yi,表示其中一个点的位置坐标。输出格式输出最小距离和,答案四舍五入取整。数据范围1≤n≤1001≤n≤1001≤n≤100,0≤xi,yi≤100000≤xi,yi≤100000≤xi,yi≤原创 2021-03-10 19:46:25 · 234 阅读 · 0 评论 -
求n!中因子k的个数
n!=(k^m)*(m!)*a 其中k是该因子,m=n/k,a是不含因子k的数的乘积下面推导这个公式n!=n∗(n−1)∗(n−2)∗......3∗2∗1n!=n*(n-1)*(n-2)*......3*2*1n!=n∗(n−1)∗(n−2)∗......3∗2∗1=(k∗2k∗3k.....∗mk)∗a=(k*2k*3k.....*mk)*a=(k∗2k∗3k.....∗mk)∗a a是不含因子k的数的乘积,显然m=n/k;m=n/k;m=n/k;=(km)∗(1∗2∗3...∗m)原创 2021-03-09 16:33:04 · 176 阅读 · 0 评论 -
大素数判断和素因子分解(miller-rabin,Pollard_rho算法)
转载来自#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<iostream>#include<algorithm>using namespace std;#define ll long long//*********************************************************转载 2021-03-09 11:23:39 · 258 阅读 · 0 评论 -
最小覆盖圆模板(二维)
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int N=5005;int n;double r;struct dian{ double x,y; dian(double X=0,double Y=0) { x=X,y=Y; } dian operator + (const dian &a原创 2021-03-07 20:31:14 · 139 阅读 · 0 评论 -
Kill the tree(树的重心,合并子树)
Link大概题意:给一个nnn个点的树, 求每个子树的重心, 如果子树的重心不止一个, 就按照升序以空格分割。重心性质1,以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。2,树中所有点到某个点的距离和中,到重心的距离和是最小的;如果有两个重心,那么到它们的距离和一样。3,把两棵树通过一条边相连得到一棵新的树,那么新的树的重心在连接原来两棵树的重心的路径上。4,在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。5,树的重心最多只有两个, 且两个重心相邻。思路参考题解原创 2021-03-05 16:59:38 · 312 阅读 · 0 评论 -
01字典树
可持续01字典树#include <bits/stdc++.h>using namespace std;#define ll long longconst ll N = 260005;vector<int> q[N];int n, m, t, a[N], id[N], rt[N], st[N], ed[N], b[N];struct node{ int cnt; int ch[N * 32][2], sum[N * 32]; void init() {原创 2021-03-04 00:36:38 · 109 阅读 · 1 评论 -
矩阵快速幂模板
#include <bits/stdc++.h>using namespace std;#define ll long longconst ll mod = 1e9 + 7;const int N = 4; // 阶数struct Matrix{ ll m[N][N]; Matrix(){memset(m, 0, sizeof m);} Matrix operator * (const Matrix &y) const { Matrix z; for(int原创 2021-03-02 20:54:53 · 63 阅读 · 0 评论 -
高斯消元解线性方程组
#include <bits/stdc++.h>using namespace std;const int N = 110;const double eps = 1e-7;double a[N][N];int n;int gauss(){ int c, r; for (c = 0, r = 0; c < n; c ++ ) { // 选择绝对值最大的做主元 int t = r; for (int i原创 2021-03-02 16:42:10 · 103 阅读 · 0 评论 -
1~n约数和
求1 ~ n 的约数和n\sqrt{n}n的方法整除分块#include <bits/stdc++.h>using namespace std;#define ll long longconst ll N = 1e7 + 10;ll f[N];ll get_Y(ll x) // 求1 ~ n的约数和不包括(1, 和本身){ ll m = sqrt(x); ll sum = 0; for(int i = 2; i <= m; i++) { ll tmp =原创 2021-03-01 22:06:46 · 243 阅读 · 0 评论 -
组合数问题(复数快速幂, 组合数)
牛客思路参考题解, 众所周知组合数是满足二项式定理的, 这里有:(x+y)n=Cn0x0yn+Cn1xyn−1+...+Cnn−1xn−1y+Cnnxny0( x + y )^n = C _n^0 x_0 y _n + C _n^ 1 x y^ {n − 1} + . . . + C _n ^{n − 1} x_ {n − 1} y + C_ n^ n x _n y _0(x+y)n=Cn0x0yn+Cn1xyn−1+...+Cnn−1xn−1y+Cnnxny0考虑复数有i1=原创 2021-02-27 01:02:34 · 295 阅读 · 0 评论 -
int128模板
不支持本地编译除非是linux系统, 支持scanf(但不能过大)在使用时可以先用int调试,最后#define int __int128#include <bits/stdc++.h>using namespace std;#define ll __int128#define ptsd puts("")ll read(){ ll x = 0 ,f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-'原创 2021-02-25 22:17:33 · 270 阅读 · 0 评论 -
组合数, lucas
隔板法LINKC(n, m, p) n 个元素中选 m个 的方法数 模pLucas 应用范围Cnm%p, n<1019,p<106, p必须是质数C_n^m\% p , ~~~~~~ n < 10^{19} , p < 10^6,~~~~~~~~p必须是质数Cnm%p, &nb原创 2021-02-24 00:39:05 · 180 阅读 · 0 评论 -
距离(lca,倍增, tarjan)
Link给出 n个点的一棵树,多次询问两点之间的最短距离。注意:边是无向的。所有节点的编号是 1,2,…,n。输入格式第一行为两个整数 n和 m。n 表示点数,m表示询问次数;接下来 n−1行,每行三个整数 x,y,k,表示点 x 和点 y 之间存在一条边长度为 k;再接下来 m行,每行两个整数 x,y,表示询问点 x 到点 y的最短距离。树中结点编号从 1到 n。输出格式共 m行,对于每次询问,输出一行询问结果。数据范围2≤n≤1042≤n≤1042≤n≤104,1≤m原创 2021-02-23 00:56:08 · 135 阅读 · 0 评论 -
Looooops(线性同余方程, exgcd)
题目描述一个C语言的for循环: for(int i=A;i!=B;i+=C)st;其中i表示变量,A、B和C分别表示初值、终值和步长,st表示循环体。要求计算当循环变量i运算在k位无符号整数体系下(运算值范围:0~2^k-1,此时,i+=c溢出后截断),循环体st会执行多少次?输入格式输入每组数据包括4个整数A,B,C和k。输出格式对于每组数据,输出循环次数,如果永远不能结束,输出FOREVER。输入样例1 3 2 41 5 2 41 2 4 30 0 0 0输出样原创 2021-02-17 22:49:08 · 200 阅读 · 0 评论 -
永无乡(splay,启发式合并)
题面永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b,则称岛 a 和岛 b 是连 通的。现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥。Q x k 表示询问当前与岛 x连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪 座,请你输出那个原创 2021-02-02 11:31:45 · 228 阅读 · 0 评论 -
郁闷的出纳员(splay, 树状数组可做)
题面OIER公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回来了。每位员工原创 2021-02-01 00:33:30 · 118 阅读 · 0 评论 -
文艺平衡树(splay模板)
题目描述这是一道模板题。您需要写一种数据结构(可参考题目标题),来维护一个序列,其中需要提供以下操作:翻转一个区间,例如原有序序列是 5 4 3 2 1,翻转区间是 [2,4] 的话,结果是 5 2 3 4 1。输入格式第一行为 n,m,n 表示初始序列有 n 个数,这个序列依次是 1,2,…n−1,n,m 表示翻转操作次数。接下来 m 行每行两个数 [l,r],数据保证 1≤l≤r≤n。输出格式输出一行 n 个数字,表示原始序列经过 m 次变换后的结果。样例Input5 31 3原创 2021-01-31 18:09:11 · 156 阅读 · 0 评论 -
Godfather(树形dp,求重心模板)
题目描述给一棵树,求树的重心名词解释删除一个点,使得形成的多棵树中节点数最大的树的节点数最小。这个点即为树的重心。输入格式一行一个整数n,即树的节点个数(n<=5*10^4)接下来n-1行,每行两个整数,表示树上一条边。输出格式如果有多个重心,则按编号从小到大依次输出样例输入61 22 32 53 43 6样例输出2 3提示卡vector,建议用手写的链式前向星或邻接表思路:模板直接写即可,两种做法1.两次扫描法#include <algor原创 2021-01-23 17:15:27 · 234 阅读 · 1 评论 -
String painter(区间dp难)
题目描述有两个长度相等,都只由小写字母构成的字符串A和B. 现在你有一把充满魔♂力的刷子。使用这把刷子,你可以把字符串中连续的一段区间刷♂成一个相同的字符,例如,对于字符串"vandarkholme",把区间[3,6]刷成’d’,可以变成"vanddddholme"。现在你要用这把刷♂子把字符串A变成B,最少要刷多少次?输入多组数据,每组数据都有两行:第一行是字符串A.第二行是字符串B.字符串长度不超过100.输出在单独的一行中输出结果样例输入zzzzzfzzzzzabcdefed原创 2021-01-22 20:52:00 · 390 阅读 · 0 评论 -
min25筛
用于求积性函数 [公式] 的前 [公式] 项和,要求 [公式] 在素数处为一多项式,在素数的整数幂处可以直接求值。作者:Artiprocher链接:https://www.zhihu.com/question/379824357/answer/1088257294来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。#define rep(i,a,b) for(ll i=a;i<=b;i++)typedef long long ll;class Multipli原创 2021-01-22 11:47:50 · 74 阅读 · 0 评论 -
欧拉函数
vector<ll> factors(ll x){ vector<ll> fac; ll y=x; for(ll i=2;i*i<=x;i++){ if(y%i==0){ fac.push_back(i); while(y%i==0)y/=i; if(y==1)return fac; } } if(y!=1)fac.push_back(原创 2021-01-22 11:42:47 · 71 阅读 · 0 评论 -
组合数取余[C(n,m) %p]
如果 n, m很小(不超过50),可以用C++的库函数 double tgamma(double x) ,这是一个欧拉积分.ll C(ll n,ll m){ return (ll)round(tgamma(n+1)/tgamma(m+1)/tgamma(n-m+1));}如果 n, m比较大,可以开 O(n)的空间,可以利用逆元来求解,当然,要保证 p 是素数const ll mo=1e9+7;ll C(ll n,ll m){ static ll M=0,inv[N],mul[原创 2021-01-22 11:28:52 · 383 阅读 · 0 评论 -
判断质数
下面的模板是 kn + i,, k == 30的版本bool isPrime(ll n){ if(n==2||n==3||n==5)return 1; if(n%2==0||n%3==0||n%5==0||n==1)return 0; ll c=7,a[8]={4,2,4,2,4,6,2,6}; while(c*c<=n)for(auto i:a){if(n%c==0)return 0;c+=i;} return 1;}...原创 2021-01-22 11:19:01 · 177 阅读 · 0 评论 -
线性筛
void getPrime(bool p[],int n){ for(int i=1;i<=n;i++)p[i]=true; p[1]=false; for(int i=2;i<=n;i++){ if(p[i]){ for(int j=i+i;j<=n;j+=i)p[j]=false; } }}原创 2021-01-22 11:13:38 · 74 阅读 · 0 评论 -
网络流关键路径
#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 510, M = 10010, INF = 1e8;int n, m, S, T;int h[N], e[M], f[M], ne[M], idx;int q[N], d[N], cur[N];bool vis_s[N], vis_t[N];void add(int原创 2020-12-17 21:55:57 · 214 阅读 · 0 评论 -
Dinic/ISAP求最大流
给定一个包含 n 个点 m条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点 S到点 T的最大流。输入格式第一行包含四个整数 n,m,S,T。接下来 m行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。点的编号从 1到 n。输出格式输出点 S到点 T的最大流。如果从点 S无法到达点 T 则输出 0。数据范围2≤n≤10000,1≤m≤100000,0≤c≤10000,S≠T输入样例:7 14 1 71 2原创 2020-12-07 23:17:30 · 170 阅读 · 0 评论 -
EK求最大流
给定一个包含 n 个点 m条边的有向图,并给定每条边的容量,边的容量非负。图中可能存在重边和自环。求从点 S到点 T的最大流。输入格式第一行包含四个整数 n,m,S,T。接下来 m行,每行三个整数 u,v,c,表示从点 u 到点 v 存在一条有向边,容量为 c。点的编号从 1 到 n。输出格式输出点 S到点 T的最大流。如果从点 S无法到达点 T 则输出 0。数据范围2≤n≤1000,1≤m≤10000,0≤c≤10000,S≠T输入样例:7 14 1 71 2 51 3转载 2020-12-07 23:14:58 · 110 阅读 · 0 评论