【模板】ccpc板子库

news/2025/11/10 18:20:11/文章来源:https://www.cnblogs.com/GSNforces/p/19207870

字符串

KMP

#include<bits/stdc++.h>
#define N 1000010
#define fo(a, b, c) for(int b = a; b <= c; b++)
using namespace std;
int n, m, b[N];
string s, t; 
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> s >> t;n = s.size(), s = " " + s;m = t.size(), t = " " + t;for(int i = 2, j = 0; i <= m; i++){while(j && t[i] != t[j + 1]) j = b[j];if(t[j + 1] == t[i]) j++;b[i] = j;}for(int i = 1, j = 0; i <= n; i++){while(j && t[j + 1] != s[i]) j = b[j];if(t[j + 1] == s[i]) j++;if(j == m){cout << i - j + 1 << "\n";j = b[j];}}fo(1, i, m) cout << b[i] << ' '; return 0;
}

Manacher

#include<bits/stdc++.h>
#define N 22000010
#define fo(a, b, c) for(int b = a; b <= c; b++)
using namespace std;
int n, id, mx, p[N], ans = 0;
char a[N], ch[N];
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);ch[0] = '~';cin >> a + 1, n = strlen(a + 1);fo(1, i, n) ch[2 * i] = a[i];fo(1, i, n + 1) ch[2 * i - 1] = '#';n = n * 2 + 1;mx = 0, id = 0;fo(1, i, n){if(i <= mx) p[i] = min(p[id * 2 - i], mx - i + 1); else p[i] = 1;while(ch[i + p[i]] == ch[i - p[i]]) ++p[i];if(p[i] + i - 1 > mx) mx = i + p[i] - 1, id = i;ans = max(ans, p[i] - 1);}cout << ans;return 0;
}

图论

树论

点分治

#include<bits/stdc++.h>
#define Fo(a, b) for(auto a : b)
#define fo(a, b, c) for(int b = a; b <= c; b++)
#define pb push_back
#define INF 2147483647
#define N 10000010
using namespace std;
struct node{int v, w;
};
int n, m, q[N];
int sz[N], mx[N], rt, s, dis[N], t[N];
bool vis[N], f[N];
vector<node>e[N];
vector<int>d, rec;
void get(int u, int fa){sz[u] = 1, mx[u] = 0;Fo(to, e[u]){if(to.v == fa || vis[to.v]) continue;get(to.v, u);sz[u] += sz[to.v];mx[u] = max(mx[u], sz[to.v]);}mx[u] = max(mx[u], s - sz[u]);if(mx[u] < mx[rt]) rt = u;
} 
void getd(int u, int fa){d.pb(dis[u]);Fo(to, e[u]){if(to.v == fa || vis[to.v]) continue;dis[to.v] = dis[u] + to.w;getd(to.v, u);}
}
void calc(int u){rec.clear();Fo(to, e[u]){if(vis[to.v]) continue;d.clear(), dis[to.v] = to.w, getd(to.v, u);Fo(x, d){fo(1, i, m)if(q[i] >= x) t[i] |= f[q[i] - x];  			}Fo(x, d) rec.pb(x), f[x] = 1;}Fo(x, rec) f[x] = 0;
}
void solve(int u){vis[u] = f[0] = 1;calc(u);Fo(to, e[u]){if(vis[to.v]) continue;s = sz[to.v], mx[rt = 0] = INF, get(to.v, 0);solve(rt);}
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> m;fo(1, i, n - 1){int u, v, w; cin >> u >> v >> w;e[u].pb((node){v, w}), e[v].pb((node){u, w});}fo(1, i, m) cin >> q[i];mx[rt = 0] = INF, s = n, get(1, 0);solve(rt);fo(1, i, m){if(t[i]) cout << "AYE" << endl;else cout << "NAY" << endl;}return 0;
}

虚树

