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>前面的数总数 即可,用前缀和转移

posted @ 2022-09-17 13:05  gmh77  阅读(173)  评论(0编辑  收藏  举报