当前位置:网站首页>模板(三)
模板(三)
2022-07-26 09:20:00 【Alex Su (*^▽^*)】
树链剖分
#include <bits/stdc++.h>
#define l(k) (k << 1)
#define r(k) (k << 1 | 1)
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 1e5 + 10;
int t[N << 2], lazy[N << 2], a[N], mod, root, n, m;
int d[N], siz[N], fa[N], son[N], top[N], id[N], rk[N], cnt;
vector<int> g[N];
int add(int a, int b) { return (a + b) % mod; }
int mul(int a, int b) { return 1LL * a * b % mod; }
void up(int k) { t[k] = add(t[l(k)], t[r(k)]); }
void update(int k, int l, int r, int x)
{
lazy[k] = add(lazy[k], x);
t[k] = add(t[k], mul(r - l + 1, x));
}
void down(int k, int l, int r)
{
if(!lazy[k]) return;
int m = l + r >> 1;
update(l(k), l, m, lazy[k]);
update(r(k), m + 1, r, lazy[k]);
lazy[k] = 0;
}
void build(int k, int l, int r)
{
if(l == r)
{
t[k] = rk[l];
return;
}
int m = l + r >> 1;
build(l(k), l, m);
build(r(k), m + 1, r);
up(k);
}
void change(int k, int l, int r, int L, int R, int x)
{
if(L <= l && r <= R)
{
update(k, l, r, x);
return;
}
down(k, l, r);
int m = l + r >> 1;
if(L <= m) change(l(k), l, m, L, R, x);
if(R > m) change(r(k), m + 1, r, L, R, x);
up(k);
}
int query(int k, int l, int r, int L, int R)
{
if(L <= l && r <= R) return t[k];
down(k, l, r);
int m = l + r >> 1, res = 0;
if(L <= m) res = add(res, query(l(k), l, m, L, R));
if(R > m) res = add(res, query(r(k), m + 1, r, L, R));
return res;
}
void dfs1(int u, int father) //第一次dfs预处理,处理出深度,父亲,大小
{
d[u] = d[father] + 1;
fa[u] = father;
siz[u] = 1;
for(int v: g[u])
{
if(v == father) continue;
dfs1(v, u);
siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void dfs2(int u, int fa, int t) //第二次dfs进行剖分,处理出dfs序,每条链的顶端,以及dfs序对应的权值
{
top[u] = t;
id[u] = ++cnt;
rk[cnt] = a[u];
if(siz[u] == 1) return;
dfs2(son[u], u, t);
for(int v: g[u])
{
if(v == fa || v == son[u]) continue;
dfs2(v, u, v);
}
}
void add(int u, int v, int x)
{
while(top[u] != top[v]) //先以链为整体来考虑,不在同一条链的时候,让链顶端较深的点向上跳
{
if(d[top[u]] < d[top[v]]) swap(u, v);
change(1, 1, n, id[top[u]], id[u], x); //跳的过程重处理这条链上的点的信息
u = fa[top[u]];
}
if(d[u] < d[v]) swap(u, v); //在同一条链时,继续处理
change(1, 1, n, id[v], id[u], x); //从深度小的到深度深的,dfs序从小到大
}
int ask(int u, int v)
{
int res = 0;
while(top[u] != top[v])
{
if(d[top[u]] < d[top[v]]) swap(u, v); //注意是比较top的深度,不是u,v的深度
res = add(res, query(1, 1, n, id[top[u]], id[u]));
u = fa[top[u]];
}
if(d[u] < d[v]) swap(u, v);
res = add(res, query(1, 1, n, id[v], id[u]));
return res;
}
int main()
{
scanf("%d%d%d%d", &n, &m, &root, &mod);
_for(i, 1, n) scanf("%d", &a[i]);
_for(i, 1, n - 1)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(root, 0);
dfs2(root, 0, root);
build(1, 1, n);
while(m--)
{
int op, x, y, z;
scanf("%d", &op);
if(op == 1)
{
scanf("%d%d%d", &x, &y, &z);
add(x, y, z);
}
else if(op == 2)
{
scanf("%d%d", &x, &y);
printf("%d\n", ask(x, y));
}
else if(op == 3)
{
scanf("%d%d", &x, &z);
change(1, 1, n, id[x], id[x] + siz[x] - 1, z); //用size数组推出dfs序的右端点
}
else
{
scanf("%d", &x);
printf("%d\n", query(1, 1, n, id[x], id[x] + siz[x] - 1));
}
}
return 0;
}树上启发式合并
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int son[N], siz[N], c[N], cnt[N], mx, n;
vector<int> g[N];
ll sum, ans[N];
void dfs1(int u, int fa)
{
siz[u] = 1;
for(int v: g[u])
{
if(v == fa) continue;
dfs1(v, u);
siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void clear(int u, int fa)
{
cnt[c[u]]--;
for(int v: g[u])
{
if(v == fa) continue;
clear(v, u);
}
}
void add(int u)
{
cnt[c[u]]++;
if(cnt[c[u]] > mx)
{
mx = cnt[c[u]];
sum = c[u];
}
else if(cnt[c[u]] == mx) sum += c[u];
}
void insert(int u, int fa)
{
add(u);
for(int v: g[u])
{
if(v == fa) continue;
insert(v, u);
}
}
void dfs2(int u, int fa)
{
for(int v: g[u])
{
if(v == fa || v == son[u]) continue;
dfs2(v, u);
mx = sum = 0;
clear(v, u);
}
if(son[u]) dfs2(son[u], u);
for(int v: g[u])
{
if(v == fa || v == son[u]) continue;
insert(v, u);
}
add(u);
ans[u] = sum;
}
int main()
{
scanf("%d", &n);
_for(i, 1, n) scanf("%d", &c[i]);
_for(i, 1, n - 1)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs1(1, 0);
dfs2(1, 0);
_for(i, 1, n) printf("%lld ", ans[i]);
return 0;
}线性基
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
const int M = 62;
ll d[M + 10];
bool zero;
void add(ll x)
{
for(int i = M; i >= 0; i--)
if(x & (1LL << i)) //注意这里写1LL防止爆int
{
if(d[i]) x ^= d[i];
else { d[i] = x; return; } //这里是return不是break
}
zero = true; //注意0要特判
}
ll check(ll x) //判断x是否可以用线性基的元素表示 和插入类似
{
for(int i = M; i >= 0; i--)
if(x & (1LL << i))
{
if(d[i]) x ^= d[i];
else return false;
}
return true;
}
ll qmax()
{
ll res = 0;
for(int i = M; i >= 0; i--) //从高到低位贪心 本质就是尽量让高位为1 这样写简洁
res = max(res, res ^ d[i]);
return res;
}
ll qmin() //如果没有0的话 最小的d[i]就是最小值
{
if(zero) return 0;
_for(i, 0, M)
if(d[i])
return d[i];
}
ll kth(int k) //查询所有异或和中第k小的数
{
if(zero) k--;
if(!k) return 0;
_for(i, 0, M) //先将线性基处理一下 注意处理后的线性基仍然可以照常使用
_for(j, 0, i - 1)
if(d[i] & (1LL << j))
d[i] ^= d[j];
ll res = 0;
_for(i, 0, M)
if(d[i])
{
if(k & 1) res ^= d[i];
k >>= 1;
}
return res;
}
int main()
{
int n; scanf("%d", &n);
_for(i, 1, n)
{
ll x; scanf("%lld", &x);
add(x);
}
printf("%lld\n", qmax());
return 0;
}NTT
#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
const int N = 4e6 + 10, mod = 998244353, G = 3, Gi = 332748118; //NTT是FFT的优化,速度更快,避免精度误差
//同时NTT可以取模,模数看题目,这里以998244353为例
int n, m, limit = 1, l, r[N]; //N开数据范围的四倍
ll a[N], b[N], c[N], ans[N];
ll binpow(ll a, ll b)
{
ll res = 1;
for(; b; b >>= 1)
{
if(b & 1) res = res * a % mod;
a = a * a % mod;
}
return res;
}
void NTT(ll *A, int type)
{
rep(i, 0, limit)
if(i < r[i])
swap(A[i], A[r[i]]);
for(int mid = 1; mid < limit; mid <<= 1)
{
ll Wn = binpow(type == 1 ? G : Gi, (mod - 1) / (mid << 1));
for(int j = 0; j < limit; j += (mid << 1))
{
ll w = 1;
for(int k = 0; k < mid; k++, w = w * Wn % mod)
{
int x = A[j + k], y = w * A[j + k + mid] % mod;
A[j + k] = (x + y) % mod;
A[j + k + mid] = (x - y + mod) % mod;
}
}
}
}
void read() //读入n次多项式和m次多项式
{
scanf("%d%d", &n, &m);
_for(i, 0, n) scanf("%d", &a[i]), a[i] = (a[i] + mod) % mod;
_for(i, 0, m) scanf("%d", &b[i]), b[i] = (b[i] + mod) % mod;
}
void solve()
{
while(limit <= n + m) limit <<= 1, l++;
rep(i, 0, limit) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
NTT(a, 1); NTT(b, 1);
rep(i, 0, limit) c[i] = a[i] * b[i] % mod;
NTT(c, -1);
ll inv = binpow(limit, mod - 2);
_for(i, 0, n + m) ans[i] = c[i] * inv % mod;
}
int main()
{
read();
solve();
_for(i, 0, n + m) printf("%d ", ans[i]);
return 0;
}线性求逆
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 5000 + 10;
const int mod = 1e9 + 7;
int inv[N];
int main()
{
inv[0] = inv[1] = 1;
_for(i, 2, 5000) inv[i] = 1LL * (mod - mod / i) * inv[mod % i] % mod;
return 0;
}带权并查集
#include <cstdio>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 1e5 + 10;
int f[N], r[N], n, m;
int find(int x)
{
if(f[x] == x) return x;
int fa = f[x];
f[x] = find(f[x]);
r[x] = (r[x] + r[fa]) % 2;
return f[x];
}
void Union(int x, int y)
{
int fx = find(x), fy = find(y);
if(fx == fy) return;
f[fx] = fy;
r[fx] = (r[x] + 1 + r[y]) % 2;
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
_for(i, 1, n) f[i] = i, r[i] = 0;
while(m--)
{
char op[5]; int x, y;
scanf("%s%d%d", op, &x, &y);
if(op[0] == 'D') Union(x, y);
else
{
if(find(x) != find(y)) puts("Not sure yet.");
else
{
if(r[x] == r[y]) puts("In the same gang.");
else puts("In different gangs.");
}
}
}
}
return 0;
}线段树合并
#include <bits/stdc++.h>
#define num first
#define sum second
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int ls[N << 6], rs[N << 6], root[N], c[N], cnt, n;
pair<int, ll> t[N << 6];
vector<int> g[N];
ll ans[N];
void up(int k)
{
if(t[ls[k]].num == t[rs[k]].num)
{
t[k] = make_pair(t[ls[k]].num, t[ls[k]].sum + t[rs[k]].sum);
return;
}
t[k] = max(t[ls[k]], t[rs[k]]);
}
void add(int& k, int l, int r, int x)
{
if(!k) k = ++cnt;
if(l == r)
{
t[k].num = 1;
t[k].sum = x;
return;
}
int m = l + r >> 1;
if(x <= m) add(ls[k], l, m, x);
else add(rs[k], m + 1, r, x);
up(k);
}
int merge(int x, int y, int l, int r)
{
if(!x) return y;
if(!y) return x;
if(l == r)
{
t[x].num += t[y].num;
t[x].sum = l;
return x;
}
int m = l + r >> 1;
ls[x] = merge(ls[x], ls[y], l, m);
rs[x] = merge(rs[x], rs[y], m + 1, r);
up(x);
return x;
}
void dfs(int u, int fa)
{
add(root[u], 1, n, c[u]);
for(int v: g[u])
{
if(v == fa) continue;
dfs(v, u);
root[u] = merge(root[u], root[v], 1, n);
}
ans[u] = t[root[u]].sum;
}
int main()
{
scanf("%d", &n);
_for(i, 1, n) scanf("%d", &c[i]);
_for(i, 1, n - 1)
{
int u, v;
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1, 0);
_for(i, 1, n) printf("%lld ", ans[i]);
return 0;
}动态开点线段树
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int ls[N << 6], rs[N << 6], a[N], cnt, n, m, root; //注意root一定一开始设为0
ll t1[N << 6], t2[N << 6];
void up(int k)
{
t1[k] = t1[ls[k]] + t1[rs[k]];
t2[k] = t2[ls[k]] + t2[rs[k]];
}
void modify(int& k, int l, int r, int x, int p)
{
if(!k) k = ++cnt; //动态开点
if(l == r)
{
t2[k] += p;
t1[k] = t2[k] * x;
return;
}
int m = l + r >> 1;
if(x <= m) modify(ls[k], l, m, x, p);
else modify(rs[k], m + 1, r, x, p);
up(k);
}
ll query1(int k, int l, int r, int L, int R)
{
if(!k) return 0; //询问时询问到空节点返回0
if(L <= l && r <= R) return t1[k];
int m = l + r >> 1; ll res = 0;
if(L <= m) res += query1(ls[k], l, m, L, R);
if(R > m) res += query1(rs[k], m + 1, r, L, R);
return res;
}
int query2(int k, int l, int r, int L, int R)
{
if(!k) return 0;
if(L <= l && r <= R) return t2[k];
int m = l + r >> 1, res = 0;
if(L <= m) res += query2(ls[k], l, m, L, R);
if(R > m) res += query2(rs[k], m + 1, r, L, R);
return res;
}
int main()
{
scanf("%d%d", &n, &m);
modify(root, 0, 1e9, 0, n);
while(m--)
{
char op[5]; int x, y;
scanf("%s%d%d", op, &x, &y);
if(op[0] == 'U')
{
modify(root, 0, 1e9, a[x], -1);
modify(root, 0, 1e9, a[x] = y, 1);
}
else
{
int t = query2(root, 0, 1e9, y, 1e9);
ll sum = query1(root, 0, 1e9, 0, y - 1);
if(sum >= 1LL * (x - t) * y) puts("TAK");
else puts("NIE");
}
}
return 0;
}cdq分治(三维偏序问题)
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int M = 2e5 + 10;
const int N = 1e5 + 10;
struct node
{
int a, b, c, cnt, ans;
}t[N], s[N];
int f[M], k[N], m, n;
int lowbit(int x) { return x & -x; }
void add(int x, int p)
{
for(; x <= m; x += lowbit(x))
f[x] += p;
}
int sum(int x)
{
int res = 0;
for(; x; x -= lowbit(x))
res += f[x];
return res;
}
bool cmp1(node x, node y)
{
if(x.a != y.a) return x.a < y.a;
if(x.b != y.b) return x.b < y.b;
return x.c < y.c;
}
bool cmp2(node x, node y)
{
if(x.b != y.b) return x.b < y.b;
return x.c < y.c;
}
void cdq(int l, int r)
{
if(l == r) return;
int mid = l + r >> 1;
cdq(l, mid); cdq(mid + 1, r);
sort(s + l, s + mid + 1, cmp2);
sort(s + mid + 1, s + r + 1, cmp2);
int i = l, j = mid + 1;
for(; j <= r; j++)
{
while(s[i].b <= s[j].b && i <= mid)
{
add(s[i].c, s[i].cnt);
i++;
}
s[j].ans += sum(s[j].c);
}
_for(t, l, i - 1) add(s[t].c, -s[t].cnt); //注意这里清空不是整个左区间,左区间未必遍历完
}
int main()
{
scanf("%d%d", &n, &m);
_for(i, 1, n) scanf("%d%d%d", &t[i].a, &t[i].b, &t[i].c);
sort(t + 1, t + n + 1, cmp1);
int same = 0, p = 0;
_for(i, 1, n)
{
same++;
if(t[i].a != t[i + 1].a || t[i].b != t[i + 1].b || t[i].c != t[i + 1].c)
{
s[++p] = t[i];
s[p].cnt = same;
same = 0;
}
}
cdq(1, p);
_for(i, 1, p) k[s[i].ans + s[i].cnt - 1] += s[i].cnt;
_for(i, 0, n - 1) printf("%d\n", k[i]);
return 0;
}高斯消元(解线性方程组)
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 15;
double a[N][N], p[N][N];
int n;
void build()
{
scanf("%d", &n);
_for(i, 1, n + 1)
_for(j, 1, n)
scanf("%lf", &p[i][j]);
_for(i, 1, n)
_for(k, 1, n)
{
double x1 = p[i][k], x2 = p[i + 1][k];
a[i][k] = 2 * (x2 - x1);
a[i][n + 1] += x2 * x2 - x1 * x1;
}
}
void Gauss()
{
_for(j, 1, n)
{
int p = j;
while(!a[p][j] && p <= n) p++;
swap(a[p], a[j]);
_for(i, 1, n)
if(i != j)
{
double t = a[i][j] / a[j][j];
_for(k, 1, n + 1) a[i][k] -= t * a[j][k];
}
}
_for(i, 1, n) printf("%.3f ", a[i][n + 1] / a[i][i]);
}
int main()
{
build();
Gauss();
return 0;
}后缀数组
/*
sa[i] 排名为i的后缀的位置
height lcp(sa[i], sa[i - 1]) 即排名为i的后缀与排名为i−1的后缀的最长公共前缀
H[i]:height[rak[i]],即i号后缀与它前一名的后缀的最长公共前缀
最长公共子串(可重叠) height数组最大值 因为最长公共前缀的两个子串的排名一定相邻
本质不同的字串数目 枚举每一个后缀i 对答案的贡献为 len − sa[i] + 1 − height[i]
两个后缀的最大公共前缀 令x=rank[i],y=rank[j],x < y,那么lcp(i,j)=min(height[x+1],height[x+2]…height[y])。lcp(i,i)=n-sa[i]。 用ST表或线段树
*/
#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int N = 1e6 + 10;
int x[N], y[N], c[N], sa[N], rk[N], height[N], wt[30];
int n, m;
char s[N];
void get_SA()
{
_for(i, 1, n) ++c[x[i] = s[i]];
_for(i, 2, m) c[i] += c[i - 1];
for(int i = n; i >= 1; i--) sa[c[x[i]]--] = i;
for(int k = 1; k <= n; k <<= 1)
{
int num = 0;
_for(i, n - k + 1, n) y[++num] = i;
_for(i, 1, n) if(sa[i] > k) y[++num] = sa[i] - k;
_for(i, 1, m) c[i] = 0;
_for(i, 1, n) ++c[x[i]];
_for(i, 2, m) c[i] += c[i - 1];
for(int i = n; i >= 1; i--) sa[c[x[y[i]]]--] = y[i], y[i] = 0;
swap(x, y);
x[sa[1]] = 1; num = 1;
_for(i, 2, n)
x[sa[i]] = (y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k]) ? num : ++num;
if(num == n) break;
m = num;
}
}
void get_height()
{
int k = 0;
_for(i, 1, n) rk[sa[i]] = i;
_for(i, 1, n)
{
if(rk[i] == 1) continue;
if(k) k--;
int j = sa[rk[i] - 1];
while(j + k <= n && i + k <= n && s[i + k] == s[j + k]) k++;
height[rk[i]] = k;
}
}
int main()
{
scanf("%s", s + 1);
n = strlen(s + 1);
m = 122; //m表示字符个数 ascll('z')=122
//桶的范围是1~m
get_SA();
_for(i, 1, n) printf("%d ", sa[i]);
return 0;
}凸包
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const double eps = 1e-8;
const int N = 1e5 + 10;
struct point
{
double x, y;
point(double x = 0, double y = 0) : x(x), y(y) {}
}st[N], p[N];
int n, top;
point operator - (point a, point b) { return {a.x - b.x, a.y - b.y}; }
double operator ^ (point a, point b) { return a.x * b.y - a.y * b.x; } //叉积数学上返回向量,程序这里返回的是值
double dis(point a, point b) { return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)); }
bool cmp(point a, point b) //横坐标第一关键字,纵坐标第二关键字
{
if(fabs(a.x - b.x) < eps)
return a.y < b.y;
return a.x < b.x;
}
int main()
{
scanf("%d", &n);
_for(i, 1, n) scanf("%lf%lf", &p[i].x, &p[i].y);
sort(p + 1, p + n + 1, cmp);
st[++top] = p[1]; //先加入第一个点,第一个点一定是凸包上的点
_for(i, 2, n) //求下半凸包
{
while(top >= 2 && ((st[top] - st[top - 1]) ^ (p[i] - st[top - 1])) < 0) top--; //这里有一个一条边上多个点的情况,也就是相等的情况
st[++top] = p[i]; //但是这道题不影响结果
} //如果要去掉的话就改成<=0 还要写eps
for(int i = n - 1; i >= 1; i--) //求上半凸包,直接复制,改一下循环顺序就好
{
while(top >= 2 && ((st[top] - st[top - 1]) ^ (p[i] - st[top - 1])) < 0) top--;
st[++top] = p[i];
}
double ans = 0;
_for(i, 1, top - 1) //最后栈里面首尾都是起点,所以可以直接求距离
ans += dis(st[i], st[i + 1]);
printf("%.2lf\n", ans);
return 0;
}边栏推荐
- [arkit, realitykit] turn pictures into 3D models
- What are CSDN spaces represented by
- Tornado multi process service
- Two tips for pycharm to open multiple projects
- 2022 tea artist (intermediate) special operation certificate examination question bank simulated examination platform operation
- Selection and practice of distributed tracking system
- Datax的学习笔记
- Conditions for JVM to trigger minor GC
- 【Flutter -- 布局】Align、Center、Padding 使用详解
- Vertical search
猜你喜欢
随机推荐
MySQL strengthen knowledge points
滑动窗口、双指针、单调队列、单调栈
ext4文件系统打开了DIR_NLINK特性后,link_count超过65000的后使用link_count=1来表示数量不可知
756. Serpentine matrix
JVM触发minor gc的条件
【Flutter -- 布局】Align、Center、Padding 使用详解
Study notes of dataX
Polynomial open root
2022年上海市安全员C证考试试题及模拟考试
Nuxt - Project packaging deployment and online to server process (SSR server rendering)
760. 字符串长度
2022化工自动化控制仪表操作证考试题模拟考试平台操作
2022茶艺师(中级)特种作业证考试题库模拟考试平台操作
什么是异步操作
Server memory failure prediction can actually do this!
2B and 2C
Windows通过命令备份数据库到本地
839. 模拟堆
"No input file specified" problem handling
Where are the laravel framework log files stored? How to use it?