#include<bits/stdc++.h>
#define N 1000010
#define INF 2147483647
#define int long long
using namespace std;
int n, m, h[N];
int cnt = 0, head[N], Head[N], Cnt = 0;
int tim, f[N][30], dep[N], d[N][30], dfn[N], dp[N];
bool vis[N];
struct edge{int to, next, w;
}e[N << 2], E[N << 2];
void add(int x, int y, int w){e[++cnt].to = y;e[cnt].next = head[x];e[cnt].w = w;head[x] = cnt;
}
void Add(int x, int y, int w){E[++Cnt].to = y;E[Cnt].w = w;E[Cnt].next = Head[x];Head[x] = Cnt;
}
void dfs(int u, int fa){dep[u] = dep[fa] + 1, dfn[u] = ++tim, f[u][0] = fa;for(int i = 1; i <= 20; i++)f[u][i] = f[f[u][i - 1]][i - 1], d[u][i] = min(d[u][i - 1], d[f[u][i - 1]][i - 1]);for(int i = head[u]; i; i = e[i].next){int v = e[i].to, w = e[i].w;if(v == fa) continue;d[v][0] = w;dfs(v, u);}
}
signed Lca(int x, int y){if(dep[x] < dep[y]) swap(x, y);int len = dep[x] - dep[y];for(int i = 0; i <= 20; i++){if(len & 1) x = f[x][i];len >>= 1;}if(x == y) return x;for(int i = 20; i >= 0; i--){if(f[x][i] != f[y][i])x = f[x][i], y = f[y][i];}return f[x][0];
}
bool cmp(int x, int y){return dfn[x] < dfn[y];
}
void Dp(int u, int fa){for(int i = Head[u]; i; i = E[i].next){int v = E[i].to, w = E[i].w;if(v == fa) continue;Dp(v, u);if(!vis[v]) dp[u] += min(dp[v], w);else dp[u] += w;}
}
int calc(int x, int y){int len = dep[x] - dep[y];int s = INF;for(int i = 0; i <= 20; i++){if(len & 1){s = min(s, d[x][i]);x = f[x][i];}len >>= 1;}return s;
}
signed main(){cin >> n;for(int i = 1; i < n; i++){int x, y, w;cin >> x >> y >> w;add(x, y, w), add(y, x, w); }tim = 0; dfs(1, 0);cin >> m;while(m--){int k; cin >> k;for(int i = 1; i <= k; i++){cin >> h[i];vis[h[i]] = 1;}sort(h + 1, h + k + 1, cmp);int tot = k;for(int i = 1; i < k; i++){int lca = Lca(h[i], h[i + 1]);h[++tot] = lca;}h[++tot] = 1;sort(h + 1, h + tot + 1, cmp);tot = unique(h + 1, h + tot + 1) - h - 1;for(int i = 1; i < tot; i++){int x = h[i], y = h[i + 1];int lca = Lca(x, y);int w = calc(y, lca);Add(lca, y, w), Add(y, lca, w);}Dp(1, 0);cout << dp[1] << endl;Cnt = 0;for(int i = 1; i <= tot; i++){vis[h[i]] = Head[h[i]] = dp[h[i]] = 0 ;}}return 0;
} 

数据结构

笛卡尔树

#include<bits/stdc++.h>
#define N 10000010
#define int long long
#define fo(a, b, c) for(int b = a; b <= c; b++)
using namespace std;
int n, ans1 = 0, ans2 = 0;
struct tree{int w, ls, rs, fa;
}t[N];
void insert(int x){int i = x - 1;while(t[i].w >= t[x].w) i = t[i].fa;t[x].fa = i, t[x].ls = t[i].rs;t[i].rs = x;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n;fo(1, i, n){cin >> t[i].w; insert(i);}fo(1, i, n){ans1 ^= i * (t[i].ls + 1), ans2 ^= i * (t[i].rs + 1);}cout << ans1 << " " << ans2 << "\n";return 0;
}

FHQ 平衡树

