ACM模板
模板收集
mαgic
这个作者很懒,什么都没留下…
展开
-
LCA(最近公共祖先)模板
LCA模板原创 2022-07-14 18:52:13 · 130 阅读 · 1 评论 -
Pollard-rho(大整数质因子分解)
vector<ll> fac;ll quick_mult(ll a, ll b, ll mod) { ll ans = 0; while(b) { if(b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1; } return ans;}ll quick_pow(ll a, ll n, ll mod) { ll ans =原创 2021-11-06 13:24:04 · 270 阅读 · 0 评论 -
dsu on tree(树上启发式合并)
需要合并子树信息时,暴力解法复杂度为O(n^2),dsu on tree可以做到将复杂度降低为O(nlogn)。主要思想:例题 现在有一棵树,每个节点涂有一个颜色。需要统计每颗子树上哪种颜色最多。算法流程:1. 另外写dfs找到各节点重儿子;2. 统计轻儿子信息,记录答案;3. 统计重儿子信息记录答案,并保留信息。4. 将轻儿子信息加入记录;5. 加入父节点信息,统计答案。int n;//size of treevector<int> tree[maxn];int colo原创 2021-11-02 11:58:01 · 253 阅读 · 2 评论 -
矩阵快速幂
const ll mod = 1e9+7;const int maxn = 1e3+5;ll a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];void mulaa(int n){ memset(c,0,sizeof(c)); for(int ii=1;ii<=n;ii++){ for(int jj=1;jj<=n;jj++){ ll tp=0; for(int i=1;i<=n;i++){ tp+=((a[ii][i]%原创 2021-10-27 16:20:37 · 85 阅读 · 0 评论 -
后缀数组(求字符串后缀字母序大小排行)
//时间复杂度O(nlogn)const int maxn = 1e6+5;int n,m,rk[maxn],tp[maxn],sa[maxn],num,tax[maxn];char s[maxn]; //字符串从1开始void Rsort(){ for(int i=0;i<=m;i++)tax[i]=0; for(int i=1;i<=n;i++)tax[rk[tp[i]]]++; for(int i=1;i<=m;i++)tax[i]+=tax[i原创 2021-10-25 19:39:11 · 104 阅读 · 0 评论 -
一维差分、二维差分
一维int a[maxn],b[maxn];void insert(int l,int r,int c) //[l,r]同时加c{ b[l]+=c; b[r+1]-=c;}二维int a[maxn][maxn], b[maxn][maxn];void insert(int x1,int y1,int x2,int y2,int c) //[x1,y1] - [x2,y2]同时加c{ b[x1][y1] += c; b[x1][y2+1] -=c; b[x原创 2021-10-03 19:33:17 · 89 阅读 · 0 评论 -
主席树(区间第k小)
const int maxn = 2e5+5;int cnt;struct node{ int L, R;//分别指向左右子树 int sum;//该节点所管辖区间范围内数的个数 node(){ sum = 0; }}Tree[maxn * 20];int root[maxn];//多颗线段树的根节点void init() { cnt = 1; root[0] = 0; Tree[0].L = Tree[0].R = Tr原创 2021-10-01 16:07:02 · 91 阅读 · 0 评论 -
中国剩余定理
注意排除不可行的答案:ll exgcd(ll a,ll b,ll &x,ll &y) { if(b == 0) { x = 1,y = 0; return a; } else { ll res = exgcd(b,a%b,x,y); ll t = x; x = y; y = t - a / b * y; return res; }}ll excrt(ll m1,ll m2,ll a1,ll a2) { //m为余数 ll x,y,c,g; c =原创 2021-09-28 14:13:07 · 63 阅读 · 0 评论 -
排列组合模板C(m,n)
const ll mod = 998244353;const ll maxn = 1e5+5;ll f[maxn],inv[maxn];ll qpow(ll a,ll b){ ll ans=1; while(b) { if(b&1)ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans%mod;}void init(){ f[0]=inv[0]=1; for(ll i=1; i<maxn; i++) {原创 2021-07-16 17:08:19 · 350 阅读 · 0 评论 -
逆元
求解n关于m的逆元( n*x = 1 mod m );int exgcd(int a,int b,int &x,int &y){ if(b==0) { x=1,y=0; return a; } int r = exgcd(b,a%b,x,y); int t = x; x = y; y = t - a/b*y; return r;}int inv(int n,int m){原创 2021-05-18 15:12:24 · 95 阅读 · 0 评论 -
ST表(静态区间最值)
int a[maxn];int maxsum[maxn][20],minsum[maxn][20];void RMQ(int num){ //共num个数 for(int i=1;i<=num;i++) maxsum[i][0] = minsum[i][0] = a[i]; for(int j=1;j<20;j++){ for(int i=1;i<=num;i++){ if(i+(1<<j)-1 &l原创 2021-04-26 12:32:12 · 176 阅读 · 1 评论 -
线段树(动态区间最值)
const int inf = 0x7fffffff;const int maxn = 2e5 + 10;int a[maxn];int tree[maxn << 2], lz[maxn << 2];inline int max(int a, int b) { return a > b ? a : b; }void build(int i, int l, int r) { //建树操作,初始化时应将i置为1 if (l == r) { t原创 2021-04-25 22:00:35 · 220 阅读 · 0 评论 -
求单个整数质因数个数(无重复)
用于计算单个整数的质因数个数,无视重复的质因数。const int maxv = 2e7+5; //注意修改maxv数值int mind[maxv],val[maxv];void init(){ for(int i=1;i<maxv;i++) mind[i] = -1; mind[1] = 1; for(int i=2;i<maxv;i++){ if(mind[i] == -1){ for(int j=i;j<=maxv原创 2021-03-21 15:50:52 · 277 阅读 · 0 评论 -
快速幂模板
int quick_pow(int a,int b){ int ans = 1; for(int i = 0;i < b;i++){ ans *= a; } return ans;原创 2021-03-09 20:13:06 · 77 阅读 · 0 评论 -
并查集模板
int fa[maxn];int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]);}void unit(int u,int v){ int xx = find(u); int yy = find(v); if(xx != yy){ fa[xx] = yy; }}原创 2021-03-07 16:07:46 · 82 阅读 · 0 评论 -
线段树模板
注意每次测试数据后的数据清空//单点修改为直接修改,区间修改为一起加某值struct Node{ int l,r; int lazy,sum;}Sum[MAXN<<2]; //树int num[MAXN]; //原数组(下标从1开始)void update(int index){ //区间和计算函数 Sum[index].sum = Sum[index<<1].sum+Sum[index<<1|1].sum;}void bu原创 2021-01-14 18:20:40 · 142 阅读 · 0 评论 -
线性筛模板(筛取从1-n的素数)
线性筛const int maxn = 1e5+5; //注意修改maxn数值int vis[maxn],prime[maxn],tol;void liner_shai(){ memset(vis,0,sizeof(vis)); for(int i=2;i<maxn;i++){ if(!vis[i]) prime[tol++] = i; for(int j=0;j<tol&&i*prime[j]<原创 2021-02-22 20:55:41 · 120 阅读 · 0 评论