23zr省选二轮

LOJ3273

题意:有若干个点,满足坐标 \(0\le x,y,x+y\le n\),要求支持操作:插入点,查询某个点现在的位置,用一条长度为 \(l\) 的线段(一端在原点)从 \(x\) 轴或者 \(y\) 轴开始向上/下推长度为 \(l\) 的距离。

\(n\le 10^9,m\le 5\times 10^5,q\le 10^6\)

考虑没有插入操作怎么做。

发现可以维护一个折线,并将折线上的点和不在折线上的点分开考虑,发现折线上的点 \(x,y\) 单调,而不在折线上的点坐标是初始值,于是插入一条线,只需要更新折线,并将被新线推到的点加进维护的点集即可。更新折线的话只需要将一段区间的 \(x\) 或者 \(y\) 赋值成新值即可,这个可以直接 ODT 之类的或者平衡树做。

这样就做完了无插入。

那么有插入怎么做呢?一个方法是按时间线段树分治,这个是比较套路的。

另一个想法是二进制分组。每个组维护 \(2^i\) 个点和组内的折线,每次插入一个点直接新建一个 \(2^0\) 的组,然后不停看有没有两个 \(2^i\) 合并成一个 \(2^{i+1}\),能合并就将这两组的点坐标全算出来,然后合并成新组,新组的初始折线是 \(x,y\) 轴。发现一个点最多被暴力算坐标 \(\log\) 次,每次插入折线只需对 \(\log\) 个组操作,复杂度 \(O(n \log^2 n)\)

World tour final 2019 C1/C2

题意:坐标系上整点有灯,初始只有 \((x,0)\) 亮灯,每次操作可以反转 \((x,y),(x,y+1),(x+1,y)\) 的状态,给出终止状态,求哪个灯初始亮着,保证有解且唯一。

终止状态亮着的灯不超过 \(10^5\) 个。坐标可能很大,但在 \(long long\) 范围。

加强版就是 \((x,y)\) 初始亮灯,但是 \(n\le 10^4\) 且时限更大。

C1怎么做?考虑这个操作是可逆的,你可以让初始和末状态走到一个共同的状态。

假设只有一个亮点 \((0,0)\),你要使得亮的点都在第 \(-i\) 行,那么通过构造计算,这一行点 \((j,-i)\)的状态就是 \(C(i,j) \bmod 2\),根据卢卡斯定理,当 \(j\subseteq i\) 时值才为 1,那么显然,因为初始亮点在 \(x\) 轴上,所以你取第 \(-(2^{63}-1)\) 这行的状态,显然是一个一堆 1 的上三角的底边,且最左边的一个 1 对应的横坐标就是初始状态的横坐标。

那么只需要二分出这个最左边的即可。二分值域范围就是 \([-10^{17},10^{17}]\)。二分一个 \(x\) 看他是不是 1 只需要用 \(n\) 个点在这个位置的对应值异或和判断。复杂度 \(O(n\log V)\)

Pjudge 21677 染色

题意:A 有一张图,并有一个合法八染色方案(有边相邻的点的颜色不同,一共只有8种颜色),B 有一张相同的图,并有 A 传过来的 \(2.5\times 10^5\) 个 bit 的信息,要求实现 A,B 的策略,使得 B 能够给出一个合法方案。

考虑对于度数小于 8 的点不需要信息,因为必然可以染,对于剩下的点传颜色 \(\bmod 4\),那么 B 只需要自己做一个 2 染色即可。

UOJ 704

题意:给定二分图,最小割计数。左右侧点都是 \(\le 46\)

考虑先求出一组任意的最大匹配,那么对于每组匹配 \((u,v)\),在三条边 \((S,u),(u,v),(v,T)\) 中一定取恰好一条割掉。

不妨设割哪条边用 \(a_{u/v} \subseteq \{0,1,2\}\) 来表示。

然后对于一条非匹配边 \((u,v)\),显然若 \(u,v\) 都在最大匹配中,那么要满足 \(a_u =0\) 或者 \(a_v=2\),否则这条边能被匹配,若只有 \(u\) 在匹配,满足 \(a_u=0\),若只有 \(v\) 在匹配中,满足 \(a_v=2\)

可以发现满足这些限制的割边方案必然全合法且是所有最小割。

然后,把 \(u,v\) 都在最大匹配中的情况,连一条 \((u,v)\),得到一个有向图。

然后发现对于一个环,环上所有点要么全选 \(0\) 要么全选 \(2\),于是可以缩点变成 DAG。

之后拓扑排序,然后按拓扑序折半。

