1、前言
今天是选拔赛第四天,开始出来的成绩真的把我吓到了——第18名,而且只有65分,醉啊!后来发现原来是第一题的数据出现了一些莫名其妙地错误,后来改了之后终于才正常一些,但是这次,由于第二题的贪心并没有想出来外加暴力打表错了一个。
2、Kod 隐藏数列
大概题意:现给出一个数组y,y[i]表示在排列x中第1~i-1位数中有多少个比第i个数大的。请求出x排列。
题解:以前应该是做过的,但是好像数据范围并不是一个数量级的,这道题明显大些,不能直接for循环贪心吧。显然我们可以直接知道第一位到倒数第二位这些数有多少个比最后一位大,就等价于知道了最后一位的排位。然后删掉最后一位之后,需要解决的问题不变,只不过少了一位,所以可以动态维护一个排列,支持删除一个数组和查询k大值的操作,可以使用线段树,平衡树,或者二分+树状数组解决(显然线段树是最好写的)。
3、Lamps 开关灯泡
大概题意:有一组灯泡,存在一一对应的开关控制灯泡。你可以为第i个开关添加控制关系:控制第i+1个灯泡或i-1个灯泡。每次使用灯泡,将会改变它所控制的所有灯泡的状态(异或)。现请得到一个方案,使在以最佳方式关闭灯泡的情况下,尽量保留最多的灯泡。
题解:贪心题,可惜并没有做出来。部分分情况,30分的暴力;70分的DP(不太清楚,出题人说的)。考虑一个结论,从左到右扫描:如果有0-1或1-0存在,将其视为一个整体,开关互相控制,不论如何都会保留一个亮的,答案+1;如果有1-1-1存在,开关互相控制,同样可以保留一个亮的,答案+1。yml没有AC的原因在于优先级考虑有些许问题,面对1-1-1-0-1的情况,若是先考虑1-1-1和0-1,就可保留2个;若先考虑1-0,就只能保留1个了。
4、Permutation 置换排列
大概题意:给出一个长度为n的严格递增的序列T,有多少个该序列的排列S满足:min(S[i],T[i])=k(1<=i<=n)。
总结:这道题是防AK题。。。直接打了30分暴力弃疗了,看了题解之后也很庆幸自己弃了疗。。。
题解(from Picks):
本题等价于给每个位置i选择一个y[i],然后求和min(s[i],s[y[i]])=K,用f[i][j][k]表示前i位,有j位还没有选择,和为k的方案数。
1.y[i+1]=i+1;f[i+1][j][k+s[i+1]]+=f[i][j][k];
2.y[i+1]<i+1 且 某个之前未被选择的j满足y[j]=i+1 j<i;f[i+1][j-1][k]+=j*j*f[i][j][k];
3.y[i+1]<i+1 且 没有之前未被选择的j满足y[j]=i+1 j<i;f[i+1][j][k+s[i+1]]+=j*f[i][j][k];
4.y[i+1]>i+1 且 某个之前未被选择的j满足y[j]=i+1 j<i;f[i+1][j][k+s[i+1]]+=j*f[i][j][k];
5.y[i+1]>i+1 且 没有之前未被选择的j满足y[j]=i+1 j<i;f[i+1][j+1][k+2*s[i+1]]+=f[i][j][k]。