CF2096 题解
CF2096C Wonderful City
给你一个 \(n\times n\) 的矩阵 \(h\),你可以花费 \(a_i\) 的代价将第 \(i\) 行的所有数字增加 \(1\),或者花费 \(b_j\) 的代价将第 \(j\) 列的所有数字增加 \(1\),使得最后矩阵中不存在两个四联通相邻的数字相等。一行或一列最多操作一次。问最小代价。
\(n\le 1000\)
我开始想错了,越转化问题越强,然后根本做不了。
设 \(x_i\) 表示第 \(i\) 行是否操作,\(y_i\) 同理,取值 \(\{0,1\}\)。每相邻两个数都会给它们所在的相邻两行/两列提供 0~1 个限制,形如 \(x_i\ne x_{i+1}\) 或者 \(x_i\le x_{i+1}\),\(x_i\ge x_{i+1}\) 等。不难发现行和列是独立的。
然后分别对行和列进行 dp 即可。时间复杂度 \(O(nm)\),瓶颈在于找到限制。
CF2096D Wonderful Lightbulbs
在平面直角坐标系的每一个整点上都有一个灯泡。初始时,有且仅有一个灯泡是点亮的。每次操作,你选择一个位置 \((x,y)\),然后将 \((x,y),(x,y+1),(x+1,y),(x+1,y-1)\) flip
。
给定最终局面(\(n\) 个点亮的点),问哪个灯泡是初始点亮的。保证有解。
\(n\le 2\times 10^5\),给定的点的坐标的绝对值 \(\le 10^8\)
首先题目给定的形状非常不规则。但是发现可以通过对坐标系的变换 \((x,y)\to (x,x+y)\) 使得其变为 \(2\times 2\) 的正方形。
由于值域很大,不难构造出一种操作次数 \(10^{13}\) 量级的最终局面,因此不能尝试构造方案。虽然但是,操作可以简化为对任意一个 \(2\times 2\) 的子矩阵(任选两行两列相交得到的 \(4\) 个点)进行操作,也不知道后面能不能做。
考察每次操作哪些量是不变的。注意到每行点数的奇偶性和每列点数的奇偶性不会改变。因此找出和为奇数的行以及和为奇数的列即可。
CF2096E Wonderful Teddy Bears
给定一个长为 \(n\) 的 01 串 \(s\)。每次你可以选择 \(s\) 一个长为 \(3\) 的连续子段,然后将其排序。问将整个串排好序的最少操作次数。
\(n\le 2\times 10^5\)
操作分为 \(4\) 种:
可以用逆序对来衡量数组的排序程度。注意到 \(1,2\) 可以减少两个逆序对,而 \(3,4\) 只能减少一个。我们希望最大化 \(1,2\) 操作的次数。
注意到 \(1,2\) 操作本质是交换了间隔一个数的两个数字,而 \(3,4\) 操作是交换了相邻两个数字。考察操作本质上改变了什么、没改变什么。由于 \(1,2\) 操作总是在对奇偶性相同的两个格子进行操作,因此不会改变奇(偶)格子内 \(1\) 或 \(0\) 的数量。相反,\(3,4\) 操作一定会改变。
由于我们知道最终局面,因此也知道最终的时候奇数下标有多少个 \(0\)。由此我们能够算出 \(3,4\) 操作最少执行多少次,剩下的逆序对都靠 \(1,2\) 处理即可。
CF2096F Wonderful Impostors
有一个长为 \(n\) 的 01
串 \(s\) 和 \(m\) 条命题,每条命题形如“区间 \([l,r]\) 全都是 \(0\)”或“区间 \([l,r]\) 存在一个 \(1\)”。
有 \(q\) 次询问,每次询问给定一个区间 \([l,r]\),问编号在 \([l,r]\) 的命题是否能同时满足。
\(n,m,q\le 2\times 10^5\)
只有一次询问的判定问题是好做的。将所有第一种命题在线段树上 -1
,所有第二种命题就在线段树上查一下最大值即可。为了方便叙述,称第一种命题为操作一,第二种命题为操作二。
考虑一些处理区间询问的算法。题目询问的信息显然不好用线段树维护。考虑莫队,发现也不太好维护。注意到询问的区间具有单调性,可以预处理出每个右端点对应的最长区间。考虑双指针,它相比莫队可以保证只在合法时操作。
- 新增一个操作二:直接在线段树上查一下即可;
- 新增一个操作一:先找到当前操作所在的极长负数连续段,然后看看有没有操作二被包含在内;
如果不合法就 l++
,直到合法之后再 r++
。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
|