一些东西

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,模拟赛不取模乱取模,傻逼。

posted @ 2024-05-17 17:03  Ishar-zdl  阅读(134)  评论(0编辑  收藏  举报