AtCoder Beginner Contest 278
口胡一下,从青色开始
E - Grid Filling
给定一个W×H的矩阵,每个格子有一个数,在1和N之间,给定w<=W,h<=H,对于每个满足1<=i<=W-w+1,1<=j<=H-h+1的格子(i,j),求以它为左上角的w×h矩阵被遮住后整个大矩阵还剩下几种数字。
W,H,N,w,h<=300
首先我们看见这个熟悉的300就知道是立方算法
又注意到N很小,就想到可以搞N个二维前缀和
每次遮住数字的小矩阵一转移我们就考虑他与在上一个格子时对于每一种数字的影响的变化
复杂度O((W-w+1)×(H-h+1)×N)
F - Shiritori
给N个词语S1-SN,两个人轮流玩词语接龙,词语不能重复,如果两人都足够聪明,问谁会赢。
N<=16,|Si|<=10
我想,词语接龙,这不水题吗,数据这么小,直接广搜
然后我意识到16的阶乘还是有点大了
但是数据这么小,不是搜索就是状压
而且我们只需要考虑哪些词语用过了,不需要考虑用的顺序
f[t][c]:字符串使用状态为t,前一个单词末尾为字母c时先手赢还是输?1:0
初始化:f[(1<<n)-1][所有单词的最后一个字母]=1
转移:如果全部满足t&(1<<k)为0的k的f[t+(1<<k)][s[k][-1]]都为0,则f[t][s[k][0]]=1
其余情况f[t][c]=0
最后先手能赢当且仅当存在i<=n使f[1<<i][s[i][0]]=1
复杂度O(n*2^n)
G - Generalized Subtraction Game
居然是一道交互题!
给定N,L,R,你可以选择先手还是后手,与评测机玩游戏并且胜利。这个游戏是,一开始桌子上有N个数,1到N,两个玩家轮流选一个数对(x,y)使得x,x+1,……,x+y-1这y个数都还在桌面上,并且把这y个数扔掉,最后无法选择这种数对的选手输。接受评测机给你的(x,y),输出你决定的(x,y)。特别地,如果输入的(x,y)为(0,0),你赢了,如果为(-1,-1),你输了,请结束程序。
1<=L<=R<=N<=2000
我们考虑模仿评测机的行动
我们先把这个数列变成两段对称的(我们要拿先手,挖掉中间若干个数)
如果评测机选左边的,你选右边对称的就行了
如果评测机选右边的,你选左边对称的就行了
最后一定评测机输
但是有时候你没办法把一开始的数列变成对称的两段
变成对称的两段需要满足第一次选取的y与N同奇偶
所以我们可以设计:
①L==R&&N%2!=L%2
这里需要我们特殊对待
但是每次选取的y已经固定了
设计一个SG函数直接递推就行了
看一下先手必胜还是后手必胜
然后在每一轮行动的时候枚举要选的x看一下哪个必胜就行了
②else
按照上面那段话处理
Ex - make 1
难,场上仅1人耗时55min做出,应该是黑题。
给定A,B。求有几个长度为A的数字不重复的非负整数序列,其中每一个数字都<2^B,并且它的一个子序列中所有数异或起来是1。
不会