#include<bits/stdc++.h>
#define N 5000010
using namespace std;
struct treenode{int siz, ls, rs, pri, val;
}t[N];
int n, m, cnt = 0, rt = 0;
int add(int val){t[++cnt].pri = rand(), t[cnt].siz = 1, t[cnt].val = val;return cnt;
} 
void pushup(int u){t[u].siz = t[t[u].ls].siz + t[t[u].rs].siz + 1;
}
void split(int u, int x, int &L, int &R){if(!u) return L = 0, R = 0, void();if(t[u].val <= x) L = u, split(t[u].rs, x, t[u].rs, R);else R = u, split(t[u].ls, x, L, t[u].ls);pushup(u);
}
int merge(int L, int R){if(!L || !R) return L | R;if(t[L].pri <= t[R].pri) return t[L].rs = merge(t[L].rs, R), pushup(L), L;else return t[R].ls = merge(L, t[R].ls), pushup(R), R;
}
void Insert(int val){int L, R;split(rt, val, L, R), rt = merge(merge(L, add(val)), R);
}
void Delete(int val){int L, R, P;split(rt, val, L, R), split(L, val - 1, L, P);P = merge(t[P].ls, t[P].rs);rt = merge(merge(L, P), R);
}
int getrank(int val){int L, R, ans;split(rt, val - 1, L, R);ans = t[L].siz + 1;return rt = merge(L, R), ans;
}
int kth(int u, int k){int x = t[t[u].ls].siz + 1;if(k == x) return t[u].val;else if(k > x) return kth(t[u].rs, k - x);else return kth(t[u].ls, k);
}
int getpre(int val){return kth(rt, getrank(val) - 1);
} 
int getsuc(int val){return kth(rt, getrank(val + 1));
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> m;for(int i = 1; i <= n; i++){int val; cin >> val;Insert(val);}int last = 0, ans = 0; while(m--){int op, val; cin >> op >> val;val ^= last;if(op == 1) Insert(val);if(op == 2) Delete(val);if(op == 3) last = getrank(val), ans ^= last;if(op == 4) last = kth(rt, val), ans ^= last;if(op == 5) last = getpre(val), ans ^= last;if(op == 6) last = getsuc(val), ans ^= last;}cout << ans;return 0;
}

文艺平衡树

