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\) 个字符的最小代价,转移可以考虑枚举最后一段截到哪里,有

\[f_i=\min_{j\le i-k} f_j+\text{cost}(j+1,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\),那么有

\[\min_{j\le i-k}f_j+\text{cost}(j+1,i)=\min_{c\in\{\texttt{A,B,}\cdots\texttt{,Z}\}}\left(S(i,c)+\min_{j\le i-k}\left\{f_j-S(j,c)\right\}\right) \]

那么只需要对每个 \(c\) 维护 \(f_j-S(j,c)\) 的前缀最小值即可。复杂度 \(O(NM+M^3)\)AC Code

posted @ 2022-07-30 06:22  云浅知处  阅读(54)  评论(0编辑  收藏  举报