我也不知道为啥我就想把POI的题全都放到一篇blog里写完。
POI 2005
SAM-Toy Cars
贪心,每次选下次出现最晚的。
POI 2006
KRA-The Disks
箱子位置单调,所以记录现在的箱子位置和前缀最小值,向上枚举就行。
OKR-Periods of Words
POI 2007
OSI-Axes of Symmetry
MEG-Megalopolis
树剖 or dfs序上维护前缀和。
POI 2010
GIL-Guilds
按照洛谷的题面,可以发现灰点就是用来搞笑的,然后在生成树上染个色就行了。
KOR-Beads
枚举长度,hash判重就行,注意先预处理出整串的hash值,然后(O(1))求每一段的hash值。复杂度(O(nlog^2 n))
ANT-Antisymmetry
把给定的串每个字符取反放在这个字符后面,然后长度和半径为偶数的回文串就是答案了。魔改一下manacher就能做了。
KLO-Blocks
把每个数都减去(k),然后再求前缀和,答案就是最大的(r-l)满足(s_rge s_l)。求这个东西可以先把前缀和塞到一个单调栈里,然后从后往前计算答案,注意到如果(r_1)的答案在(l_1)处,那么对于(r_2<r_1)的(r_2),其对应的(l_2)也必须小于(l_1)才有可能成为答案,这个东西是有单调性的,所以(O(n))地来 回扫2遍就行了。
PIL-Pilots
枚举右端点,单调队列维护当前最大最小值。因为如果在一个位置不合法了,之后的位置一定也不合法,所以就要出队靠前的元素。
GRA-The Minima Game
一开始想(min-max)搜索,结果一看数据范围就gg了。然后这个题实际上就是一个sb题,容易发现取肯定取相邻的一端。排个序之后(f_i)表示在前(i)小的里面取的答案,然后转移就是第(i)个数是和之前的一起拿((f_{i-1})),还是自已成为一手((a_i-f_{i-1}))。
POI 2011
PAT-Sticks
一个神仙的结论:如果有能排成三角形的三根木棍,那么一定有三根长度相邻的木棍能排成三角形。所以排个序,维护三个相邻的不同色的木棍看是否合法就行了。
TEM-Temperature
一开始没看到是子串,想了好久才发现……
子串就很好做了,要满足每个(r)都大于之前的所有(l),维护一个单调队列就行了。
Lightning Conductor
ROT-Tree Rotations
线段树合并。
POI 2012
FES-Festival
差分约束,然后一个scc里的最长路就是这个scc里能选的范围,然后每个scc又互不影响,答案加起来就行。
LIT-Letters
逆序对数。这里有一种比较短的求A的逆B序对数的方法:
for (int i = 1; i <= n; ++i) {
nxt[i] = hd[a[i] - 'A'], hd[a[i] - 'A'] = i;
}
for (int i = n; i; --i) {
int c = b[i] - 'A';
ans += q(hd[c]);
m(hd[c]);
hd[c] = nxt[hd[c]];
}
POI 2014
PTA-Little Bird
又是一道单调队列优化DP题……
RAJ-Rally
POI 2015
WIL-Wilcze doły
还是一道单调队列题……
这道有点不一样的地方是单调队列维护的不是点的最大值而是区间的最大值(实际上一模一样……)