arc瞎做1 arc131D arc131E arc146C arc146D arc139C arc140D arc140E arc127C arc127D arc127E
一堆的数学和构造题
arc131D - AtArcher
由于区间是对称且向两边递减的,所以有结论:
按x=0分开,两边的点的个数差<=1(如果不是则把多的那边的最后一个移到少的那边,一定更优)
所以可得[0,D-1]中一定有一个,且两边分别是floor(n/2)和ceil(n/2)个
进一步手玩得到[kD,(k+1)D-1]中都有恰好一个,k∈[-floor(n/2),floor(((n-1)/2)]
所以把这些区间都移到[0,D-1]中合并就可以了
具体实现可以双指针维护[kD,(k+1)D-1]中和序列中有交的区间,然后暴力计数,前缀和打到[0,D-1]上
这样一次是O(断点+1),但是k不同区间[kD,(k+1)D-1]无交,所以一个断点只会被算一次,可以保证复杂度
注意要用__int128
arc131E - Christmas Wreath
显然必要条件是n%3≠2,并且可以发现当n<=4时无解
所以猜想充要条件是n%3≠2且n>4
考虑构造,把(1~i,i+1)这些边分成一组,同一组染相同颜色
这样是不会冲突的,因为对于一个三角形来说,假设i从大到小染,一定是先选一个点染两条边,再染剩下一条边,所以不会出现异色三角形
现在问题变成如何分组使得每组的和(边数)相等
n=6:1,4/2,3/5
n=7:1,6/2,5/3,4
n=9:1,3,8/2,4,6/5,7
n=10:1,3,4,7/2,5,8/6,9
(应该有很多种方法)
对于n>10的,就先把[n-6,n-1]首尾分,然后变成n-6的子问题
arc146C - Even XOR
先考虑如何判断集合不合法
丢到线性基里,如果有两个数丢进去会被消成0,则这两个数加上消掉其的区间可以得到两个不同的xor=0集合
若有一个大小为偶数则寄,否则如果都是奇数则互相异或也可以得到大小偶数的xor=0集合,也是寄
所以结论:集合大小<=n+1
设f[i]表示选了i个元素的方案,先假设有序,最后除i!便可得到无序(显然加的顺序不影响正确性)
那么i->i+1时,考虑有多少个新加的x是合法的,即包含x的偶数集全部xor≠0
换言之,对于f[i]中所有的奇数集,x≠其异或和
同时两个不同的奇数集的异或和一定不同,否则相异或得到异或和=0的偶数集,寄
所以不合法方案等于在i中选择奇数集的方案,就是杨辉三角一层的奇数位置,即2^(i-1)
去掉这些就可以选x,从而得到f[i+1]了,最后f[i]/i!求和即可
arc146D - >=<
这种看起来不好办的构造题可以考虑数学/图论转换
建n*(m+1)个点,表示Ai是否小于j,然后跑差分约束(差分约束求得应该是合法的最大解,所以要01反过来建图,这样就是最小解)
对于限制p,x,q,y,连(p,x)=(q,y),(p,x+1)=(q,y+1)即可
(p,x)=(q,y)意味着Ap<x,Aq<y或者Ap>=x,Aq>=y,同理(p,x+1)=(q,y+1)意味着Ap<=x,Aq<=y或者Ap>x,Aq>y,分段讨论发现就是题目的条件
然后再连0<=...<=(p,x)<=(p,x+1)<=...<=1,0和1就是初始点x的x和x+1
由于有m+1这个点,最后一定可以跑出解,只用判断是否Ai<=m即可知道解是否合法
注意n(m+1)很大,不能直接建图,所以把上面涉及到的关键点拉出来建图即可
arc139C - One Three Nine
设n<=m,猜想ans=3n+m-3(即理论值)
计算机辅助证明发现有小问题,当n=m=偶数时ans=3n+m-4
同时计算机辅助求解可以得到构造方法:
设k为最大的2k+1<=n,则对于i属于[1,k]:
连([2i-1,2i+1],[2i-1,2i+1]),即对上下两排[2i-1,2i+1]连满
然后对于剩下的部分,若2k+1<n则连(2k+1,[2k+1,min(2k+3,m)])
然后再连剩下的(n,[2k+1,m])
举个栗子:
n=4,m=4:
首先1~3上下排连满,然后连3-4,4-3,4-4(理论值-1)
n=4,m=6:
首先1~3上下排连满,然后连3-4,3-5,4-3,4-4,4-5,4-6(理论值)
n=3,m=5:
首先1~3上下排连满,然后连3-4,3-5(理论值)
arc140D - One to One
把无向图变为有向图,发现 无向图连通块数=有向图环数
先处理已经有环的块,然后设f[i,j]表示到i块选了j块连的答案,ans=Π选了的sz*n^(未选的能连出去的块)*(选了的总数)!
随便dp一下
arc140E - Not Equal Rectangle
首先发现√n≈25,启发用分块来做,再加上数学构造
由于要用取模,所以用质数23来分块,23^2>n可以搞
然后见https://www.cnblogs.com/PYWBKTDA/p/16277379.html
证一下i1 div p=i2 div p (%P)
由于p^2>n,i<=n,故i div p<=n div p<p,即i div p<p
所以如果有i1 div p+p<=i2 div p<0,则i2 div p<p,得i1 div p<0,矛盾
arc127C - Binary Strings
在trie上二分,按字典序的话就是中左右(先序遍历),记sum为X的值
中(减1)的话就是sum=1,即1的个数=1加上X[0]=1
右(减2^k)的话就是X[k]=1->0
左的话就是直接-1,可以暴力减因为0->1的次数不会很多(总数是O(n)级别的)
arc127D - Sum of Min of Xor
和之前cf的某题很像
设A=Ai xor Aj,B=Bi xor Bj,把min(A,B)拆成 AB相同的前缀 和 较小的后缀
当前缀A=B时,有Ai xor Aj=Bi xor BJ,即Ai xor Bi=Aj xor Bj
在i处用Ai xor Bi建trie,同时每一位都记录一下如果AB下一位不同,且Ai,Bi是0/1,0/1的后面Ai/Bi每一位的0/1个数(即假设min是A或B胜出,然后对后面的每一位拆位处理,记Ai,Bi是0/1,0/1方便判断是A胜出还是B胜出)
在j处也是先按B来按位找,然后假设下一位A<B或者A>B,求出Ai,Bi的对应位,然后统计后面的位
再考虑上A=B的那一段,也是拆位处理求A=B=1的情况,每一位记当前位Ai,Bi是0/1,0/1的个数,两部分加起来就可以了
总时间是O(nlog^2)
arc127E - Priority Queue
好题
假设已知那些数会被留下来,则考虑构造一种唯一(不会算重)且最优的方法来操作
设留下的数集合为A,删掉的数集合为B
结论1:A集合中的数是从小到大加的
显然,如果加了一个大的然后超过了一个未加的B/加了但为删的B,那么这个B就永远删不掉了
结论2:B集合中的数也是从小到大加的
由结论1的分析发现,B不加和加了不删是等价的(只与删或不删有关),所以加大的不如加小的,这样小的可以更早被删掉,从而给A留出空间
然后考虑确定原序列中什么时候放A,什么时候放B
结论3:把原序列的下标按照题目所给来模拟,最后保留在栈里的就是A,弹出的就是B
证明不会,瞎猜的
口胡一下,把原序列写成+1-1,找到所有后缀最小值(即写成折线之后往左画射线,把射线上面的删掉后剩下的部分)
那么这些段是独立的,每一段都可以记为加a个A,加b个B,然后一共删b次
按照结论3的说法,等于先把前a个A加进去,然后再加B
(由于后缀min的原因,最小的B一定是最后删掉)
反证,如果前a个加了B的话,则这个最小的B一定不会更早删(后面加的B数量不变/变多),所以最小的B还是会最后删,并且和最大的A作比较
现在求出了每个位置加入的数属于A还是B,原序列变为+A,+B,-B三种操作
由于确定了AB序列就可以唯一确定加入方案,所以只需要dpAB序列然后判断
设f[i,j]表示当前处理到操作序列的位置i,最后一个B是数j,设B类数i(位置)被删掉的时间是id[i],则只需要考虑极大不被包含的(i,id[i])
那么前面数的总数就是 id[i]之前的A+i之前的B,保证放在i位置的数k>前面的数总数 即可,用前缀和转移