csp-s模拟51
T1:
树剖,分情况讨论当前root与操作节点的位置关系
1.u,v的lca -> lca(u,v),lca(u,root),lca(v,root)中dep最大的点
2.\(tree_u\)的权值和 -> 若u不在1-root的链上,\(siz_u\)。否则,v是u到root链上u下方的第一个点,\(siz_1-siz_v\)
特别的,root的ans为\(siz_1\)
T2:
考虑实际含义:
每个格子有一个权值,每一列格子的权值都是相同的。
从一个起点开始,每次可以向上走一格或者向左上角走一格,直到走到最上面一行为止。
你需要最小化经过的格子的总权值。
首先最优路径显然是先斜着走到较小的那一列,然后再一直向上走
所以我们设\(g_y(i,x)\)表示考虑到第y列,从(x,y)开始斜着走到i列再顶到头的代价
\(t_y(x)\)表示表示考虑到第y列,从(x,y)开始走到顶的最小代价
则\(g_y(i,x) = sum_{i,y} + (x-(y-i+1))*a[i]\)
\(t_y(x)=min_{i=1}^y{g_y(i,x)}\)
发现当y一定时,g函数是一个关于x的一次函数,而t函数则是一个由g拼成的凸包
而当y增大时,g函数只有截距会变化
所以可以将询问离线下来,从大到小枚举y,每次插入一个一次函数,维护凸包即可。
T3:
生成函数+FFT 咕了