[AGC030E] Less than 3
对于每个串,用一些板将同色连续段隔开,若该板左 0 右 1 就染成红色,否则染成蓝色,同时,将串左右两边加上无数块颜色相间的板。那么一个操作就相当于将一块板向左或向右移动一格。于是就相当于将两串的同色板两两匹配,此时的操作次数的下界就是每对匹配的距离差之和。由于题目保证的性质,该下界可以取到。于是可以枚举匹配方案,发现只有 \(O(n)\) 种有意义,对于每种 \(O(n)\) 计算即可。
https://atcoder.jp/contests/agc030/submissions/27748772
[AGC006E] Rotate 3x3
注意到每一列的三个数在过程中只可能反转,于是可以把每一列看作一个数,用正负号表示它是否被反转。那么每次操作就相当于选三个相邻的列,交换最左和最右列且同时取反这三列。可以先对奇偶位置的列分别排序,然后考虑调整正负性。手玩一下,发现当 \(n\geq 5\) 时可以仅同时反转间隔一列的两列的正负性,进而可以仅同时反转奇偶相同的两列的正负性。那么只用判断奇偶位置的负数个数是否均为偶数,由于排序的时交换次数的奇偶性固定,所以可以顺便计算对负数个数奇偶性的改变。
https://atcoder.jp/contests/agc006/submissions/27749495
[ARC081D] Flip and Rectangles
观察到一个矩形能变成全黑当且仅当它的所有 \(2\times2\) 子矩形的黑格数为偶,证明显然。于是可以对于每个合法的 \(2\times2\) 的矩形中间放个棋子,用单调栈求内含格点都有棋子的最大矩形即可。
[CERC2018] The Bridge on the River Kawaii
由于边权很小,可以直接对所有 \(x\) 维护 \(\leq x\) 的边的并查集,加边删边可以线段树分治掉就做完了。
[NWRRC2017] Grand Test
找一棵生成树,有解当且仅当存在两条非树边代表的树上路径有边交,证明显然,构造显然。
[AGC039E] Pairing Points
设 \(f_{l,r,i}\) 表示只考虑 \([l,r]\) 的点,其中 \(i\) 已向区间外的某点连边,剩下的点两两连边的方案数。考虑转移,首先一定存在跨过 \(i\) 的边且它们互不相交,枚举其中最外层的边为 \((x,y)\),枚举最终树上 \((x,y)\) 与 \(i\) 连出去的边的交点往 \(x\) 方向的子树包含的叶子区间为 \([l,p]\),\(y\) 方向的为 \([q,r]\),那么可以从 \(f_{p+1,q-1,i}*f_{l,p,x}*f_{q,r,y}\) 转移。边界条件为 \(f_{i,i,i}=1\),求答案时枚举点 \(2n\) 的连边,为 \(\sum_{1\leq i<2n} A_{i,2n}f_{1,2n-1,i}\)。时间复杂度 \(O(n^7)\),但有 \(1/7!\) 的常数,可过,也可以进一步通过前缀和优化到 \(O(n^5)\)。
https://atcoder.jp/contests/agc039/submissions/27764853
[NEERC2017] The Final Level
先考虑把 L 型块当成成 \(n\times n\) 的块,然后贪心地铺到 \((a,b)\),这一定是答案的下界。然后再调一调最后一块的位置能取到了。
[DwangoPC 6th] Span Covering
考虑对于板从大到小 dp,记录当前覆盖的长度以及连通块数。新加入一块板时,由于前面的板都不短于它,所以只可能被一个连通块包含/连接两个连通块/接在一个连通块的两端/单独成为新的连通块。对于中间的两种转移,可以 \(O(L_i)\) 枚举被覆盖的长度。发现枚举到 \(i\) 时,段数至多为 \(O(X/L_i)\),于是时间复杂度为 \(O(nX^2)\)。
https://atcoder.jp/contests/dwacon6th-prelims/submissions/27773641
[UTPC2012] じょうしょうツリー
将 \(c_i\gets c_i+dep_i\) 就把限制变为 \(\geq\),然后就是保序回归板子,其中最小权闭合子图可以用树形 dp 做。
https://atcoder.jp/contests/utpc2012/submissions/27773612
[UTPC2012] 最短路クエリ
对行分治,每次求出中间列到当前区间所有点的最短路并以此回答跨过中间列的询问。但注意实际的最短路可能经过区间外,于是递归下去的时候顺便传入边界列两两点间在全图的最短路即可。
[CF1267G] Game Relics
由于最优策略一定是先抽后买,那么可以将买操作改为从未获得的卡中随机购买一张。于是对于已有 \(k\) 张总和为 \(s\) 的卡的状态,期望花费 \(\min\{({n\over n-k}+1){x\over 2},{\sum c_i-s\over n-k}\}\) 个碎片获得一张新卡(前者为抽,后者为买)。那么背包出到达每一种 \((k,s)\) 状态的概率即可。
https://codeforces.com/contest/1267/submission/138508486
[CF850D] Tournament Construction
根据兰道定理,一个不降序列 \(\{u_i\}_{i=1}^n\) 为一张竞赛图的出度序列当且仅当 \(\forall 1\leq k\leq n,\sum_{i=1}^k u_k\geq{k\choose 2}\) 且在 \(k=n\) 时取等。必要性显然,充分性可以考虑构造:先构造出一张 \(i\) 向 \(j\) 连边当且仅当 \(i>j\) 的竞赛图,它的出度序列为 \(\{v_i=i-1\}_{i=1}^n\),且满足 \(\forall k,\sum_{i=1}^kv_i\leq \sum_{i=1}^k u_i\) 并在 \(k=n\) 处取等。在此条件下,若 \(u\neq v\) 则一定能找到 \(i<j\land v_i<u_i\land v_j>u_j\),此时 \(v_i+2\leq v_j\),也就是说一定存在点 \(k\) 使得边 \((k,i),(j,k)\) 存在,取反这两条边可使 \(v_i\gets v_i+1,v_j\gets v_j-1\),而条件依然满足。如此一直递归下去即可使 \(v=u\),构造完成。
对于本题,可以背包出一个点数最小的合法出度序列,就能按照上述方法构造方案了。
https://codeforces.com/contest/850/submission/138514917
[ARC076D] Exhausted?
这显然是个二分图最大匹配问题,考虑转化成最小点覆盖。发现最优方案中一定覆盖了椅子的一段前缀和一段后缀,于是可以顺序枚举前缀长度并用线段数维护此时每个后缀的代价。