2022.7.29 做题记录
乐 通宵了
Luogu7153 Square Pasture G Future 7.0
二维平面上有 \(n\) 个点 \((x_1,y_1),\cdots,(x_n,y_n)\),你需要求出来有多少个集合 \(S\subseteq\{1,2,\cdots,n\}\) 满足:
- 存在一个正方形满足 \(S\) 中的点都在这个正方形中,\(S\) 之外的点都在正方形外。
\(1\le n\le 200,1\le x_i,y_i\le 10^9\),\(x_i\) 互不相同,\(y_i\) 互不相同。可以证明答案 \(<2^{31}\)。
随机跳题.jpg
考虑把所有点按照 \(x\) 排序,然后钦定 \(x\) 的最大值与最小值。
现在相当于要选取一段区间 \([l+1,r-1]\) 的任意子集。记 \(x_r-x_l=p\)。
考虑一个子集 \(T\),若 \(T\) 中 \(y\) 坐标在 \([l,r]\) 中不是排序后的连续段,那么显然不行。
若 \(y\) 坐标确实是一个连续段,设这个连续段是 \([l_2,r_2]\),那么必须要有
- \(y_{r_2+1}-y_{l_2-1}>p,y_{r_2}-y_{l_2}<x_{r+1}-x_{l-1}\)
排序后枚举 \(r_2\) 就行了,复杂度 \(O(n^3\log n)\)。然后发现调爆了。。。先坑着
LOJ2679 箱子 Bins Present 4
随机跳题.jpg
可以发现我们把两个序列 \(a,b\) 分别排序,那么 \(a\) 能放进 \(b\) 里面当且仅当 \(\forall i,a_i<b_i\)。
一开始我想二分,后来观察样例发现没法二分。。但是 \(O(N^2)\) 貌似又过不去的样子
我们发现值域 \(M\) 很小,因此考虑设 \(f_i\) 为 \(a\) 中 \(=i\) 的元素个数,\(g_i\) 为 \(b\) 中 \(=i\) 的元素个数。
然后考虑一个暴力:对每个 \(i\) 我们枚举 \(j>i\) 然后令 \(g_j,f_i\) 一起减,如果 \(f_i\) 减到 \(0\) 了就说明可以,否则不行。
然而这样需要 \(O(NM^2)\),过不去。
其实只需要维护一个指针表示上次减到哪里就做到 \(O(NM)\) 了。AC Code
Luogu5839 Moortal Cowmbat G Present 6
考虑 DP,设 \(f_i\) 表示调整前 \(i\) 个字符的最小代价,转移可以考虑枚举最后一段截到哪里,有
其中 \(\text{cost}(l,r)\) 表示区间 \([l,r]\) 变成同一个字符的最小代价。
这个可以用 \(O(M^3+NM)\) 时间预处理,具体来说是做一个 \(\text{Floyd}\) 然后求一下前缀和 \(S(i,c)\) 表示将前 \(i\) 个字符都变为 \(c\) 的最小代价,那么 \(\text{cost}(l,r)=\min_{c}S(r,c)-S(l-1,c)\)。
直接转移的话复杂度为 \(O(N^2M)\),我们考虑枚举 \(c\),那么有
那么只需要对每个 \(c\) 维护 \(f_j-S(j,c)\) 的前缀最小值即可。复杂度 \(O(NM+M^3)\)。AC Code