AGC030

发布时间 2023-04-25 16:31:30作者: DCH233

感觉之前那样所有比赛都写在一个页面里没有一点趣味性。于是之后每做一套都写一篇。

之前做到 10 就没做了,现在直接从 30 开始做。

A

直接算,简单。

B

有一个一眼想到的贪心:直接顺时针逆时针做。但是很显然是错了。但是猜一个结论:只有最开始会固定一个方向地走。写了一发然后就对了。

这个感觉就很对。事实上后面的贡献可以经典地转化成从 \(0\) 走出去再走回来,很明显中间有一个顺时针逆时针的分界线,这样的话就只在最开始固定方向就相当于把分界线枚举完了,所以就是对的。

C

想了很久,还是不会,通过题解才学会。

首先观察第一个样例可以得到 \(k \le 500\) 直接每行填一个数就行了,那么只需考虑 \(k\) 较大怎么做。

这题第一眼应该比较容易让人想到每个颜色只放一个这种骚操作,但是想一会后会发现这个好像做不了,因为一个格子只与 \(4\) 个格子相邻。

观察 \(k \le 1000 = 500 \times 2\) 的性质,不难发现肯定是折半之类的搞笑构造。然后就胡了个可以做 \(k\) 为偶数的做法,就是每一行相邻放不同颜色。还想扩展但是做不下去了。

正解让人眼前一亮,一个可能的思路是观察为什么上面的做法不能做 \(k\) 为奇数,就是因为同一行的数会互相影响,考虑把它斜过来,然后就对了。

D

这题比 C 简单。

一开始的想法是钦定一个操作的顺序,但是发现好像操作杂糅到一起没办法不重不漏算贡献,感觉比较棘手。

换一个方向。直接对每一对位置计算答案,这个一看就很有前途。设 \(f_{x,y}\) 表示 \((x, y)\) 这对位置中 \(x > y\) 的方案数。很显然一个操作只会影响 \(O(n)\)\(f\)。那么直接修改就行了。

写出来发现前两个样例答案都是正确答案的一半。仔细思考了一下后发现似乎操作之后剩下的部分都会加倍。一个很朴素的想法就是记录一共加倍了多少次,相当于全局加和 \(O(n)\) 个减一,所以直接把减一变成除以二就可以了。

看了下题解,这玩意其实就是期望了,不过我一直不会把计数转化成期望的 trick,以后就当做一个全新的思考方向吧。

E

这题好难想,很反套路。

做题的时候思路是考虑差分,性质还是有一点滴,但是不多。因为操作过程中始终需要满足限制,所以无从下手。

只考虑 \(0\)\(1\) 之间的分界线,发现操作实质上就是移动分界线的过程,限制很好刻画,最终使得分界线一一对应即可。发现只有 \(O(n)\) 种对应方案且一种方案的代价就是对应分界线的距离之和。所以直接算就是 \(O(n^2)\) 了。

F

不做了,挖个坑以后补。