把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

POI2014

Tourism

容易想到跑出dfs树,这样只有返祖边,且每个点的深度不超过\(10\)

考虑状压祖先的状态,设\(f_{i,S}\)表示dfs到了\(i\)点,祖先的状态为\(S\)的最小值。

\(S\)的每一位由三种组成:\(0\)没选,且没有儿子覆盖,\(1\)选了,\(2\)没选但是有儿子覆盖。

既要从父亲拿到状态又要从儿子返回状态,所以放到dfs序上比较好写,时间复杂度\(O(n3^{10})\)

submission

Freight

我是sb。

显然序列会被分成若干段,每段内的火车先全部过去再全部回来。

\(f_i\)表示\(i\)为某段结尾的最小时间,容易有\(O(n^2)\)的转移:\(f_i=\min\limits_{j=1}^{i} \max(A_i,f_{j-1}+i-j+1)+2(s-1)+i-j+1\)

然后\(\max\)里面的东西一个是单调递增,一个是单调递减的,双指针找到分界点就可以\(O(1)\)转移。

submission

FarmCraft

\(f_i\)表示\(i\)子树内的最小时间,只需要考虑两颗子树到底谁放前面。设两个子树\(i,j\)的大小分别为\(s_i,s_j\)

\(i\)放前面的代价为\(\max(f_i,f_j+2s_i)+1\)

\(j\)放前面的代价为\(\max(f_j,f_i+2s_j)+1\)

因为\(f_i+2s_j+1>f_i\),故可写成\(f_j+2s_i<f_i+2s_j\),即\(2s_i-f_i<2s_j-f_j\)。按照这个东西排序即可。

时间复杂度\(O(n\log n)\)

submission

Salad Bar

带log的是啥玩意儿。

p看作\(1\)\(j\)看成\(-1\),前缀和为\(Sum_i\),则满足条件的区间\([l,r]\)相当于对于所有\(l\leq i\leq r\),使得\(Sum_{l-1}\leq Sum_i\leq Sum_{r}\)

先单调栈处理出每个点\(i\)左边最近的大于它的点,记为\(j\),则最优的左端点为\((j,i]\)区间的最左边的最小值所在的位置。

最小值显然是满足条件的,因为它在最左边所以更左边的左端点显然不满足条件。所以这个是最优的。

如果你被诈骗去写st表就上当了,这个东西在单调栈的时候记单调栈内每个点和上面一个点区间内的最小值,就可以做到\(O(n)\)。写起来极度舒适。

submission

Bricks

首先考虑没有两头限制的怎么做。这是一个经典问题,具体的,每次选出个数最大的放在序列末尾,如果和当前序列末尾一样就用第二大的。用堆维护这个过程。

头上的限制实际上没什么用判判就好了。主要是尾上的限制使得同色的不能放在最后。则在放的时候如果剩余的大小相同就放和尾上一样的颜色即可。这样可以尽可能使得尾上不重复。

submission

Around the world

sb卡常题。

发现可以\(O(n)\)回答一个询问。先断环为链,然后处理出\(fa_i\)表示\(i\)往后一步能跳到哪里。

从前往后枚举起点,然后类似带权并查集不断和父亲合并直到超出范围。所有答案取最小即可。

submission

Criminals

题目的限制可以拆成两个部分:首先求出\(i\)点向左右匹配分别到\(L_i,R_i\),然后看\([1,L_i)\)\((R_i,n]\)内有没有重复元素。

第二部分是平凡的,只需要处理出每种颜色第一个位置然后求后缀min即可。

第一部分可以用朴素的子序列自动机处理,但是是\(O(nm)\)的。考虑题目中给出的额外限制:每种颜色只在每个序列中出现至多一次,因此子序列自动机每个位置只需要维护这个点在子序列中下一个点在哪里即可。

匹配的过程暴力匹配,但是如果和前一次匹配的串重复了就不再匹配,容易发现每个点只会操作一次,因此总复杂度是\(O(n)\)的。

submission

Solar lamps

首先考虑将被照亮这个事情转化成偏序上面的问题。设灯为\((P_x,P_y),(Q_x,Q_y)\),方向向量为\((X_1,Y_1),(X_2,Y_2)\),其中要求\((X_1,Y_1)\)\((X_2,Y_2)\)的顺时针方向。可以发现\(Q\)能被\(P\)照亮当且仅当\(Q_yX_1-Q_xY_1\geq P_yX_1-P_xY_1,Q_xY_2-X_2Q_y\geq P_xY_2-X_2P_y\),则分别以这两个值为坐标就可以变成二维偏序问题。

接下来的问题就是二维矩形的\(k\)大值,显然可以整体二分,具体的,设当前中点为\(mid\),先将所有点按第一维优先,第二维其次排序,则可以先把所有小于等于\(mid\)的点加入数据结构,然后每个点查看够不够\(k\)个点,如果够划入左区间,否则减去这个值以后划入右区间。

数据结构用个树状数组即可。时间复杂度小常数\(O(n\log ^2n)\)

注意有两个向量共线的情况,可以扰动一下。

submission

posted @ 2023-01-04 15:50  275307894a  阅读(41)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end