poi2010 切题记

17th Polish Olympiad in Informatics

Tasks

Guilds (Stage I) (100/100)
Railway (Stage I) (0/100)
Beads (Stage I) (100/100)
Divine Divisor (Stage I) (100/100)
Intelligence Test (Stage I) (100/100)
Antisymmetry (Stage II - day 0) (100/100)
Hamsters (Stage II - day 1) (100/100)
Blocks (Stage II - day 1) (100/100)
Sheep (Stage II - day 2) (100/100)
Teleportation (Stage II - day 2) (100/100)
Monotonicity (Stage III - day 0) (100/100)
Monotonicity 2 (Stage III - day 0) (100/100)
The Minima Game (Stage III - day 1) (100/100)
Lamp (Stage III - day 1) (0/100)
Frog (Stage III - day 1) (100/100)
Ones (Stage III - day 2) (0/100)
Bridges (Stage III - day 2) (100/100)
Pilots (Stage III - day 2) (100/100)

       不做了不做了弃坑了。。。写下题解吧。本来想把railway切掉的发现线段树套set水不掉还要在写一个线段树。。。就放弃了

Guilds SB题。如果有孤点,显然无解;否则按照在dfs(或者bfs)树的深度奇偶性染色即可。

Beads 根据调和级数可知暴力是NlnN的。具体判断用hash即可。

Divine Divisor 数学好题。这题就是统计幂次最高的质数的个数和幂次。显然由于每个数<=10^18,预处理10^6的质数然后把每个数中<=10^6的质数都去掉;剩下的显然只有p,p^2,pq,前两种分别用miller_rabin和开根号;否则可以把这个数和所有数求一下gcd得到p和q,如果得不到也没事,只要知道出现次数即可。

Intelligence Test 对每一个询问维护一个指针表示当前到了哪里然后统一操作即可。

Antisymmetry 把奇数位的取反就变成manacher求最长偶数回文串。

Hamsters 用kmp预处理两个串最长的重叠部分然后Floyd+倍增即可。注意自己也可以套上自己。

Blocks 对于询问k,把所有的都减去k然后求前缀和b[i],然后就是求最大的j-i使得b[j]>=b[i],显然i在单调递减队列上,j同理。然后维护两个指针即可。

Sheep 显然对于某一个分割线合法就永远合法,否则永远不合法,然后dp即可。注意不能nmlogm预处理某一条线是否合法,要枚举羊然后双指针去扫。

Teleportation 把所有点分成三类,s1为和直接和1相连的,s2为和直接和2相连的,剩下为s3。显然s3里面的不能同时连向s1和s2,那么对于s3里面的点,如果和s1中某个点相连那么不妨和s1里面所有点相连,和s2相连同理;否则连向s1和s2中点多的那个。这样应该是最优的吧因为每个点都连了尽可能多的点。

Monotonicity 下面那题的弱化版。

Monotonicity 2 令dp[i]表示到i为止的最优解,显然因为定下dp[i]就定下了符号然后树状数组优化转移即可。可以贪心地证明这样是对的。

The Minima Game 显然如果取了某一个不妨把比它大的都去掉不会吃亏。那么排序然后令dp[i]表示先手取前i个的最大值,然后就是dp[i]=max{a[i]-dp[i-1],dp[i-1]},可以变成两个变量转来转去。

Frog 预处理每个点下一步会跳到哪里然后倍增。

Bridges 二分答案然后就变成经典的混合图欧拉回路网络流模型。还要输出方案十分蛋疼。

Pilots 单调队列SB题。

        代码戳→这里

by lych

2016.6.8



你可能感兴趣的:(字符串,动态规划,图论,网络流,单调队列)