7.17 ZROI-Day4模拟赛
赛时历程
看T1,“四联通”,什么意思呢?然后我随手画出了几个俄罗斯方块,欸,突然俄罗斯方块都是“四联通”的,哦,而且是“四联通”的所有情况,那这题岂不是得叫“俄罗斯方块”?然后我又画了一会儿,发现这个“四联通”的意思好像是大于等于四个块联通,嗯,DP的思路大概有了,记录一下这一列的两个状态,上一列的两个状态,好像还得记录联通的个数,写着写着变成了7维DP,调试了巨大久,分类讨论非常多,然后,终于过了第一个样例了之后,过不了第二个样例,,然后看T2和T3也不像好搞的样子,甚至暴力也不好搞。
尝试硬着头皮写暴力了?但是效果可能不好,反正没写出来。
刚到最后的T1抱玲了,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。
赛后发现
我是伞兵。T1题意看错,后两题80分暴力没拿。
技术总结
T1
考虑选 (i) 个连块,即上下都涂黑的块。
连块不能相邻,上下在中间的空挡最少需要填充(k-1)/2,即min(A,B)-k>=(k-1)/2
考虑外边的涂色卡边界的问题,两端要剩下的位置要大于等于剩下的涂色
记录两个值,一个是所谓的放置整块的方案T,一个是整块内排布的方案sum
T=(n-S+1),sum就需要分类讨论,不选择连块,即k=0那么二者只有一个存在的情况,sum=1,否则sum=0
对于k=1,如果二者摆完连块后会剩下0个,那么就只有一种情况,sum=1,否则左右可以更换一次,sum=2;
对于其它的情况,考虑k为奇数还是偶数
如果k是奇数,那么$sum=2C(A-i,i/2)(B-i,i/2); $
考虑(i)为奇数会有(i/2)下取整个空挡,剩下了(A-i)个自由兵,这些自由兵就在这(i/2)个空挡中选择,可以理解为选择(i/2)个和连块紧贴,上下颠倒一次所以乘2。
否则 (sum=C(A-i-1,i/2-1)*C(B-i+1,i/2)+C(B-i-1,i/2-1)*C(A-i+1,i/2);)
因为这里有奇数个空挡,所以说需要分开考虑谁选择小的那批空挡
则这次的方案是T*sum
T2
前10分是(q,n,mle 1000) 的“暴力”,线段树区间赋值就能 (O(qmlogn)) 的完成了。
然后是性质分,只有其中一个修改操作的,只有swap的话,那不管怎么换,答案都是0,这是闭着眼都能拿到的20分。
接下来是正解,操作讲解而非引出正解的思路讲解。
考虑倒着扫描作为操作的 (m) 序列,对每个位置建立一个vector,表示这个位置被询问3给访问的时刻,然后记录一个set,存放所有被询问3访问的位置,然后对于Q序列,以左端点为下标,记录所有询问。
对于操作三,将现在的时刻放入这个询问的位置的vec里。
对于操作一,考虑交换二者的vector,这是由于操作是倒着来的,所以其实是先进行了swap(x,y)再询问了y这个位置,所以认为y是在现在x被访问的时刻给访问的。对于操作二,区间覆盖操作,考虑只修改被询问的点,这个时候我们的set就派上用场了,可以直接找到需要覆盖的且被操作三访问的点,由于是倒着操作的,所以它的操作是一定会影响到那些还没有被覆盖的位置的,而它赋值过之后在它之前的操作也不可能再对它动过的区间进行到修改,因为它是靠后的,所以遍历过这些需要覆盖的且被操作三访问的的点的vec之后,要把他们的vec清空,遍历vec干什么呢,这些被询问的点的vector里放入了它被访问的操作时刻,我们考虑以操作时刻为下标建立树状数组,每个记录操作 (1)~(x) 所产生的查询的值的和,那么这一次操作就是在向树状数组下标 (x) 插入这次区间覆盖的值,这里的 (x) 是遍历vec得到的操作时刻,这些时刻当前都会被加上这次区间覆盖的值,做完操作以后,就处理左端点在这个位置的询问,由于左端点在这个位置,且操作只被处理到了这个端点开始的地方,所以直接查询树状数组里左端点所挂的右端点 (y) 的前缀和,就是进行操作 (i)~(y) 所产生的贡献,直接放入 (ans_{id}) 里即可。
这道题思想的核心就是对于有swap的操作,正着来容易毒瘤,所以反着来;对于这种操作产生的影响是一段区间的,考虑把操作对应的对询问的影响保存起来;还有就是把询问离线下来进行操作,可以采用这种把询问挂在左端点或者右端点的方式。感觉还需要再悟一悟,让思路更自然一点。
T3
考虑50分暴力分,考虑有 (i) 个放入了普通盒子,一共有 (j) 个普通盒子,那么这个方案数就是(C(n,i)*S(i,j)) 这个时候就有 (n-i) 个放入了饭盒里,所以这次对于 (ans_j) 的贡献就是 (f[n-i]*C(n,i)*S(i,j))。然后递推斯特林数和组合数就能够得到50分了。