前言
这次比赛考得也非常差,19分,57名。T2提交错了,不然我可以16名。 应得:T1WA5,T2TLE46.2,T3WA0,T4WA6.3。实得:T1WA5,T2WA0,T3WA7.7,T4WA6.3。
T1 Dance Mooves
题目大意
有n个点,每个点上都有一只牛,这些牛会无限交换k次。问这些牛最多能到多少个位置。
正解
这道题用图论。
用 表示
交换k次后到达的点。我们把
和
连一条有向边,则构成了一个有很多环的图。
我们模拟交换k次,把到过的点作为边权放在边
上。则每个环里面全部点的答案为环的边上经过的点的数量。
我们用类似边集数组的链表存储边权。在另一个图里把和每个
经过的点连一条有向边,则访问每个边权可以这样:
for i=last[x] i!=0 i=next[i]
这样就能解决空间问题。
赛时情况
比赛时我不会做,打表骗到5。
T2 No Time to Paint
题目大意
给你一个字符串s,要你构造s。你可以把一段区间变成同一个字符。问你在不动区间(l,r)的情况下,构造s的最小步数。
正解
这道题我们先预处理出两个数组f[]和g[]。f[i]表示涂钱i个栅栏最小需要的时间,g[i]表示涂前j个栅栏需要的最小时间,询问l和r则是f[l-1]+g[r+1]。
难点就是预处理。我们先看f。我们设一个位置桶h[s[i]]表示s[i]出现的最后一个位置。这样就有两种情况需要讨论:
1.如果s[i]是第一次出现,那么就要多涂一次。
2.如果s[i]不是第一次出现,那么就要判断区间(h[s[i]],i)内有没有比s[i]小的字符了。要枚举字符,不能枚举区间,不然会TLE。adj表示区间内有没有更小的字符。
g也同理,只不过反着来罢了。
赛时情况
我想用区间DP,结果提交错代码,WA0。
T3 Spaced Out
题目大意
有一个边长为n的方阵,每个格子里有一个数。你要在这个方阵里选出一些格子,满足每个边长为2的子方阵里必须有两个格子被选中。问能选的最大值是多少。
正解
分类讨论。讨论出每种情况。
我们先讨论第一行。用1表示选,0表示不选,第一行有一种特殊情况:
10101010101010101010
这种情况时,第二行可以有两种情况:
1.照抄
10101010101010101010
2.反着来
01010101010101010101
因此我们发现,不管前一行选什么,这一行都有两种情况,不影响其他行。
而其他情况,第二行只能反着来。因此我们发现,它其实也是第一种情况,只不过第一种情况按行来,其他情况按列来。每一列都是1010101010101……的结构。
赛时情况
我想着用动规,结果错了,WA7.7。
T4 Uddered but not Herd
题目大意
给你一个字符串,构造一个a到z的排列 。 选择多个s的子序列,然后用最少的子序列个数覆盖这个字符串。
正解
这道题用状压DP。
我们先把字符串中每个字符在正常字典中的位置求出来。
赛时情况
我用奇葩算法骗了6.3分。
总结
这次比赛有两个问题:
1.把简单的题想复杂了。
2.放弃简单的去做难得。