做题记录(Nov.)
11.1
CSP,炸了。
S-T1(P14361)
先让每个人选自己最大的,然后在人数最多的那个选项中,选择一些人换选项。把换选项造成的损失放在一起排序,选最小的若干个。记录一下一个人的两种损失不同时选。
S-T2(P14362)
错解(CCF 没卡),洛谷上能过:先把所有边扔到数组里排序,\(2^k\) 枚举哪些点要用,然后跑最小生成树,加上剪枝(边选够就退,答案已经不优了就退)。
正解:注意到 \(m\) 条边里只有 \(n - 1\) 条有用,放到一起。把所有特殊点的边各自放到一起。枚举 \(2^k\),对用到的特殊点和原来的边用归并的方法选择,启发式合并并查集,时间复杂度可视为 \(2^knk\)。
S-T3(P14363)
11.6
CF436E *
第一次做反悔贪心。
考虑一颗星一颗星来加。有 \(4\) 种选择:
- \(i\):从 \(0\) 到 \(1\)。
- \(i\):从 \(1\) 到 \(2\)。
- \(i\):从 \(1\) 到 \(0\),\(j\):从 \(0\) 到 \(2\)。
- \(i\):从 \(2\) 到 \(1\),\(j\):从 \(0\) 到 \(2\)。
操作方法:用 \(5\) 个堆维护:\(a\),\(b\),\(a-b\),\(b-a\),\(-a\)。
用这五个堆去看那种操作最优,然后进行相应的操作,更新堆里的数据。堆顶若有以前的过期数据,可以在用之前用 while 清掉。
11.11
CF1059E
我是猪猪,调了半天。题解。
11.15
P3607
我真的能独立想到这个鬼区间 DP 吗?
\(f_{l,r,L,R}\) 表示在 \(l\sim r\) 上值域为 \(L\sim R\) 的最长不降子序列。看转移方程就懂了。
f[l][r][L][R] = max (f[l][r][L + 1][R], f[l][r][L][R - 1]);
f[l][r][L][R] = max (f[l][r][L][R], f[l + 1][r][L][R] + (a[l] == L));
f[l][r][L][R] = max (f[l][r][L][R], f[l][r - 1][L][R] + (a[r] == R));
f[l][r][L][R] = max (f[l][r][L][R], f[l + 1][r - 1][L][R] + (a[l] == R) + (a[r] == L));
最后一个是关键,表示翻转 \(a_l\) 和 \(a_r\),每次翻两个,是满足条件的。
11.21
P7154
神仙 DP 题,题解思路很神秘。
大致做法:把所有 \(s,t\) 都放到一个数组里排序,区分一下,从小到大,相等就让 \(t\) 在后面。
状态数组 \(f_{i,j,0/1}\) 表示遍历到第 \(i\) 个数,\(1\sim i\) 中有 \(j\) 个属于 \(s\) 的数要匹配,但还没有和 \(t\) 中的数匹配的。\(0/1\) 表示前 \(i\) 个数中属于 \(s\) 的数是否都要匹配。
枚举时看属于 \(s\) 还是 \(t\)。
若是 \(s\),则转移方程:
注:若不全选,前面没有全选那么这个选不选没关系,否则可以前面全选这个不选。若要全选,则前面要全选,这个也要选。
否则,
注:若前面没有全选,那么必须选择一个前面的和这个匹配,前面有 \(j+1\) 个。
若前面全选,那么随意,要匹配就和前者同理。
11.22
AT_abc433_f
水篇题解。
11.25
P6088
好题。
做法一:可持久化 Trie 树。
做法二:把做法一的询问离线下来,用哈希表或 unordered_map 遍历一遍树。

浙公网安备 33010602011771号