16th Polish Olympiad in Informatics
Tasks
Fire Extinguishers | (Stage I) | (100/100) |
Pebbles | (Stage I) | (100/100) |
Algorithm Speedup | (Stage I) | (100/100) |
Elephants | (Stage I) | (100/100) |
Fire Brigade | (Stage I) | (0/100) |
Isles in a Triangular Grid | (Stage II - day 0) | (100/100) |
The Walk of Bytie-boy | (Stage II - day 1) | (100/100) |
Ticket Inspector | (Stage II - day 1) | (100/100) |
Architects | (Stage II - day 2) | (100/100) |
Ice Skates | (Stage II - day 2) | (100/100) |
Hexer | (Stage III - day 0) | (100/100) |
Words 2 | (Stage III - day 1) | (0/100) |
Words | (Stage III - day 1) | (100/100) |
Arrays | (Stage III - day 1) | (100/100) |
Island | (Stage III - day 1) | (100/100) |
The Code | (Stage III - day 2) | (100/100) |
The Search | (Stage III - day 2) | (100/100) |
Fire Extinguishers 贪心。令f[x][y]表示x所在子树中距离x为y还没有被覆盖的点有多少;g[x][y]表示x所在子树距离x为y的灭火器还能覆盖多少。贪心转移即可。
Pebbles 相邻的两两为一组,每组的差为一堆石子就变成经典问题了。
Algorithm Speedup 暴力记搜判断。用hash记录即可。
Elephants 置换找循环节,然后两种方法贪心,一是用循环节中最小的一个个去交换;或者先将循环节中最小的和所有的交换再一个个交换。
Isles in a Triangular Grid 码农题。可以由面积为i个外面加入一个小三角形得到面积为i+1的。注意中间有洞的情况。
The Walk of Bytie-boy 从中间往两边两端宽搜即可。
Ticket Inspector 傻逼dp。
Architects 用单调队列记录一个递减序列,当长度>K的时候把队尾弹掉。
Ice Skates 注意到不合法当且仅当存在[i,j]使得[i,j]中的人数>(j-i+1+d)*k,线段树维护a[i]-k的最大子序列和和d*k比较即可。
Hexer 大力dijkstra+堆优化跑最短路。
Words 神题。。。定义一种逆变换将10变成1,1变成0。然后对于每个a[i]每一轮变成a[i]-1,如果a[1]=0显然可以变成2,如果a[n]=3显然可以变成2,;如果a[n]=1显然可以直接删掉。然后对于a[i]=0的情况,如果a[i-1]=1就把a[i-1]变成2然后删掉a[i];如果a[i-1]=3就把a[i-1]和a[i]都变成3,显然序列不变,a[i-1]!=1或3时无解。暴力是Σai的。如果把这个过程用堆来优化就可以变成NlogN可以过掉这题的加强版。。然而实在太蛋疼。
Arrays 可以发现合法的冲要条件是对于a,b,不存在某一行(列)ai和bj,使得x∈ai而x∉bj,按某种方法对应行和列然后判断即可。
Island 把有用的边跑一个半平面交得到的凸壳就是路径。
The Code 如果存在三个编码A,B,C,令S为A后面接上B得到的字符串,如果C是S的子串且不是S的前(后)缀则C不合法。打标记暴搜即可。感觉可以用AC自动机做到O(N)。
The Search 题意:猜数游戏。可以询问那个数是否比x大或者小。回答Yes的代价为a,回答No的代价为b,你要给出一个策略在最坏情况下代价最少。
令dp[i]表示代价为i时最多可以猜数范围为多少的数。然后用和二分一样的方法即可。
代码戳->点击打开链接