Codeforces Round #691 (Div. 2) 题解

  • A

不多说了吧,直接扫一遍求出 (r_i>b_i) 的个数和 (r_i<b_i) 的个数

  • B

稍微打个表找个规律就可以发现,当 (n) 为奇数的时候,答案为 (dfrac{(n+1)(n+3)}{2}),当 (n) 为偶数的时候,答案为 ((dfrac{n}{2}+1)^2)

  • C

考虑 (operatorname{gcd}) 的另一种计算方式,(operatorname{gcd}(a_1,a_2,dots,a_n)=operatorname{gcd}(a_1,a_2-a_1,a_3-a_2,dots,a_n-a_{n-1})),那么就有 (operatorname{gcd}(a_1+x,a_2+x,dots,a_n+x)=operatorname{gcd}(a_1+x,a_2-a_1,a_3-a_2,dots,a_n-a_{n-1})),预处理出 (G=operatorname{gcd}(a_2-a_1,a_3-a_2,dots,a_n-a_{n-1})),然后对于每组询问,输出 (operatorname{gcd}(G,a_1+b_j)) 即可。

  • D

首先要明确的一点是,我们不会出现回倒的情况,就是从杯子 (x) 倒到一个杯子 (y),再倒到一个杯子 (z),因为这样还不如 (x) 直接倒到 (z)(y) 直接倒到 (z)
于是本题变为选择 (k) 个杯子 (i_1,i_2,dots,i_k),将所有其它杯子里的水倒到这 (k) 个杯子里,这样总共能容纳 (min(a_{i_1}+a_{i_2}+dots+a_{i_k},b_{i_1}+b_{i_2}+dots+b_{i_k}+sumlimits_{i ext{没被选择}}frac{b_i}{2})) 的水。
然后就可以 (dp) 了,(dp_{i,j,k}) 表示在前 (i) 个杯子里选择了 (j) 个杯子,这 (j) 个杯子的 (a_i) 的和为 (k),最多能容纳多少水。时空复杂度均 (n^4)

  • E

现场被这题区分了/kk
首先要明确的一点是 LRUD 和 IC 肯定不是同一类的。如果 (s) 中只包含 LRUD,那此题就变得异常简单。直接维护两个标记 (x,y) 表示行/列分别位移了多少就可以了。
重头戏在于 I 和 C。首先我们要理解 I 和 C 的本质。
对于排列 (p_1,p_2,dots,p_n),我们如果把每个元素看作一个二维坐标 ((i,p_i)),那么这个排列的逆元相当于 ((p_i,i)),即交换两维坐标的值。
I 和 C 也是如此。如果我们把这个矩阵看作 (n^2) 个三维空间里的点 ((i,j,a_{i,j})),那么 I 操作其实就是交换 x,z 坐标的值,C 操作其实是交换 y,z 的值。
这样一来这题就很好做了,对于 LRUD,记录每一维的增量,对于 IC,记录当前每一维是原来的第几维,这样每个操作都可以 (mathcal O(1)) 解决了。
看到没?什么超纲的算法都没有。所以啊,菜是原罪/kk

  • F

现场试图看这道题结果什么思路都没有。
考虑记 (0)(-1)(1)(+1),这样可以得到一个长度为 (|s|) 的由 (+1)(-1) 组成的序列。
然后对这个序列做一遍前缀和,并连一条 (s_i o s_{i+1}) 的有向边,这样可以得到一张图,一个欧拉回路就对应着一个字符串。
考虑题目中那个奇怪的操作的本质。假设我们对区间 ([l,r]) 进行操作。既然 ([l,r]) 要求 01 个数相等,那么肯定有 (s_{l-1}=s_r),而翻转+反转实际上等于将这些边反向。所以实际上该操作等价于选择一个环然后将环上所有边反向。
这里需要观察出一个性质:就是操作前后,原图所包含的边集 (E) 是不变的。因为每次操作是将边反向,所以如果把有向边改为无向边,那么边集显然是不变的。又由于我们操作的是一个环,所以对于一条边 ((x,y))(x o y)(y o x) 的次数是一样的,所以 (x o y)(y o x) 在操作前后出现次数都是相同的。
有了这个性质,我们还需观察出另一个性质:原图任意一条欧拉回路(起点和终点必须与初始相同)代表的都可以由原字符串进行一系列操作得到:首先我们假设原路径与当前路径在 (x) 位置出现了分歧,一个走了 (x o x+1) 的边,一个走了 (x o x-1) 的边。而这两个路径终究还是要走 (x o x-1)(x o x+1) 的边的,所以肯定有一条边 (x+1 o x),也有一条边 (x-1 o x),此时我们选择 (x o x-1 o x o x+1 o x),并将其翻转,看看会发生什么。此时我们惊奇地发现,原来先走 (x o x-1) 的路径改走 (x o x+1) 了!以此类推,最后两个路径一定会重合。
于是此题就变为:求字典序最小的欧拉序。直接贪心就可以了。
看到没?什么超纲的算法都没有。所以啊,菜是原罪/kk

看到没?什么超纲的算法都没有。所以啊,菜是原罪/kk

原文地址:https://www.cnblogs.com/ET2006/p/Codeforces-1459.html