一些东西
1.19(long long ago)
LCA(DFS序)
int get(int x, int y) {return dfn[x] < dfn[y] ? x : y;}
void dfs(int id, int f) {
mi[0][dfn[id] = ++dn] = f;
for(int it : e[id]) if(it != f) dfs(it, id);
}
int lca(int u, int v) {
if(u == v) return u;
if((u = dfn[u]) > (v = dfn[v])) swap(u, v);
int d = __lg(v - u++);
return get(mi[d][u], mi[d][v - (1 << d) + 1]);
}
int main(){
for(int i = 1; i <= __lg(n); i++)
for(int j = 1; j + (1 << i) - 1 <= n; j++)
mi[i][j] = get(mi[i - 1][j], mi[i - 1][j + (1 << i - 1)]);
}
LCA(st表)
void dfs(int x,int y){
f[x][0]=y;d[x]=d[y]+1;
fo(__lg(d[x]))f[x][i]=f[f[x][i-1]][i-1];
for(int i:node[x]) if(i!=y) dfs(i,x);
}
inline void lca(int x,int y){
if(d[x]<d[y])swap(x,y);
while(d[x]>d[y])x=f[x][__lg(d[x]-d[y])];
if(x==y){write(x),putchar('\n');return;}
for(int k=__lg(d[x]);k>=0;--k)
if(f[x][k]!=f[y][k])x=f[x][k],y=f[y][k];
write(f[x][0]);putchar('\n');return;
}
int main(){
int a,b;n=read(),m=read(),s=read();
fo(n-1)a=read(),b=read(),node[a].push_back(b),node[b].push_back(a);
dfs(s,0);
fo(m)a=read(),b=read(),lca(a,b);
}
森林启发式合并
树上最长路想直径,有向无环图上想拓扑和DP,DAG上的DP问题。
5.17
注意顺序结构,及时取模,[分手是祝愿]
遇到位运算期望贡献要按位考虑概率,不要定式思维,多一些创造性([HNOI2011] XOR和路径)
5.24
写点计划,不知道干嘛
先把组合数学补了,然后补状压,然后再补线段树合并和一些简单图论(差分约束和spfa并查集欧拉路之类的),然后重学平衡树,再学卡特兰数bsgs之类的,然后开莫反之后的一些东西
7.31
这次真成唐氏记录了,
模拟赛上来不要先看数据结构,建边要双向,不知道咋维护了想想STL,尽量用自带的函数(你觉得你的实现比人家好?)。
别什么东西都往结构体里放。
理清思路再写,think twice,code once
11.14
你他妈傻逼吧,CSP 没写 else,模拟赛不取模乱取模,傻逼。