AGC刷题记
已经刷不了几天了。。。
AGC001
A-BBQ Easy
排个序就过了
B-Mysterious Light
手膜一下,你会发现魔改一下\(gcd\)就行了
C-Shorten Diameter
刚开始猜了个乱搞,但觉得是假的没敢写,最后看了题解才知道真的是那样?
先说做法,就是如果\(k\)为偶数,就枚举每一个点作为根,然后把深度大于\(\frac{k}{2}\)的都删掉;奇数的情况基本同理,就是枚举相邻的两个点,然后在两边分别删就行了
正确性感觉上是对的
D-Arrays and Palindrome
看错题了,把最后一个条件理解为\(a\)和\(b\)的\(n\)个字母两两对应相等了。。。
考虑建一张图,两点之间有连边代表这两个位置的字母相同,那么合法的图必须是联通的。
然后随便画几个情况,按照各路神仙的说法,你会发现奇数特别没前途。事实上,只要有超过两个奇数就得输出不可能,证明如下:
设\(x\)为奇数的个数,那么把\(a\)中的边连完后会形成\(\frac{n-x}{2}+x\)个联通块,最少需要\(\frac{n-x}{2}+x\)边才能把他们联通,而\(b\)中最多可以提供\(\frac{n}{2}\)条边,由此我们可以推出,如果边数足够,有:
解得
证毕
最后我们需要把\(b\)构造出来,考虑把奇数放到\(a\)的头尾,然后大力讨论一下怎么连边就行了
注意不能输出\(0\)
E-BBQ Hard
考虑那个二项式系数的组合意义:每次只能向上或向右走一格,从\((-A_i,-B_i)\)走到\((A_j,B_j)\)的方案数。然后就是个普及组\(dp\)了
最后统计时要减去自己到自己的贡献然后除以\(2\)
P.S.这个转化似乎挺常用的
F-Wide Swap
第一步的转化没有想到怎么办啊
考虑搞一个序列\(q\),\(q[p[i]]=i\),那么问题等价于使\(q\)的字典序最小,每次操作可以交换\(q\)中相邻的且差值大于等于\(k\)的两个元素
发现无论怎么交换,差值小于\(k\)的两个元素的先后顺序是不会变的,而且先后关系正确的序列一定合法。这样提示我们建个图并在其中连有向边代表先后关系,然后就变成一个拓扑排序的题了
但是这样建图的复杂度是\(O(nk)\)的,显然有一些边是冗余的,我们可以拿线段树优化一下,这样边的数量就变成\(O(n)\)级别的了
最后只要用小根堆搞一个字典序最小的拓扑序就行了
代码不长。。。
P.S.对于排列,建立权值到位置的双射似乎挺常用的
AGC002
A-Range Product
不用说了
B-Box and Ball
模拟就可以了
C-Knot Puzzle
倒着考虑,就变成一个很简单的模型了
D-Stamp Rally
注意看题,是从两个点分别出发,不是从\(x\)到\(y\)
问题等价于最早在什么时候两个点所在联通块并集的大小大于等于\(z\)
首先想到二分答案:每次二分一条边,然后暴力重构并查集。但是这样的复杂度是\(O(qmlog\ m)\),显然不行,考虑整体二分
但是整体二分时会有一个问题,就是重构并查集的代价太大了,同时发现如果把整体二分改成\(BFS\)就可以只重构\(log\ m\)次了,这样总复杂度为\(O((m+q)log\ mlog\ n)\),可以\(AC\)此题
E-Candy Piles
好神奇的转化
考虑把每一堆看成一个宽\(1\)长\(a_i\)的矩形,并把它们左对齐、从长到短、自底向上垒成一摞。
随便画几个简单的例子,发现问题可以转化为从左下角出发,每次可以向上移或向右移一格,移出边界者输
然后我们找找规律,为了方便,令\(0\)为先手必败,\(1\)为先手必胜
1010
010110
101101
0110110
......
发现第\(i\)行是由第\(i-1\)行左移\(1\)位并加上\(a[i]-a[i-1]+1\)个数构成的
于是我们可以排个序并从前到后扫一遍并维护一下上一行最后一个位置的值是什么,直到哪一行的某一个位置左移若干次后正好为最后一行的第一位,输出这个位置的值就行了
代码抄的题解的\(QwQ\)
F-Leftmost Ball
据题解说,有一个显然的规律:对于一个合法的序列,任何一个前缀中白球的数量大于等于其他颜色的球的种类数
然后我们来设计一个\(O(n^2)\)的\(dp\)。设\(f[i][j]\)表示已经放了\(i\)个白球和\(j\)种颜色的方案数,转移时考虑从左往右第一个空位放什么,可以得到如下的转移方程:
边界\(f[i][0]=1\),同时\(k=1\)时也要直接输出\(1\)
至于为什么要考虑空位放什么,有两个原因
1.可以保证序列是合法的
2.可以不算重
AGC003
A-
这个不用说了吧
B-
简单的贪心
C-
相当于是有两种操作,要么交换相邻的两个,要么交换隔着的两个,操作一最少要用多少次
发现操作二可以任意交换奇数位置上的值或偶数位置上的值,而操作一可以交换奇数和偶数位置,所以我们统计一下应该在奇数位置上的值缺了几个就可以了
D-Anticube
好神仙的数学题
E-Sequential operations on Sequence
思维题肝不动啊
经观察会发现若操作\(q_i\geqslant q_{i+1}\),那么\(q_i\)就没用了,所以我们可以维护一个单调栈把那些有用的操作保留
然后看一下操作之间有什么关系。因为现在的\(q_i\)严格递增,所以\(q_{i+1}\)由\(q_i\)重复若干次并加上\(q_i\)的一个前缀构成。重复若干次的话我们可以把\(q_i\)乘上一个系数,最主要的就是处理那个前缀
递归地考虑,其实前缀也是由之前的某个操作\(q_j\)重复若干次并加上它的前缀构成的。所以我们可以二分出来\(q_j\)在哪,把\(q_j\)也乘上一个系数,然后把新的前缀递归下去
可以证明复杂度为\(O(nlog^2\ n)\)
F-Fraction of Fractal
不敢做了。。。