Solution
FFT版子题
时间分块。
用dfs序+划分树预处理,然后考虑修改对询问的影响。
动态规划。
考虑列的顺序对答案没有影响,设
f[i][j][k]
表示DP到了第
i
行,
j
列0个棋子,
k
列
1
个棋子,分类讨论转移即可。
轮廓线动态规划。
记录轮廓线,每次转移枚举选或不选。
贪心。
考虑最优的方案一定是在lca处让两个叶子节点距离相等。树上贪心即可。
(这种题是怎么评上提高+/省选-的啊,QAQ)
单调栈。
考虑棋盘只有两种情况
- 黑格行列奇偶不同,白格不同
- 白格行列奇偶相同,黑格不同
将第一种格子赋为1,第二种为0。查询最大的全1矩阵或全0矩阵。用单调栈优化到
O(nm)
。
树形DP.
设
f[i][j]
表示以
i
为根的子树中满足
j
个客户需求的最小收益,直接转移即可。
斜率优化DP.
设
f[i]
表示处理前
i
个货物的最少时间。
f[i]=min{f[j]+sumT[i]×(sumC[i]−sumC[j])+S×(sumC[n]−sumC[j])}
f[j]=(S+sumT[i])×sumC[j]+f[i]−sumT[i]×sumC[i]−S×sumC[n]
斜率优化即可。
斜率优化DP.
展开方差公式发现有些为常量,只考虑变量。
fi,j={fi−1,j+(si−sj)2}
fi−1,j+s2j=2sjsj+fi,j−s2i
动态规划.
考虑三个点
A(x,y),B(x1,y1),C(x1,y2)(x>x1,y>y1>y2)
A−>B−>C:(x−x1)2+(y−y1)2+(y1−y2)2
A−>C:(x1−x1)2+(y−y2)2
因为
(y−y1)2+(y1−y2)2<((y−y1)+(y1−y2))2
所以第一种转移更优。
所以每次转移时转移每一列最下面的点即可。
树哈希.
用换根DP求出A树中以每个点为根的哈希值与B树中去掉某个叶子节点的哈希值,MAP判重即可。
斜率优化DP.
考虑顺序不影响答案,推完DP方程后斜率优化即可。
斜率优化DP.
考虑每次要么卖出所有股票要么花光所有钱,列出方程后CDQ分治+斜率优化即可。
斜率优化DP.
fi=max{fj+a(si−sj)2+b(si−sj)+c}
fi+2asisj−as2i−bsi−c=fj+as2j−bsj
二分+主席树.
对于每个询问二分答案
k
,比
k
小的设为
−1
,大于等于
k
则设为
1
,判断能否使区间和
≥0
.
考虑按照大小顺序构建二分时的
(1,−1)
序列,那么每次只会修改一个位置,主席树维护即可。
DP+容斥.
g[k][i][j]
第
k
种颜色棋子恰好填满
i
行
j
列的方案数
g[k][i][j]=Ckij−∑x=1i∑y=1jg[k][i][j]×Cxi×Cyj
f[k][i][j]
前
k
种颜色棋子恰好填满
i
行
j
列的方案数
f[k][i][j]=∑x=0i−1∑y=0j−1f[k−1][i−x][j−y]×Cxi×Cyj
斜率优化DP.
设
sum[i]
表示深度大于
i
的节点数.
ans[k]=max(i+⌈sum[i]k⌉)
发现这是一条直线,斜率优化即可。
数论。
稍微分析可以发现
- 当
a=g,b=l
时,答案取最大值。
- 当
a=b=n‾√
时,答案取最小值。
注意精度问题。
Trie树。
按照题意模拟,为每个节点建立go
指针,当当前为字符串结尾或下一字符为/
时尝试跳转。
按秩合并并查集。
考虑撤销操作:
- 上一次操作为加边,则直接删除即可
- 上一次操作为删边,那么相当于没有删边,上一次操作答案判断删除
k
条边后是否仍然存在生成树。
Tarjan+DP。
考虑依赖关系类似于一棵树,Tarjan缩点后DP即可。