模板(不定时更新)
My blog
注意:不定时更新
火车头
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)
缺省源
Dev-C++
#include<bits/stdc++.h>
#define ll long long
#define PII pair<int, int>
#define Kg putchar(' ')
#define Ed putchar('\n')
//bool __begin__;
using namespace std;
const ll N = , inf = 1e9, INF = 1e18;
template<class T> inline void read(T &x){x = 0;int f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; f = ((ch == '-') ? -1 : f), ch = getchar());for(; ch >= '0' && ch <= '9'; x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar());x *= f;}
template<class T> inline void print(T x){if(x < 0){putchar('-'), print(-x);}else if(x < 10){putchar(x ^ 48);}else{print(x / 10), putchar((x % 10) ^ 48);}}
//bool __end__;
signed main(){
// print((int)(&__begin__ - &__end__) >> 20), puts("MB");
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
return 0;
}
VS code
#include<bits/stdc++.h>
// #define int long long
#define ll long long
#define PII pair<int, int>
#define Kg putchar(' ')
#define Ed putchar('\n')
// bool __begin__;
using namespace std;
const ll N = , inf = 1e9, INF = 1e18;
template<class T> inline void read(T &x){x = 0;int f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; f = ((ch == '-') ? -1 : f), ch = getchar());for(; ch >= '0' && ch <= '9'; x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar());x *= f;}
template<class T> inline void print(T x){if(x < 0){putchar('-'), print(-x);}else if(x < 10){putchar(x ^ 48);}else{print(x / 10), putchar((x % 10) ^ 48);}}
// bool __end__;
signed main(){
// print((int)(&__begin__ - &__end__) >> 20), puts("MB");
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
return 0;
}
{
"#include": {
"prefix": "#include",
"body": [
"#include<bits/stdc++.h>",
"// #define int long long",
"#define ll long long",
"#define PII pair<int, int>",
"#define Kg putchar(' ')",
"#define Ed putchar('\\n')",
"// bool __begin__;",
"using namespace std;",
"const ll N = , inf = 1e9, INF = 1e18;",
"template<class T> inline void read(T &x){x = 0;int f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; f = ((ch == '-') ? -1 : f), ch = getchar());for(; ch >= '0' && ch <= '9'; x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar());x *= f;}",
"template<class T> inline void print(T x){if(x < 0){putchar('-'), print(-x);}else if(x < 10){putchar(x ^ 48);}else{print(x / 10), putchar((x % 10) ^ 48);}}",
"// bool __end__;",
"signed main(){",
" // print((int)(&__begin__ - &__end__) >> 20), puts(\"MB\");",
" // freopen(\".in\", \"r\", stdin);",
" // freopen(\".out\", \"w\", stdout);",
" $1",
" return 0;",
"}"
]
},
"Graph": {
"prefix": "Graph",
"body": [
"struct Graph{",
" int hd[N], cnt;",
" struct edge{int nt, to, w;}e[N * 2];",
" Graph(){}",
" void clear(int n = 0){for(int i = 1; i <= n; i++){hd[i] = 0;}for(int i = 1; i <= cnt; i++){hd[e[i].to] = 0, e[i] = {0, 0, 0};}cnt = 0;}",
" void add(int x, int y, int z = 0){e[++cnt] = {hd[x], y, z}, hd[x] = cnt;}",
" #define Son(G, u) for(int ik = G.hd[u], v = G.e[ik].to, w = G.e[ik].w; ik; ik = G.e[ik].nt, v = G.e[ik].to, w = G.e[ik].w)",
"}G;"
]
},
"ksm": {
"prefix": "ksm",
"body": [
"int ksm(int a, int b, int p){int ans = 1;a %= p;while(b){if(b & 1){(ans *= a) %= p;}(a *= a) %= p;b >>= 1;}return ans % p;}"
]
},
"BIT": {
"prefix": "BIT",
"body": [
"struct BIT{",
" int sum[N];",
" void add(int x, int y){",
" for(int i = x; i <= n; i += i & -i)",
" sum[i] += y;",
" }",
" int ask(int x){",
" int ans = 0;",
" for(int i = x; i >= 1; i -= i & -i)",
" ans += sum[i];",
" return ans;",
" }",
"}B;"
]
},
"STree": {
"prefix": "STree",
"body": [
"struct STree{",
" $1",
" #define Mid ((l + r) >> 1)",
" #define Ls (rt << 1)",
" #define Rs (rt << 1 | 1)",
" #define Lson Ls, l, Mid",
" #define Rson Rs, Mid + 1, r",
" #define Root ",
" ",
"}S;"
]
},
"LCA": {
"prefix": "LCA",
"body": [
"int fa[N][22], dep[N];",
"void dfs(int u, int F){",
" for(int i = 1; i <= 20; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];",
" Son(G, u){",
" if(v == F) continue;",
" fa[v][0] = u, dep[v] = dep[u] + 1;",
" dfs(v, u);",
" }",
"}",
"int LCA(int x, int y){",
" if(dep[x] < dep[y]) swap(x, y);",
" for(int i = 20; i >= 0; i--) if(dep[fa[x][i]] >= dep[y] && fa[x][i]) x = fa[x][i];",
" if(x == y) return x;",
" for(int i = 20; i >= 0; i--) if(fa[x][i] != fa[y][i] && fa[x][i] && fa[y][i]) x = fa[x][i], y = fa[y][i];",
" return fa[x][0];",
"}"
]
},
"HCT": {
"prefix": "HCT",
"body": [
"#pragma GCC optimize(3)",
"#pragma GCC target(\"avx\")",
"#pragma GCC optimize(\"Ofast\")",
"#pragma GCC optimize(\"inline\")",
"#pragma GCC optimize(\"-fgcse\")",
"#pragma GCC optimize(\"-fgcse-lm\")",
"#pragma GCC optimize(\"-fipa-sra\")",
"#pragma GCC optimize(\"-ftree-pre\")",
"#pragma GCC optimize(\"-ftree-vrp\")",
"#pragma GCC optimize(\"-fpeephole2\")",
"#pragma GCC optimize(\"-ffast-math\")",
"#pragma GCC optimize(\"-fsched-spec\")",
"#pragma GCC optimize(\"unroll-loops\")",
"#pragma GCC optimize(\"-falign-jumps\")",
"#pragma GCC optimize(\"-falign-loops\")",
"#pragma GCC optimize(\"-falign-labels\")",
"#pragma GCC optimize(\"-fdevirtualize\")",
"#pragma GCC optimize(\"-fcaller-saves\")",
"#pragma GCC optimize(\"-fcrossjumping\")",
"#pragma GCC optimize(\"-fthread-jumps\")",
"#pragma GCC optimize(\"-funroll-loops\")",
"#pragma GCC optimize(\"-fwhole-program\")",
"#pragma GCC optimize(\"-freorder-blocks\")",
"#pragma GCC optimize(\"-fschedule-insns\")",
"#pragma GCC optimize(\"inline-functions\")",
"#pragma GCC optimize(\"-ftree-tail-merge\")",
"#pragma GCC optimize(\"-fschedule-insns2\")",
"#pragma GCC optimize(\"-fstrict-aliasing\")",
"#pragma GCC optimize(\"-fstrict-overflow\")",
"#pragma GCC optimize(\"-falign-functions\")",
"#pragma GCC optimize(\"-fcse-skip-blocks\")",
"#pragma GCC optimize(\"-fcse-follow-jumps\")",
"#pragma GCC optimize(\"-fsched-interblock\")",
"#pragma GCC optimize(\"-fpartial-inlining\")",
"#pragma GCC optimize(\"no-stack-protector\")",
"#pragma GCC optimize(\"-freorder-functions\")",
"#pragma GCC optimize(\"-findirect-inlining\")",
"#pragma GCC optimize(\"-fhoist-adjacent-loads\")",
"#pragma GCC optimize(\"-frerun-cse-after-loop\")",
"#pragma GCC optimize(\"inline-small-functions\")",
"#pragma GCC optimize(\"-finline-small-functions\")",
"#pragma GCC optimize(\"-ftree-switch-conversion\")",
"#pragma GCC optimize(\"-foptimize-sibling-calls\")",
"#pragma GCC optimize(\"-fexpensive-optimizations\")",
"#pragma GCC optimize(\"-funsafe-loop-optimizations\")",
"#pragma GCC optimize(\"inline-functions-called-once\")",
"#pragma GCC optimize(\"-fdelete-null-pointer-checks\")",
"#pragma GCC optimize(2)"
]
},
"gjd": {
"prefix": "gjd",
"body": [
"struct gjd{int n, a[N];};",
"gjd read(){",
" scanf(\"%s\", s + 1);",
" int len = strlen(s + 1);",
" gjd c = {len, {0}};",
" for(int i = len; i >= 1; i--) c.a[len - i + 1] = s[i] - '0';",
" return c;",
"}",
"void pr(gjd a){for(int i = a.n; i >= 1; i--) print(a.a[i]);}",
"gjd operator+(gjd a, gjd b){",
" gjd c = {max(a.n, b.n), {0}};",
" for(int i = 1; i <= c.n; i++){",
" c.a[i] += a.a[i] + b.a[i];",
" c.a[i + 1] += c.a[i] / 10;",
" c.a[i] %= 10;",
" }",
" while(c.a[c.n + 1]){",
" c.n++;",
" c.a[c.n + 1] += c.a[c.n] / 10;",
" c.a[c.n] %= 10;",
" }",
" return c;",
"}",
"gjd operator-(gjd a, gjd b){",
" gjd c = {max(a.n, b.n), {0}};",
" for(int i = 1; i <= c.n; i++){",
" c.a[i] += a.a[i] - b.a[i];",
" if(c.a[i] < 0) c.a[i] += 10, c.a[i + 1]--;",
" }while(c.n >= 2 && !c.a[c.n]) c.n--;",
" return c;",
"}",
"gjd operator*(gjd a, int b){",
" gjd c = {a.n, {0}};",
" for(int i = 1; i <= c.n; i++){",
" c.a[i] += a.a[i] * b;",
" c.a[i + 1] += c.a[i] / 10;",
" c.a[i] %= 10;",
" }",
" while(c.a[c.n + 1]){",
" c.n++;",
" c.a[c.n + 1] += c.a[c.n] / 10;",
" c.a[c.n] %= 10;",
" }",
" return c;",
"}"
]
},
"LCree": {
"prefix": "LCree",
"body": [
"int get(int i, int s){}",
"struct LCree{",
" int sum[N * 4];",
" #define Mid ((l + r) >> 1)",
" #define Ls (rt << 1)",
" #define Rs (rt << 1 | 1)",
" #define Lson Ls, l, Mid",
" #define Rson Rs, Mid + 1, r",
" #define Root 1, k * 2, n",
" void clear(){memset(sum, 0, sizeof(sum));}",
" void update(int rt, int l, int r, int x){",
" if(get(x, Mid) < get(sum[rt], Mid)) swap(x, sum[rt]);",
" if(get(x, l) < get(sum[rt], l)) update(Lson, x);",
" if(get(x, r) < get(sum[rt], r)) update(Rson, x);",
" }",
" int ask(int rt, int l, int r, int x){",
" if(l == r) return get(sum[rt], x);",
" if(x <= Mid) return min(ask(Lson, x), get(sum[rt], x));",
" else return min(ask(Rson, x), get(sum[rt], x));",
" }",
"}L;"
]
},
"mat": {
"prefix": "mat",
"body": [
"struct mat{int n, m, a[N][N];};",
"void read(mat &a){",
" a.n = a.m = 0;",
" read(a.n), read(a.m);",
" for(int i = 1; i <= a.n; i++)",
" for(int j = 1; j <= a.m; j++)",
" read(a.a[i][j]);",
"}",
"void print(const mat a){",
" for(int i = 1; i <= a.n; i++){",
" for(int j = 1; j <= a.m; j++){",
" print(a.a[i][j]), Kg;",
" }Ed;",
" }",
"}",
"mat operator*(mat a, mat b){",
" mat c;",
" c.n = a.n, c.m = b.m;",
" for(int i = 1; i <= c.n; i++){",
" for(int j = 1; j <= c.m; j++){",
" c.a[i][j] = 0;",
" for(int k = 1; k <= a.m; k++){",
" (c.a[i][j] += (p + a.a[i][k] * b.a[k][j] % p) % p) %= p;",
" }",
" }",
" }",
" return c;",
"}",
"mat ksm(mat a, int b){",
" mat ans;",
" ans.n = a.n, ans.m = a.m;",
" for(int i = 1; i <= ans.n; i++)",
" for(int j = 1; j <= ans.m; j++)",
" ans.a[i][j] = (i == j);",
" while(b > 0){",
" if(b & 1) ans = ans * a;",
" a = a * a;",
" b >>= 1;",
" }return ans;",
"}"
]
},
"C": {
"prefix": "C",
"body": [
"int t = 1e6, jc[N], inv[N];",
"int C(int n, int m){",
" if(m > n) return 0;",
" return jc[n] * inv[n - m] % p * inv[m] % p;",
"}",
"void init(){",
" jc[0] = 1;",
" for(int i = 1; i <= t; i++) jc[i] = (jc[i - 1] * i) % p;",
" inv[t] = ksm(jc[t], p - 2, p);",
" for(int i = t - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % p;",
"}"
]
},
"lucas": {
"prefix": "lucas",
"body": [
"int lucas(int n, int m){",
" if(n < p && m < p) return C(n, m);",
" return lucas(n / p, m / p) * C(n % p, m % p) % p;",
"}"
]
},
}
AT
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define PII pair<int, int>
#define Kg putchar(' ')
#define Ed putchar('\n')
using namespace std;
const ll N = 2e6 + 10, M = 5e3 + 10, inf = 1e9, INF = 1e18;
template<class T> inline void read(T &x){x = 0;int f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; f = ((ch == '-') ? -1 : f), ch = getchar());for(; ch >= '0' && ch <= '9'; x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar());x *= f;}
template<class T> inline void print(T x){if(x < 0){putchar('-'), print(-x);}else if(x < 10){putchar(x ^ 48);}else{print(x / 10), putchar((x % 10) ^ 48);}}
int n, m;
char s[N], t[N];
signed main(){
return 0;
}
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define PII pair<int, int>
#define Kg putchar(' ')
#define Ed putchar('\n')
using namespace std;
const ll N = 2e6 + 10, M = 5e3 + 10, inf = 1e9, INF = 1e18;
template<class T> inline void read(T &x){x = 0;int f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; f = ((ch == '-') ? -1 : f), ch = getchar());for(; ch >= '0' && ch <= '9'; x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar());x *= f;}
template<class T> inline void print(T x){if(x < 0){putchar('-'), print(-x);}else if(x < 10){putchar(x ^ 48);}else{print(x / 10), putchar((x % 10) ^ 48);}}
signed main(){
return 0;
}
1|0Part 1 图论
建图
struct Graph{
int hd[N], cnt;
struct edge{int nt, to, w;}e[N * 2];
Graph(){}
void clear(int n = 0){for(int i = 1; i <= n; i++){hd[i] = 0;}for(int i = 1; i <= cnt; i++){hd[e[i].to] = 0, e[i] = {0, 0, 0};}cnt = 0;}
void add(int x, int y, int z = 0){e[++cnt] = {hd[x], y, z}, hd[x] = cnt;}
#define Son(G, u) for(int ik = G.hd[u], v = G.e[ik].to, w = G.e[ik].w; ik; ik = G.e[ik].nt, v = G.e[ik].to, w = G.e[ik].w)
}G;
倍增LCA
int fa[N][22], dep[N];
void dfs(int u, int F){
for(int i = 1; i <= 20; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
Son(G, u){
if(v == F) continue;
fa[v][0] = u, dep[v] = dep[u] + 1;
dfs(v, u);
}
}
int LCA(int x, int y){
if(dep[x] < dep[y]) swap(x, y);
for(int i = 20; i >= 0; i--) if(dep[fa[x][i]] >= dep[y] && fa[x][i]) x = fa[x][i];
if(x == y) return x;
for(int i = 20; i >= 0; i--) if(fa[x][i] != fa[y][i] && fa[x][i] && fa[y][i]) x = fa[x][i], y = fa[y][i];
return fa[x][0];
}
Tarjan
2|0Part 2 数学
快速幂
int ksm(int a, int b, int p){int ans = 1;a %= p;while(b){if(b & 1){(ans *= a) %= p;}(a *= a) %= p;b >>= 1;}return ans % p;}
ll ksm(ll a, ll b, ll p){ll ans = 1;a %= p;while(b){if(b & 1){(ans *= a) %= p;}(a *= a) %= p;b >>= 1;}return ans % p;}
int ksm(int a, int b, int p){
int ans = 1;
a %= p;
while(b){
if(b & 1){
(ans *= a) %= p;
}
(a *= a) %= p;
b >>= 1;
}
return ans % p;
}
矩阵快速幂
struct mat{int n, m, a[N][N];};
void read(mat &a){
a.n = a.m = 0;
read(a.n), read(a.m);
for(int i = 1; i <= a.n; i++)
for(int j = 1; j <= a.m; j++)
read(a.a[i][j]);
}
void print(const mat a){
for(int i = 1; i <= a.n; i++){
for(int j = 1; j <= a.m; j++){
print(a.a[i][j]), Kg;
}Ed;
}
}
mat operator*(mat a, mat b){
mat c;
c.n = a.n, c.m = b.m;
for(int i = 1; i <= c.n; i++){
for(int j = 1; j <= c.m; j++){
c.a[i][j] = 0;
for(int k = 1; k <= a.m; k++){
(c.a[i][j] += (p + a.a[i][k] * b.a[k][j] % p) % p) %= p;
}
}
}
return c;
}
mat ksm(mat a, int b){
mat ans;
ans.n = a.n, ans.m = a.m;
for(int i = 1; i <= ans.n; i++)
for(int j = 1; j <= ans.m; j++)
ans.a[i][j] = (i == j);
while(b > 0){
if(b & 1) ans = ans * a;
a = a * a;
b >>= 1;
}return ans;
}
求组合数
int t = 1e6, jc[N], inv[N];
int C(int n, int m){
if(m > n) return 0;
return jc[n] * inv[n - m] % p * inv[m] % p;
}
void init(){
jc[0] = 1;
for(int i = 1; i <= t; i++) jc[i] = (jc[i - 1] * i) % p;
inv[t] = ksm(jc[t], p - 2, p);
for(int i = t - 1; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % p;
}
int lucas(int n, int m){
if(n < p && m < p) return C(n, m);
return lucas(n / p, m / p) * C(n % p, m % p) % p;
}
高精度运算
struct gjd{int n, a[N];};
gjd read(){
scanf("%s", s + 1);
int len = strlen(s + 1);
gjd c = {len, {0}};
for(int i = len; i >= 1; i--) c.a[len - i + 1] = s[i] - '0';
return c;
}
void pr(gjd a){for(int i = a.n; i >= 1; i--) print(a.a[i]);}
gjd operator+(gjd a, gjd b){
gjd c = {max(a.n, b.n), {0}};
for(int i = 1; i <= c.n; i++){
c.a[i] += a.a[i] + b.a[i];
c.a[i + 1] += c.a[i] / 10;
c.a[i] %= 10;
}
while(c.a[c.n + 1]){
c.n++;
c.a[c.n + 1] += c.a[c.n] / 10;
c.a[c.n] %= 10;
}
return c;
}
gjd operator-(gjd a, gjd b){
gjd c = {max(a.n, b.n), {0}};
for(int i = 1; i <= c.n; i++){
c.a[i] += a.a[i] - b.a[i];
if(c.a[i] < 0) c.a[i] += 10, c.a[i + 1]--;
}while(c.n >= 2 && !c.a[c.n]) c.n--;
return c;
}
gjd operator*(gjd a, int b){
gjd c = {a.n, {0}};
for(int i = 1; i <= c.n; i++){
c.a[i] += a.a[i] * b;
c.a[i + 1] += c.a[i] / 10;
c.a[i] %= 10;
}
while(c.a[c.n + 1]){
c.n++;
c.a[c.n + 1] += c.a[c.n] / 10;
c.a[c.n] %= 10;
}
return c;
}
3|0Part 3 数据结构
树状数组
struct BIT{
int sum[N];
void add(int x, int y){
for(int i = x; i <= n; i += i & -i)
sum[i] += y;
}
int ask(int x){
int ans = 0;
for(int i = x; i >= 1; i -= i & -i)
ans += sum[i];
return ans;
}
}B;
单调队列
struct ddque{
int q[N], hd, tl;
void clear(){hd = 1, tl = 0;}
bool empty(){return (hd <= tl);}
int front(){return q[hd];}
int back(){return q[tl];}
void push_back(int x){q[++tl] = x;}
void pop_front(){hd++;}
void pop_back(){tl--;}
}q;
Treap
int root;
struct Treap{
int sum[N], sk[N], tot[N], siz[N];
int L[N], R[N], cnt;
void build(){
cnt = 2;
sum[1] = -inf, sum[2] = inf;
sk[1] = rand(), sk[2] = rand();
tot[1] = tot[2] = 1;
siz[1] = 2, siz[2] = 1;
R[1] = 2;
root = 1;
}
void push_up(int rt){siz[rt] = siz[L[rt]] + siz[R[rt]] + tot[rt];}
void yx(int &rt){
int p = L[rt];
L[rt] = R[p], R[p] = rt;
push_up(rt), push_up(p);
rt = p;
}
void zx(int &rt){
int p = R[rt];
R[rt] = L[p], L[p] = rt;
push_up(rt), push_up(p);
rt = p;
}
void add(int &rt, int x){
if(!rt){
rt = ++cnt;
sum[rt] = x, sk[rt] = rand();
tot[rt] = siz[rt] = 1;
return;
}
if(x == sum[rt]){
tot[rt]++;
push_up(rt);
return;
}
else if(x < sum[rt]){
add(L[rt], x);
push_up(rt);
if(sk[L[rt]] < sk[rt]) yx(rt);
}
else{
add(R[rt], x);
push_up(rt);
if(sk[R[rt]] < sk[rt]) zx(rt);
}
}
void del(int &rt, int x){
if(!rt) return;
if(x == sum[rt]){
if(tot[rt] > 1){
tot[rt]--;
push_up(rt);
return;
}
if(L[rt] || R[rt]){
if(!R[rt] || sk[L[rt]] > sk[R[rt]]) yx(rt), del(R[rt], x);
else zx(rt), del(L[rt], x);
push_up(rt);
}
else rt = 0;
return;
}
else if(x < sum[rt]) del(L[rt], x);
else del(R[rt], x);
push_up(rt);
}
int ask_rk(int rt, int x){
if(!rt) return 0;
if(x == sum[rt]) return siz[L[rt]];
else if(x < sum[rt]) return ask_rk(L[rt], x);
else return siz[L[rt]] + tot[rt] + ask_rk(R[rt], x);
}
int ask_val(int rt, int k){
if(!rt) return inf;
if(siz[L[rt]] >= k) return ask_val(L[rt], k);
else if(siz[L[rt]] + tot[rt] >= k) return sum[rt];
else return ask_val(R[rt], k - siz[L[rt]] - tot[rt]);
}
int ask_pre(int rt, int x){
int ans = -inf;
while(rt){
if(x == sum[rt]){
if(L[rt]){
int p = L[rt];
while(R[p]) p = R[p];
ans = sum[p];
}break;
}
else if(x < sum[rt]) rt = L[rt];
else{
ans = max(ans, sum[rt]);
rt = R[rt];
}
}
return ans;
}
int ask_nxt(int rt, int x){
int ans = inf;
while(rt){
if(x == sum[rt]){
if(R[rt]){
int p = R[rt];
while(L[p]) p = L[p];
ans = sum[p];
}break;
}
else if(x < sum[rt]){
ans = min(ans, sum[rt]);
rt = L[rt];
}
else rt = R[rt];
}
return ans;
}
}T;
李超树
int get(int i, int s){}
struct LCree{
int sum[N * 4];
#define Mid ((l + r) >> 1)
#define Ls (rt << 1)
#define Rs (rt << 1 | 1)
#define Lson Ls, l, Mid
#define Rson Rs, Mid + 1, r
#define Root 1, k * 2, n
void clear(){memset(sum, 0, sizeof(sum));}
void update(int rt, int l, int r, int x){
if(get(x, Mid) < get(sum[rt], Mid)) swap(x, sum[rt]);
if(get(x, l) < get(sum[rt], l)) update(Lson, x);
if(get(x, r) < get(sum[rt], r)) update(Rson, x);
}
int ask(int rt, int l, int r, int x){
if(l == r) return get(sum[rt], x);
if(x <= Mid) return min(ask(Lson, x), get(sum[rt], x));
else return min(ask(Rson, x), get(sum[rt], x));
}
}L;
4|0Part 4 其他
代码框
<details>
<summary><b>Name</b></summary>
</details>
赛后总结模板
## 做题历程
### 8:00 ~ 8:40
### 8:40 ~ 9:40
### 9:40 ~ 10:40
### 10:40 ~ 11:40
### 11:40 ~ 12:00
## 总结
## 题解
### A
### B
### C
### D
__EOF__

本文作者:PeyNiKge
本文链接:https://www.cnblogs.com/PeyNiKge/p/mo-ban.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/PeyNiKge/p/mo-ban.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下