先只考虑前一半,枚举选 \(0\) 的集合,需要满足不存在集合外的点到集合内有边。然后考虑剩余点的导出子图,显然只有入度是 0,且不是被缩起来的点可以选 1,剩余的必须全选 2。

这样的方案全是合法的,容易对这部分计数。

然后考虑前半对后半部分的影响,选 0 的没有钦定的影响,选 1 或者 2 的要求他的出边对应的后半部分中的点必然要选 2,就相当于钦定一部分点选 2。

于是可以预处理,枚举后半部分选 2 的集合,剩余中选 0/1 的方案数和前半部分处理类似,再做一个高位后缀和即可。

复杂度是 \(O(2^{\frac{n}{2}}\times n^2)\)

写成依托答辩的代码

UOJ328

设要求的答案是 \(t\)

考虑 2 操作的形式就是 FWT。

对于常见的异或/与/或卷积,不过是矩阵比较特殊的这样的变换。

于是考虑做异或卷积 FWT。发现直接这么做,异或卷积的矩阵的转置和自己的乘积不是单位矩阵,但发现是一个对角线上是 2 的矩阵。

于是把异或卷积的矩阵每个位置除掉一个 \(\sqrt{2}\) 即可。

然后发现,因为原序列只有 \(x,y\) 有值,根据 FWT 的性质,做完 FWT 的序列 \(a'\) 中,满足 \(a'_i \not = 0\)\(i\) 只有一种情况:\(popcount(i\operatorname{and} t)\bmod 2 = 0\)

那么有一种显然的想法是随机若干个(\(O(n)\) 个)线性无关的 \(i\) 满足如上性质,然后做高消即可。

但是发现这样做,矩阵的秩是 \(n-1\),就是能解出两个根。但是一个根是 0,而原题又保证了答案不是 0,所以另一个根就是答案。

实现上,你每次随一个之后,对目前仍然合法的答案集合挨个判断一下是否仍然满足 \(popcount(i\operatorname{and} t)\bmod 2 = 0\),直到答案集合不大于 2 为止。

可以发现,因为交互库的随机方式,这样做的期望调用次数是 \(n^2\) 级别的。

代码短的恐怖。

CF1750G

CF gym104172I

玩玩粥去。别惦记你那比做法了。

ucup8F

给定 \(n\) 个长度为 \(m\) 的字符串,已知恰好有一个字符串和其它所有字符串都恰有 \(K\) 个位置不等,你需要找到它是哪个,字符集大小为 4。
\(n, m \le 10^5, nm \le 2 × 10^7,K \le m\)

hash。考虑对于每一个串如何判断合不合法。利用类似 CSP2022T3 的做法,对于每一个字符串随一个权值,然后对于一个字符串判断其合不合法,只需看每一位和他不相同的权值之和是否恰为 \((n-1)\times K\) 即可。如果怕出错或者发现这次哈希答案不唯一可以多随几次取交集。

CF1545D

有一个 \(n\times m\) 的矩阵,\(n,m]le 1000\),每行是等差数列,现在打乱每一列,并修改一个数,找到修改的这个数在哪一列和其原值。

首先利用每列的和求出是哪一列被修改了,然后考虑第 \(i\) 列平方和 \(f_i\) 的性质:\(f_{i+1}+f_{i-1}-2\times f_i = \sum k_i\)

即连续三个列的平方和按这种关系是定值。

那么确定了这个定值,然后在确定寄掉的这一列中枚举修改,看什么时候合法即可。

难点在于想到平方和。这玩意真的不是人能联想的。

一个通信

题意:有一个长为 \(n\) 的序列,A 知道他,A 可以将序列任意排列然后传给 B 这个序列,你要对 A B 实现策略使得 B 能求出原序列(不用求出顺序,只要求出有哪些数)。

传递过程中会被删掉最多一个数。

A 不知道会被删掉哪一个数,B 只知道题面限制,不知道除了 A 传递的任何其他信息。

\(20\le n\le 100, 1\le a_i\le 500\)

A 按照所有数的异或和为种子对序列 shuffle。

则枚举异或和,B shuffle 到对应序列就找到异或和,就找到了删除值。

CF1438F

逆天题。需要发现根的两个儿子做为答案的出现次数占比很大(最少也有约 18%),而其他点出现次数远小于这俩点,可以先随机三个点,这么 query 420 次,则做为答案出现次数最多两个的即是所求儿子,最后 \(n-2\) 次询问求出根即可。

CF750F

魔怔分讨。摆了。

一个怪异数学题