#include<bits/stdc++.h>
#define N 300010
using namespace std;
struct node{int pri, val, rs, ls, siz;
}t[N];
int n, Min, k, cnt = 0, tot = 0, rt = 0, A = 0;
char op; 
int add(int val){t[++cnt].val = val, t[cnt].pri = rand(), t[cnt].siz = 1;return cnt;
}
void pushup(int u){t[u].siz = t[t[u].ls].siz + t[t[u].rs].siz + 1;
}
void split(int u, int x, int &L, int &R){if(!u) return L = 0, R = 0, void(); if(t[u].val <= x) L = u, split(t[u].rs, x, t[u].rs, R);else R = u, split(t[u].ls, x, L, t[u].ls);//cout << t[u].siz << endl;pushup(u);
}
int merge(int L, int R){if(!L || !R) return L | R;if(t[L].pri < t[R].pri) return t[L].rs = merge(t[L].rs, R), pushup(L), L;else return t[R].ls = merge(L, t[R].ls), pushup(R), R; 
}
int kth(int u, int k){int x = t[t[u].ls].siz + 1;//cout << u << ' ' << x << ' ' << k << endl;if(x == k) return t[u].val;if(k > x) return kth(t[u].rs, k - x);else return kth(t[u].ls, k);
}
void Insert(int val){int L, R;split(rt, val, L, R);rt = merge(merge(L, add(val)), R);
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> Min;for(int i = 1; i <= n; i++){cin >> op >> k;if(op == 'I'){if(k >= Min){++tot;Insert(k-A);}}if(op == 'A') A += k;if(op == 'S') {A -= k;int L, R;split(rt, Min - 1 - A, L, R);//cout << t[rt].siz << endl;rt = R;}if(op == 'F'){k = t[rt].siz - k + 1;//cout << k << endl;if(k <= 0){cout << -1 << endl;continue;}cout << kth(rt, k) + A << endl;}}cout << tot - t[rt].siz;return 0; 
}

可持久化线段树

#include<bits/stdc++.h>
#define N 30000010
#define fo(a, b, c) for(int b = a; b <= c; b++)
#define _fo(a, b, c) for(int b = a; b >= c; b--)
using namespace std;
int n, m, a[N];
int rt[N], tn = 0;
struct nd{int lc, rc, w;
}t[N << 2];
void build(int &p, int l, int r){p = ++tn;if(l == r){return t[p].w = a[l], void(); }int md = (l + r) >> 1;build(t[p].lc, l, md), build(t[p].rc, md + 1, r);
}
void cpy(int &p){++tn, t[tn] = t[p], p = tn;
}
void upd(int &p, int l, int r, int x, int k){cpy(p);if(l == r){return t[p].w = k, void();}int md = (l + r) >> 1;if(x <= md) upd(t[p].lc, l, md, x, k);else upd(t[p].rc, md + 1, r, x, k);
}
int query(int p, int l, int r, int x){if(l == r) return t[p].w;int md = (l + r) >> 1;if(x <= md) return query(t[p].lc, l, md, x);else return query(t[p].rc, md + 1, r, x);
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> m;fo(1, i, n) cin >> a[i];build(rt[0], 1, n);fo(1, i, m){int root, op, x, k;cin >> root >> op >> x;if(op == 1){cin >> k;rt[i] = rt[root];upd(rt[i], 1, n, x, k);}if(op == 2){cout << query(rt[root], 1, n, x) << endl;rt[i] = rt[root];}}return 0;
}  

线段树合并

#include<bits/stdc++.h>
#define N 4000010
#define C 100000
#define M N << 2 
#define fo(a, b, c) for(int b = a; b <= c; b++)
#define _fo(a, b, c) for(int b = a; b >= c; b--)
#define Fo(a, b) for(auto a : b)
#define pb push_back
#define int long long
using namespace std;
int n, m, f[N][30], d[N];
int rt[N], lc[M], rc[M], t[M], id[M], tn = 0, ans[N];
vector<int>e[N];
void pushup(int p){if(t[lc[p]] > t[rc[p]]) id[p] = id[lc[p]];if(t[lc[p]] < t[rc[p]]) id[p] = id[rc[p]];if(t[lc[p]] == t[rc[p]]) id[p] = min(id[rc[p]], id[lc[p]]);t[p] = max(t[lc[p]], t[rc[p]]);
}
void upd(int &p, int l, int r, int x, int k){if(!p) p = ++tn;if(l == r){return id[p] = x, t[p] += k, void();}int md = (l + r) >> 1;if(x <= md) upd(lc[p], l, md, x, k);else upd(rc[p], md + 1, r, x, k);pushup(p);
}
void dfs(int u, int fa){f[u][0] = fa, d[u] = d[fa] + 1;fo(1, i, 20) f[u][i] = f[f[u][i - 1]][i - 1];Fo(v, e[u]) if(v ^ fa) dfs(v, u);
}
int Lca(int x, int y){if(d[x] < d[y]) swap(x, y);int len = d[x] - d[y];fo(0, i, 20){if(len & 1) x = f[x][i];len >>= 1;}if(x == y) return x;_fo(20, i, 0){if(f[x][i] ^ f[y][i]) x = f[x][i], y = f[y][i];}return f[x][0];
}
int mg(int x, int y, int l, int r){if(!x || !y) return x | y;if(l == r) return t[x] += t[y], x;int md = (l + r) >> 1;lc[x] = mg(lc[x], lc[y], l, md), rc[x] = mg(rc[x], rc[y], md + 1, r);pushup(x);return x;
}
void dfs1(int u, int fa){Fo(v, e[u]){if(v ^ fa){dfs1(v, u);rt[u] = mg(rt[u], rt[v], 1, C);}}ans[u] = id[rt[u]];if(!t[rt[u]]) ans[u] = 0;
}
signed main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> m;fo(1, i, n - 1){int x, y; cin >> x >> y;e[x].pb(y), e[y].pb(x);}dfs(1, 0);fo(1, i, m){int x, y, z; cin >> x >> y >> z;upd(rt[x], 1, C, z, 1), upd(rt[y], 1, C, z, 1);int l = Lca(x, y);//cout << x << ' ' << y << ' ' << l << endl;upd(rt[l], 1, C, z, -1), upd(rt[f[l][0]], 1, C, z, -1);}dfs1(1, 0);fo(1, i, n) cout << ans[i] << "\n";return 0;
}

其他技巧

CDQ 分治

#include<bits/stdc++.h>
#define N 200010
#define fo(a, b, c) for(int b = a; b <= c; b++)
#define Fo(a, b) for(auto a : b)
#define lb lower_bound
#define pb push_back
#define lowbit(x) x & (-x)
using namespace std;
struct node{int a, b, c, cnt, f;
}a[N], b[N];
int n, k, s[N], f[N], ans[N], tt; 
vector<int>vec;
bool cmp(node x, node y){if(x.a == y.a){if(x.b == y.b) return x.c < y.c;return x.b < y.b;}return x.a < y.a;
}
bool Cmp(node x, node y){return x.b < y.b;
}
void upd(int x, int num){while(x <= k){s[x] += num, x += lowbit(x);}
}
int qry(int x){int sum = 0;while(x){sum += s[x], x -= lowbit(x);}return sum;
}
void mg(int l, int md, int r){sort(b + l, b + md + 1, Cmp);sort(b + md + 1, b + r + 1, Cmp);int p = l - 1;vec.clear();fo(md + 1, i, r){while(b[p + 1].b <= b[i].b && p < md){++p, vec.pb(p);upd(b[p].c, b[p].cnt);}b[i].f += qry(b[i].c);}Fo(x, vec) upd(b[x].c, -b[x].cnt);
}
void solve(int l, int r){if(l == r) return; int md = (l + r) >> 1; solve(l, md), solve(md + 1, r);mg(l, md, r);
}
int main(){ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);cin >> n >> k;fo(1, i, n) cin >> a[i].a >> a[i].b >> a[i].c;sort(a + 1, a + n + 1, cmp);fo(1, i, n){if(a[i].a != a[i - 1].a || a[i].b != a[i - 1].b || a[i].c != a[i - 1].c) b[++tt] = a[i];b[tt].cnt++;}  solve(1, tt);fo(1, i, tt) ans[b[i].f + b[i].cnt - 1] += b[i].cnt; fo(0, i, n - 1) cout << ans[i] << "\n";return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/961633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232428 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧 正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程 (2)通过组合应用…

详细介绍:P3375 【模板】KMP

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11月10号

今天进行了统一建模和数据结构的学习。 然后就进行了java中数据库和服务器的学习。

基于DP1323EL的电动车解锁方案:超高速读写,提升电动车一键解锁体验

电动车无钥匙解锁 在快节奏的都市生活中,电动车已成为许多人的首选出行工具。然而,传统的机械钥匙往往带来诸多不便:容易丢失、操作繁琐,甚至在雨天或匆忙时成为负担。 随着物联网和智能科技的快速发展,一键解…

最强LLM生成代码也会出错?

最强LLM生成代码也会出错?背景 大语言模型(LLM)在代码生成方面无疑取得了惊人的进步,早已成为许多开发者不可或缺的日常工具。从自动补全到生成完整函数,AI正在重塑软件开发的生态。但当这些先进的AI模型生成…

张量与向量

这个问题抓得很准,核心结论是:向量是张量的特殊形式(1维张量),张量是向量的“高维扩展”,二者是“特殊与一般”的关系,核心区别在于维度和数据承载能力。 ### 1. 定义与维度差异 - **向量**:严格来说是1维张量…

TCP的超时重传时间是如何计算的

以上仅供参考,如有疑问,留言联系

路径遍历漏洞实战指南:5种绕过技术与自动化测试

本文深入探讨路径遍历漏洞的原理、常见出现场景,并通过5个真实案例详细讲解不同防御机制的绕过技术,最后介绍使用Python自动化测试的方法和修复建议。路径遍历漏洞实战指南 当我刚开始学习Web安全时,路径遍历是那种…

实用指南:LLMs-from-scratch :KV 缓存

实用指南:LLMs-from-scratch :KV 缓存pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

前置和后置的区别

1、前置式返回的引用,效率会高一点 2、后置式返回的常对象,内部需要一个临时对象,效率相对低一些 备注: 1、前置式和后置式都没有参数,为了加以区分,再后置式增加int自变量,默认值为0 2、对于后置式返回常对象,…

2025年11月太阳能板/光伏板/电池板/单晶硅/多晶硅板前十厂家排名:深圳精益太阳能板领跑行业

文章摘要 本文基于2025年太阳能板行业发展趋势,分析了全球太阳能板市场的竞争格局,重点介绍了前十强品牌的排名、技术优势及服务特点。行业发展迅猛,高效、稳定、环保成为核心需求,本文提供详细排名和品牌信息,并…

TCP报文中的时间戳有什么作用

以上仅供参考,如有疑问,留言联系

响应式编程 - reactor 初识

Reactor 3 是一个围绕该规范构建的库,将响应式编程Reactive Streams范式引入JVM。 在本课程中,你将熟悉 Reactor API。那么,让我们快速介绍一下响应式流和响应式编程中更通用的概念。 package com.qinrenjihe;impor…

ubuntu16.04安装CUDA驱动 - 小

背景:项目需要使用PyTorch ,调用这两个命令nvidia-smi nvcc --version安装cuda,先安装显卡驱动 检查显卡型号:lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce …

深入解析:统一高效图像生成与编辑!百度新加坡国立提出Query-Kontext,多项任务“反杀”专用模型

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月太阳能板生产厂家排名前十榜单:深圳精益太阳能板引领行业

摘要 随着全球对可再生能源需求的增长,太阳能板行业在2025年持续创新与扩张。本文基于权威市场数据和行业报告,精选出前十名太阳能板生产厂家,重点推荐深圳精益太阳能板作为榜首。榜单结合技术参数、用户口碑和品牌…

reactor 初识

package com.qinrenjihe;import org.jspecify.annotations.NonNull; import reactor.core.publisher.Flux;public class Main {// 创建一个空的 Fluxstatic Flux<@NonNull String> emptyFlux() {return Flux.emp…

QOJ6608 Descent of Dragons

为什么这题放在了 NOIP T2?自闭了……修改只会使值从 \(x\) 变成 \(x+1\),这个对整体的值域变化是非常小的。 对于一个阈值 \(lim\),考虑 \(01\) 序列 \(A_{lim}\),\(A_{lim,i}=[a_i\ge lim]\)。 对于一次修改,实…

2026年HR 数字化转型趋势:AI如何帮助HR从招聘到绩效全流程人效提升 48%?

根据艾瑞咨询 2025 年《中国 HR SaaS 行业研究报告》显示,预计 2025 年国内 HR SaaS 市场规模将突破 240 亿元,其中 AI 技术贡献的价值占比超 60%。这一数据背后,是 AI 正在彻底重塑 HR 全价值链 —— 从招聘的简历…

Windows利用批处理脚本判断端口, 启动tomcat

以下是一个完整的 Windows 批处理脚本,用于检查指定端口是否被占用,并根据结果选择是否启动 Tomcat。如果端口被占用,还可以选择结束占用端口的进程,再启动 Tomcat。批处理脚本代码batch@echo off :: 设置需要检查…