6.17赛后总结

6.17赛后总结

赛时历程

这次看题比较快,大概七点二十看完题目且搞完了预处理,然后上了个厕所。

从七点三十到八点,搞T1的暴力,虽说是全排列,但意外的调了一会儿,一开始仍然用栈来写假了,然后用的dfs枚举子序列,得10分。

然后八点到八点五十搞T3的暴力以及第一个性质分,稍微造了一点数据感到没问题了,24分。

T2题面最长,一开始觉得应该最难搞暴力(打T3之前尝试了一下T2,发现还需要思考如何操作才能保持顺风,故到了现在),所以最后搞的这个。接着就开始思考T2,大概到了九点半,终于想到了操作方式,知道了要判异或和然后比较一下异或和和a异或之后和a的大小,这样起码可以写出\(n^2\)暴力了,然后发现有一个性质分只用用线段树维护1的个数即可,于是大概在十点搞到了35分,然后对拍很顺利,接着就开始进行转化,期间还回去看了看T1和T3摇摆了一会儿,终于到了11点多一点,发现了最终结论,但是并不会用数据结构去搞我想要的东西,于是就坐到了结束。

赛后发现

得分 10+35+20

1 没想到T3挂掉了4分的性质分,有一个地方if(s[i][j]=='o')应该res++,可我顺手打了个break。

2 各位都表示T1才是最简单的,有3人A掉了。代码果然是最简单的。可能开T2确实是战略失误。

3 虽然今天被山东省队吊踩,但感觉这套题相对昨天来说,思路和代码都好搞一点?

技术总结

T1

T1 的两个subtask进行了充分的提示。奈何没有多想。

从sub3考虑(x递增),对于递增的x,可以在a中搞从小到大的插入,由于先插入的数能插入的位置被后插入的数完全包含,一个后插入的数能插入的位置会增加已经插入过的数的数量而与插入的方式无关,乘法原理相乘每个数插入的方案数即可。

从sub4考虑(\(x_2=1\),确定是逆序,这样只用考虑第一个数在前边的位置状态),对于不递增的x,考虑第一个逆序的状态,由于选择的第一个数一定要在\([1,n-m+1]\)中是最小的,假设选择了位置\(p_1\),那么第二个数要在\([p_1+1,n-m]\)中是最小的,每次可选的右端点是+1的,所以说,出现 \(x_i\)\(x_{i-1}\) 逆序的时候,这个\(x_i\)选择的位置一定是出现在第\(i\)个数可选位置的右端点上,也就是新扩充的这个可选的位置\((n-m+i)\)上,否则上一次选择的时候由于\(x_i\)\(x_{i-1}\)的可选区间内,选它一定是更优秀的,就不能满足序列 \(x\)\(a\) 的最小 \(m\) 长子序列,而这个时候,由于\(i\)选在了自己的右端点上,后边的一个连续的后缀必须就是\(x\)剩下的数,这样,我们去掉这\(n-i+1\)个数,考虑前\(i-1\)个x的递增序列,用剩下的数扩充成\(n-m+i-1\)个数的序列的方案数量即可。

T2

T2 找到了结论却并不会实现。首先是NIM博弈的结论,异或和不为0,先手必赢,因为一定可以控制下一个局面的异或和是0,控制的方法就是,考虑石子的异或和x,可以找到一个石头堆,拿走一些石头,使得新的异或和为0,换言之,我们考虑先去掉\(a_i\)的影响,即用\(x \ xor\ a_i\),然后考虑将\(a_i\)更改成一个更小的数量放回原序列,和剩下的数的异或和相等,那么它们异或就会得到0,即要找一个\(a_i\)使得\(x\ xor\ a_i<a_i\) ,把\(a_i\)变成\(a_i\ xor \ x\)就能够使得新的异或和为0,显然对于每个满足条件的\(a_i\) 来说通过更改来让异或和为0的操作是唯一的,所以只用找到满足要求的\(a_i\)的数量即可。然而不等式是抽象的,考虑将这个条件进一步转换。首先考虑对于原异或和x,\(a_i\le x\) 那么若\(a_i\ xor\ x< a_i\),一定要消除掉\(x\)的高于\(a_i\)的位,方法只有让\(x\)的最高位等于\(a_i\)的最高位;然后考虑原异或和\(x<a_i\),只要异或后不增加\(a_i\)即可,那么只要\(x\)的最高位存在于\(a_i\)当中就好,因为首先消除掉了这个位,那么\(a_i\)至少减少了一个\(2^p\),低位是增是减都不会让异或值再大了,如果不消除这个位,后边不管怎么消都不会减掉这个增加的\(2^p\),所以只能也必须让这个最高位存在于x中。然后发现第一个结论,\(x\)的最高位等于\(a_i\)的最高位,其实还是最高位存在于\(a_i\)。这样,问题就转换为了,对于一个区间,设区间异或和\(x\)的二进制最高位是p,问二进制下第p位是1的\(a_i\)的个数。

转化了询问之后就需要进行数据结构维护了,区间对\(x\)取max是经典的$Segment\ Tree\ Beats $ 操作(赛前并不会)。学过之后,在这道题里,只需要维区间最小值,区间次小值,区间最小值的数量,区间异或和,区间每个二进制位上是1的数的个数即可,另外区间最小值被更改之后不需要打tag,只用比较一下区间最小值是否比儿子的要大,如果是,说明这个区间是被动过的,然后就传下去更改。

T3

还是慢了。还没来得及改。问题经过转化可以成为类似2-SAT的模型,zyz神仙并没有用这个。总而言之是图论!今天先咕了,明天吧。

posted @ 2021-06-17 23:56  explorerxx  阅读(31)  评论(0编辑  收藏  举报