博弈,每个人可以选一个数,然后将整个序列模这个数(需要保证模数不大于当前序列最大值),将序列变全零者输。

给定 \(n\) 个数的取值范围 \([l_i,r_i]\),求有多少种序列满足先手必胜。

\(n,v\le 200\)

大力讨论。

首先有奇数且序列不全为 1,显然先手赢了,只需要全员模二。

然后有 \(4k,4k+2\) 也赢了,可以直接模 4。

然后有 \(12k,12k+4,12k+8\) 不能同时存在两个,那么只需要状压 \(200/12\) 种值即可。

复杂度 \(O(n2^{200/12})\)

CF1007C

简单考虑询问会带来什么。考虑维护当前的可能位置集合,一次查询可能会切掉询问点左边或者下面,也可能切掉右上一部分,留下一个 L。

而如果每次取中心(如果是L形取左下小矩形中心),会得到 \(O(log^2)\) 次询问(最坏不断对于一个长减半)。

可以通过调整取左下小矩形的位置做到较优。

有一个简单的做法,是考虑始终维护矩形。那么可以同时倍增 \(x,y\) 两维。

如果在右边,就倍增去尝试增加 \(x\),如果在上面,就倍增尝试增加 \(y\),如果在 L 型中,那么说明有一维跳大了,将目前倍增的大小减小一半即可。复杂度均摊 \(O(log)\),但是常数大。

CF1526F

仍然是牛逼交互。

可以考虑通过若干次询问找到 \(n-1,n\) 或者 \(1,2\),然后剩余的数用一次查询确定值。

那么如何找到这样的数?考虑如果有一对值的差较小的点,那么和其的询问最远和次远的点就是 \((1,2)\)\((n-1,n)\)

显然这个差只需要不大于 \(\frac{n-4}{3}\),于是通过 420 次随机询问找到一个答案小于 \(\frac{n-4}{6}\) 的点对,将其三个点中任两个拿过来查询即可。

最后通过题目中的 \(p_1 < p_2\) 确定序列的值(即,确定点对是 \((1,2)\) 还是 \((n-1,n)\))即可。

ARC136E

给一个 \(n\) 个点的有向图,每个点有权值,存在边 \((i,j)\) 当且仅当 \(\gcd(i,j)>1\),求最长反链。

以奇偶讨论连通性。

\(f(i)\) 表示 \(i\) 的最小质因子。

那么 \(i\) 可达 \(j\)

\(i,j\) 均为奇:\(i+f(i)\le j - p(j)\)

\(i,j\) 均为偶:显然可达

\(i,j\) 前者奇后者偶:\(i+f(i)\le j\)

\(i,j\) 前者偶后者奇:\(i\le j - p(j)\)

那么显然反链中只能选一个偶数。

枚举这个偶数 \(pos\)

这时可以选偶数右边所有 \(i-f(i)<pos\) 和左边所有 \(i+f(i)>pos\) 的。因为这些显然两两不可达(集合内部和集合之间可以分开看),而再选其他的会可达 \(pos\)

然后不选偶数,仍然枚举选 \(pos\) 这个奇数,然后用一样的方法确定剩下的点。

CF1720E

首先,如果现在的颜色数少于目标数,答案是 \(k-cnt\)

如果相等,无需操作。

剩余只可能是 1 或 2 次。

为什么不超过 2?

显然,你第一次选第一个正方形,将左上角放在 \((1,1)\),然后扩展到再加边长就 \(cnt < k\)

然后第二个正方形右下角放在 \((L+1,L+1)\),颜色和第一个正方形相同,那么每次扩展这个正方形的边长显然会影响到两个格子,也就是颜色数最多同时减二。

所以做完之后可能 \(cnt=k\) 或者 \(cnt=k-1\)。第一种情况,就让染的色是剩下的颜色之一,否则就新开一种颜色。

于是只需检查答案是否为 1。

考虑枚举左上角和边长,计算正方形能覆盖的颜色数。

对于一种颜色,考虑其最左右上下的点,显然正方形需要覆盖左上,右下这两个点才行,这个可以通过二位前缀和状物解决。

CF1572D

发现要求的匹配数很少,一条边选了最多使得 \(2n\) 条边寄,所以只需拿出边权最大的 \(2nk\) 条边和其端点用费用流跑二分图最大带权匹配即可。

CF1062F

拓扑排序题。

考虑拓扑排序有一个性质:同时在队列里出现过的点对不可能互达。

posted @ 2023-03-16 09:09  infinities  阅读(126)  评论(0编辑  收藏  举报