VPor做题记录4
The 1st Universal Cup. Stage 20: India
-
C题
你有 \(n\) 个区间,你需要选择一些区间,选择的区间不能相交。
你还有 \(m\) 个要求,每个要求形如:
- 第 \(a\) 个区间和第 \(b\) 个区间必须要选一个。
回答是否有可以满足上面要求的区间的选法。
数据范围:\(n,m\le 10^5\) 。
首先可以暴力
2-sat,现在考虑优化这个过程。可以考虑线段树优化建图,但建图方法需要学习一下:
-
对于两个区间,相交 等价于 一个区间的左端点在另一个区间内(换成右端点也是可以的)
-
我们按 \(l_i\) 从小到大排序,然后把 \(l_j\) 在 \([l_i,r_i]\) 之间的 \(j\) 和 \(i\) 加上双向的
2-sat互斥边。具体来说,在线段树 \(T_1\) 中的区间 \([l,r]\) 含义就是若 \(l\sim r\) 中的任意一个变量为真,线段树 \(T_2\) 表示的就是 \(l\sim r\) 的变量都得为假。
-
D题
给定 \(n\) 个字符串 \(S_i\),你有一个字符串 \(A\) ,初始为空。你有两个操作:
- 在 \(A\) 后面插入字符串 \(S_i\) 。
- 删掉 \(A\) 最后 \(k\) 个字符。
求出你需要让它变成字符串 \(B\) 的最小操作数。
多测,数据范围:\(N\le 10^6,k\le 5000,\sum |S_i|\le 10^6,\sum |T|=5000\) 。
每次肯定是加入一个串的前缀,那么我们就可以把 \(S_i\) 建成一个trie树,然后计算删去 \(t\) 的长度最小要多少的代价,这就是一个同余最短路。
由于 \(\sum k\) 的范围没有给定,所以你需要实现 \(O(k\sqrt{\sum|S|})\) 的复杂度,就是对每个 \(S\) 的长度来跑最短路。
-
G题
考虑一个大小为 \(c\) 的字符集,其中有 \(c^{2n}\) 个长度为 \(2n\) 的字符串。如果该字符串标号 \(\{1, 2, .., 2n\}\) 可以划分为 \(n\) 对,则称该字符串为完美字符串,具体来说:
- 每个标号属于且唯一属于一对。
- 对于每对 \((i,j)\) ,\(S[i]=S[j]\) 。
- 任意两对 \((i,j),(k,l)\),不能满足 \(i<k<j<l\) 。
求完美串的数量。
数据范围:\(n,c\le 10^7\) 。
这些 pair 应当形成一个类似括号匹配的结构,但同一个串会有多个可能的匹配,所以直接算匹配会算重。
我们考虑一个贪心匹配的过程:维护一个栈,枚举每个字符,如果它恰好等于栈顶则弹出栈顶,否则压入栈。如果最后栈为空则是完美的。
下面考虑计数。
-
组合做法
考虑从 \((0,0)\to (n,n)\) 有多少方案。
- 当位于 \((x,x)\) 时,有 \(c\) 种方法向右走。
- 其他情况,有 \(c-1\) 方法向右走,\(1\) 种方法向上走。
所以答案就是 \(\sum_{i=0}^n f_i\cdot c^{i}c^{n-i}\) ,其中 \(f_i\) 表示 \((0,0)\to (n,n)\) 中穿过 \(y=x\) 有 \(i\) 次的方案数。
穿过 \(y=x\) 就是碰到 \(y=x+1\) ,对称后求的就是至少穿过一次的方案,然后再对称求出至少穿过两次的方案,以此类推求出每个 \(f_i\) 。
-
生成函数做法
记长度为 \(n\) 的完美串数量是 \(f_n\) ,好串定义为满足第一个字符匹配的是最后一个字符的完美串,数量记为 \(g_n\) 。所以有下面的关系:
- 一个完美串可以唯一写成若干个好串的连接,所以有 \(F=1+G+G^2+...=\frac{1}{1-G}\) 。
- 好串去掉第一个和最后一个字符也是一个完美串,但还要求其中的每个好串的第一个字符和原串的第一个字符不同,所以有 \(G=cx(1+\frac{c-1}{c}G+(\frac{c-1}{c}G)^2+...)=\frac{cx}{1-\frac{c-1}{c}G}\) 。
解出 \(F=\frac{(2-c)+c\sqrt{1-4(c-1)x}}{2-2c^2x}\) 。
-
H题
给定一棵树,对于 除了根节点之外的 每个点可以给其祖先之一的权值 \(+1\) ,定义关键点为权值严格最大的那一个点(可能没有),问哪些点可以称为关键点。
数据范围:\(n\le 10^6\) 。
首先考虑如何判断一个点 \(x\) 是否合法,那么其子树节点的权值都给 \(x\) ,那么就删掉 \(x\) 的子树,然后对其他节点权值的最大值就是 \(si_x-2\) ,然后就从叶子向根递推判断。
然后要注意到,如果我们直接对整棵树二分出 \(mid\) ,使 \(mid\) 是最大的合法的 在不删节点情况下 每个节点权值的最大值,那么对于 \(si_x-2\ge mid\) ,一定可以是关键点,对于 \(si_x-3<mid\) ,一定不能是关键点。
对于 \(si_x-3=mid\),那么由于在不删除 \(x\) 的子树下, \(x\) 向 \(x\) 的祖先有 \(1\) 的权值贡献,那么我们就判断一下去掉这点贡献是否可以让树变得合法,这是简单的。
-
I题
平面上给定 \(n\) 个不相交的圆,你需要加 \(n-1\) 条直线,满足:
- 直线端点是整数
- 线最多和两个圆有公共点
- 任意两条直线不能有除端点处的公共点
数据范围:\(n\le 2\times 10^5\) 。
这其实是逆天扫描线题,关键点在于题目保证了圆不相交,那么随着 \(x\) 增大,按 \(y\) 坐标排序的圆的相对顺序不会改变,那么就可以在一个新圆加入的时候把它和上面的圆连接。
-
M题
给定一个完全图,你要给每个边染色 \(1\sim m\) 的一种,满足:
- 对于任意一个同种颜色的边和 \(n\) 的点分别形成的子图,图的直径要小于等于 \(4\) 。
其实只要注意到一个联通的子图边至少得 \(n-1\) 条,而完全图的边最多 \(\frac{1}{2}n(n-1)\) ,所以 \(m\) 最大为 \(\frac{n}{2}\) ,并且由于边只能用 \(n-1\) 条构成树,所以限制还挺强的,在这种性质下找一找还是能找到构造方法的。
2022-2023 ICPC Asia Pacific - Yokohama Regional
-
F题
给定 \(n\) 个半径为 \(r_i\) 四分之一圆,问能否平滑的拼接起来,最终形成一个首位相接的环。
数据范围:\(r_i\le 10^4,n\le 100\) 。
首先四分之一圆会分成四组,分别为 \((+,+),(+,-),(-,+),(-,-)\) ,首先是正负和要为 \(0\),因为还要满足光滑连接的条件,所以四组的个数要满足一些条件。
画画图会发现,只要 \(n\) 为偶数,然后四组的个数的奇偶性相同就可以了(官方题解也没证明,感觉赛时碰到还是要果断一点)
-
D题
在二维平面上有 \(m\) 个棋子,你可以移动一个棋子,问是否可以在移动后通过旋转和平移得到目标状态。
数据范围:\(n\le 500\) 。
-
做法一:
在起始状态和目标状态删除一个点,然后判断两个棋盘是否等价,这个可以用哈希实现。
注意不能暴力求哈希,需要一定的优化做到 \(O(n^2)\) 。
-
做法二:
我们考虑按最上最左来考虑的第一个棋子,如果他没有移动,那么他在移动后就会是目标状态中的第 \(1/2\) 个,而如果移动了,那么第 \(2\) 个棋子在移动后就会是目标状态中的第 \(1/2\) 个,所以我们可以只考虑这 \(4\) 种对应情况,然后暴力 \(O(n^2)\) 判断一次就可以了。
-
The 2022 ICPC Moscow Regional Contest
-
C题
你有长度 \(1,2,3,...,n\) 的木棍各一个,现在你需要把这些木棒组成最多的钝角三角形(得是合法的钝角三角形),给出构造方法。
数据范围:\(n\le 10^6\) 。
首先有结论,构造的钝角三角形的数量是 \(\lfloor\frac{n-1}{3}\rfloor\) ,考虑如何构造。
通过敏锐的观察,你可以发现:
我们把序列分成四块,对于后三块我们可以分出: \(x=k+x,y=2k+x,z=3k+x\)
可以发现 \(x+y=3k+2x>z\)
而且 \(z^2=9k^2+6kx+x^2,x^2+y^2=5k^2+6kx+2x^2\)
那么 \(z^2-(x^2+y^2)<0\to x^2<4k^2\to x<2k\) 。
所以,如果 \(k=\lfloor \frac{n}{4}\rfloor,x=n-3k<2k\to 5\lfloor \frac{n}{4}\rfloor>n\)
极限情况 \(n=4t+3\to n>15\),其实由于 \(n=3t+1\) ,实际极限情况是 \(n>12\) 。
所以我们可以手动构造 \(n<12\) 的情况,此时有一个简单方法,令 \(x=\lfloor \frac{n-1}{3}\rfloor\) ,我们可以构造出\((x-i+2,n-2i+2,n-n-2i+1)\) 。

浙公网安备 33010602011771号