首页 > 其他分享 >CTS2024 题解

CTS2024 题解

时间:2024-09-12 14:52:15浏览次数:11  
标签:le log 题解 sum Link CTS2024 节点 dp


\(\text{By DaiRuiChen007}\)



D1T1. 水镜

Problem Link

给定 \(a_1\sim a_n\),求多少个 \([l,r]\) 满足存在实数 \(L\),将若干个 \(a_i\) 变成 \(2L-a_i\) 后 \(a_l\sim a_r\) 严格递增。

数据范围:\(n\le 10^6\)。

考虑钦定 \(i-1\) 翻转 / 不翻转,\(i\) 翻转 / 不翻转,容易发现只有 \(a_{i-1},a_i,L\) 满足某些条件时某些状态才能成立。

那么不合法一定是 \(i-1\) 无论怎么选,\(i\) 都必须翻转 / 不翻转,且 \(i+1\) 无论怎么选,\(i\) 都必须不翻转 / 翻转,这样就导出矛盾了。

如果不存在矛盾,那么总能构造出一组解,因此手玩得到充要条件为:

  • \(a_i\ge\max(a_{i-1},a_{i+1})\) 时,\(2L>a_i+\min(a_{i-1},a_{i+1})\)。
  • \(a_i\le \min(a_{i-1},a_{i+1})\) 时,\(2L<a_i+\max(a_{i-1},a_{i+1})\)。

ST 表维护对 \(2L\) 的区间限制,对每个左端点二分最大合法右端点即可。

时间复杂度 \(\mathcal O(n\log n)\)。

Submission Link




D1T2. 线段树

Problem Link

给定长度为 \(n\) 的序列上一棵不均匀的线段树,以及 \(q\) 个查询区间,求有多少个线段树上的节点集合,使得直到这些节点对应的区间和后,能确定每个查询区间的区间和。

数据范围:\(n,m\le 2\times 10^5\)。

对 \(1\sim n\) 的每个位置被查询区间的覆盖情况划分等价类,那么我们必须分别确定每个等价类内部的元素和。

考虑什么样的节点集合是好的,我们把这些节点对应的区间划分也等价类,他们是好的当且仅当同一等价类的任意节点在上一步内也在同一等价类中。

那这就相当于把所有被选中的节点 \(u\) 在线段树和 \(fa(u)\) 把边断开,要求不同等价类的元素不连通,且要么没有和根节点联通的等价类,要么该等价类不被任何查询区间覆盖的等价类。

那么可以树形 dp,\(dp_{u,i}\) 表示 \(u\) 子树内只有等价类 \(i\) 和 \(u\) 联通的方案数,设 \(u\) 的线段树左右儿子为 \(l,r\),转移如下:

\[\begin{aligned} dp_{u,i}&=dp_{l,i}\times dp_{r,0}+dp_{l,0}\times dp_{r,i}+dp_{l,i}\times dp_{r,i}\\ dp_{u,0}&=2\times dp_{l,0}\times dp_{r,0}+\sum_{i>0} dp_{u,i} \end{aligned} \]

\(dp_{u,0}\) 的转移是考虑 \(u\to fa(u)\) 可不可以不断开。

转移时考虑 std::unordered_map 启发式合并,维护 \(\sum_{i>0}dp_{u,i}\) 并特殊计算 \(dp_{u,0}\),剩余的修改相当于全局乘和单点加,容易解决。

注意特判轻儿子的 \(dp_{v,0}\) 恰好为 \(\bmod P=0\) 的情况。

时间复杂度 \(\mathcal O(n\log n)\)。

Submission Link




D1T3. 众生之门

Problem Link

给定一棵 \(n\) 个点的树,求一个 \(n\) 阶排列 \(x\) 使得 \(x_1=s,x_n=t\) 且 \(\oplus_{i=1}^{n-1} \mathrm{dis}(x_i,x_{i+1})\) 最小。

数据范围:\(n\le 5\times 10^4\)。

观察发现我们总存在一个 \(n\) 阶排列 \(x\) 使得所有 \(\mathrm{dis}(x_i,x_{i+1})\le 3\),因此答案在 \([0,3]\) 之间。

显然答案的奇偶性是一定的,因此我们只要确定答案 \(<2\) 还是 \(\ge 2\)。

打表发现对于绝大部分的树,答案总是 \(0\) 或 \(1\)。

我们可以随机构造,每次随机一组 \(x\),判断答案是否合法。

我们可以把一组 \(x\) 的权值看成 \([0,n]\) 间均匀生成的随机数,那么期望随机 \(\mathcal O(n)\) 轮就能找到答案。

时间复杂度:\(\mathcal O(n)\)。

Submission Link




D2T1. 多方计算

给定 \(n+1\) 个人编号 \(0\sim n\),初始 \(0\sim n-1\) 分别知道一个 \([0,2^m)\) 内的正整数 \(a_0\sim a_{n-1}\)。

你可以进行 \(T\) 轮操作,每轮操作所有 \(i\) 同时向某个 \(i+1\) 发送 \(1\) bit 的信息,要求最终 \(n\) 知道 \(\sum a_i\)。

要求 \(T\le n+m+3\)。

数据范围:\(n,m\le 2000\)。

考虑暴力,第 \(k\) 轮第 \(i\) 个人发送 \(\sum_{j=0}^i a_j\) 的的第 \(k-i\) 位,由于产生了 \(\mathcal O(\log n)\) 个进位,因此需要 \(n+m+\log_2n\) 轮发送完成。

考虑优化,注意到 \(k-i<0\) 时不会发送任何信息,可以考虑利用这些冗余操作。

如果 \(k-i<0\),我们发送第 \(k-i+m+\log n\) 位,那么这一部分的加法会将 \(i>\log n\) 的每个 \(a_i\) 的最高位贡献提前计算,最终发送完成只要 \(n+m+\log\log n\) 轮。

但此时只能做到 \(T=n+m+4\),考虑如何优化,类似的办法,再提取出一小部分较高位再进行一次加法即可。

Submission Link




D2T2. 投票游戏

Problem Link

给定一棵 \(fa(i)<i\) 的有根树,每个点 \(u\) 对自己的权值有 \(a_u\) 贡献,对自己父亲的权值有 \(b_u\) 贡献。

定义一轮游戏表示不断删除权值最大且未被删除的节点(多个则选取标号最大的节点)并删除之。

\(q\) 次操作单点改 \(a_u,b_u\),查询进行一轮虚拟游戏后 \(x,y\) 谁先被删除。

数据范围:\(n,q\le 2\times 10^5\)。

显然不可能每次询问都进行一轮虚拟游戏,考虑用一些方式刻画删除顺序。

容易发现每次删除节点后,其他点的权值单调不降,因此我们求出每个点 \(u\) 被删除时对应的权值 \(f_u\).

那么 \(x\) 比 \(y\) 先删除当且仅当 \(f_x>f_y\) 或 \(f_x=f_y\) 且 \(x>y\)。

我们考虑如何暴力求出所有 \(f_u\),容易发现 \(f_u\) 可以要通过所有儿子的 \(f_v\) 推出。

维护当前的 \(u\) 的权值 \(f_u\),初始为 \(a_u+\sum b_v\),把 \(f_v\) 降序排列,即每次取出最先被删除的儿子 \(x\):

  • 如果 \(f_u\le f_x\),因为 \(u<x\) 因此 \(x\) 比 \(u\) 先删除,那么 \(f_u\gets f_u-b_x\),递归考虑下一个被删除的儿子。
  • 如果 \(f_u>f_x\),那么 \(u\) 比 \(x\) 先删除,\(f_u\) 就是所求答案,结束。

设 \(s_i\) 表示 \(f_v\) 前 \(i\) 大的 \(v\) 对应的 \(b_v\) 之和,\(v(i)\) 表示 \(f_v\) 第 \(i\) 大的 \(v\)。

我们就是要找到第一个 \(a_u+\sum b_v-s_{i-1}>f_{v(i)}\),即 \(a_u+\sum b_v>s_{i-1}+f_{v(i)}\)。

此时 \(f_u=a_u+\sum b_v-s_{i-1}\)。

可以用一棵平衡树维护每个点的所有儿子,按 \(f_v\) 排序后,求出前缀 \(s_{i-1}+f_{v(i)}\) 的最小值即可在平衡树上二分。

此时单点修改的复杂度难以接受,考虑能不能用 ddp 类似的方法优化。

观察 \(f_u\) 和其重儿子 \(x\) 的 \(f_x\) 的关系,不妨设在所有轻儿子中二分求出的答案为 \(w\):

  • 如果 \(w>f_x\),那么 \(x\) 一定比 \(u\) 晚删除,\(f_u=w\)。
  • 否则 \(x\) 一定比 \(u\) 早删除,在所有轻儿子构成的平衡树中二分 \(a_u+\sum b_{v}-b_x\),得到的答案即为 \(f_u\)。

因此 \(f_u\) 可以表示成关于 \(f_x\) 的分段常函数,很容易合并相邻的两个信息。

并且我们也只要维护每个点轻儿子构成的平衡树。

那么可以直接树剖维护重链信息乘积,更新时修改每条重链链顶父亲的平衡树并更新信息即可。

时间复杂度 \(\mathcal O(n\log n+q\log^2n)\)。

Submission Link




D2T3. 字符串游戏

给定长度为 \(n\) 的字符串 \(S\),两个人轮流操作,每次删除 \(S\) 的一个前缀 \(T\),获得的分数等于 \(T\) 在 \(S\) 中的出现次数。

两人都要最大化和对手的分差,求最终先手分数减后手分数的值。

数据范围:\(n\le 10^6\)。

翻转 \(S\) 变成删后缀的问题,记 \(w(l,r)\) 表示 \(S[l,r]\) 在 \(S[1,r]\) 中的出现次数。

维护 \(w(l,r)\) 等于 \(S[l,r]\) 在后缀自动机 Parent-Tree 上对应的节点的子树中有多少 \(\le r\) 的 Endpos。

对 \(r\) 离线后相当于单点加,查询子树和,树状数组维护即可,定位到 \(S[l,r]\) 对应节点可以在 Parent-Tree 上根据长度倍增。

设 \(f_i\) 表示 \(S[1,i]\) 答案,转移为 \(f_i=\max_{j=0}^{i-1} \{w(j+1,i)-f_j\}\) 然后考虑如何优化。

首先我们知道 \(k<j\) 时 \(w(k,i)\le w(j,i)\),因此如果 \(f_k\ge f_j\) 那么决策 \(k\) 显然不如决策 \(j\)。

那么合法的转移点构成 \(f\) 递减的单调栈,但这依然不足以通过此题。

我们不妨假设 \(i\) 的最优转移是单调栈中某个的 \(j\),且这个 \(j\) 满足 \(f_j<f_i\),如果 \(f_j\ge f_i\),那么 \(j\) 一定被弹出,这个过程带来的转移是均摊 \(\mathcal O(n)\) 的。

我们注意到对于 \(j<k\),\(w(i,j)\ge w(i,k)\) 因为每次 \(S[i,k]\) 出现,一定能在其前缀中找到 \(S[i,j]\)。

对于单调栈中某个 \(j<k\) 且 \(f_j<f_k<f_i\) 的节点 \(k\),都有 \(f_i>f_k\ge w(j+1,k)-f_j\ge w(j+1,i)-f_j\),故这样的 \(k\) 不存在,即 \(j\) 是此时栈顶。

因此 \(f_i\) 只可能从被弹出元素或者弹栈后的栈顶转移,不断用栈顶更新 \(f_i\) 直到 \(f_i\) 大于当前栈顶的 \(f\) 即可。

转移次数和弹栈次数成线性。

时间复杂度 \(\mathcal O(n|\Sigma|+n\log n)\)。

Submission Link

标签:le,log,题解,sum,Link,CTS2024,节点,dp
From: https://www.cnblogs.com/DaiRuiChen007/p/18410193

相关文章

  • 【题解】Solution Set - NOIP2024集训Day27 树形 dp
    【题解】SolutionSet-NOIP2024集训Day27树形dphttps://www.becoder.com.cn/contest/5521「HDU4661」MessagePassing「BZOJ3935」Rbtree「ARC101E」RibbonsonTree「AGC034E」CompleteCompress「COCI2014.10」Kamp「SCOI2015」小凸玩密室「AGC008F」Black......
  • LOJ4222 「IOI2024」马赛克上色 题解
    题目描述给定长为\(n\)、下标从零开始的\(01\)序列\(x,y\),保证\(x_0=y_0\)。令\(col_{0,j}=x_j,col_{i,0}=y_i\),对\(\forall1\lei\ltn,1\lej\ltn\),\(col_{i,j}=[col_{i-1,j}=0\andcol_{i,j-1}=0]\)。\(q\)次询问,给定\(u,d,l,r\),求\(\sum_{i=u}^d......
  • Road of the King 题解
    RoadoftheKing题解形成强连通图的必要条件是点\(1\)能在环中,于是考虑\(1\)号点形成的强连通分量\(x\)。这类图论计数题目往往考虑dp,于是我们设\(dp_{i,j,k}\)表示走了\(i\)步,经过了\(j\)个点,\(1\)号点形成的强连通分量\(x\)的大小为\(k\)时的方案数。转移......
  • PKUSC2024 + CTS2024
    回文路径题意:\(2\timesn\)的网格,每个格子有一个字符。从任意位置开始,每次向右/下走一格,任意位置停止。求路径是回文串的最大长度。数据范围:\(n\le10^5\)。枚举回文中心\(p\)。设\(p\)在第二行,假设他能在本行拓展到\(s_2[l,r]\),然后从\(l\)往上走,使得\(s_1[l^{\pri......
  • 洛谷 P11021 [LAOI-6] 区间测速 题解
    题目传送门使用multisetmultiset可以看成一个序列,支持插入一个数或删除一个数,时间复杂度均为\(O(\logn)\),且能始终保证序列中的数是有序的,而且序列中可以存在重复的数(而set容器要求两两不同,且不保证有序)。一个基本事实:速度最大的时刻必然出现在两个相邻点之间。例如从......
  • CF786B 题解
    题意洛谷题面传送门现有一个图,有\(n\)个节点,从节点\(s\)出发,求到\(n\)个点每一个点的最短路。其中,有三种建边方式:建一条从\(u\)到\(v\)的单向边。从节点\(v\)分别向\([l,r]\)的每个结点连一条边。从节点\([l,r]\)向节点\(v\)连边芝士线段树优......
  • Power Designer 连接 PostgreSQL 逆向工程生成pd表结构操作步骤以及过程中出现的问题
    、使用PowerDesigner16.5链接pg数据库1.1、启动PD.选择CreateModel…。 1.2、选择Modeltypes/PhysicalDataModelPhysicalDiagram:选择pgsql直接【ok】  1.3、选择connect在工具栏选择Database-Connect…快捷键:ctrl+shift+N.如下图:  1.4、选择配置连接......
  • 【洛谷 P5076】【深基16.例7】普通二叉树(简化版)题解(多重集合+lower_bound+upper_bound
    【深基16.例7】普通二叉树(简化版)题目描述您需要写一种数据结构,来维护一些数(都是以内的数字)的集合,最开始时集合是空的。其中需要提供以下操作,操作次数不超过:查询数的排名(排名定义为比当前数小的数的个数。若有多个相同的数,应输出最小的排名)。查询排名为的数。求的前驱(......
  • P6684 题解
    CF1386CP6684cf上时限\(1\)秒,洛谷\(2\)秒。思路维护是否有奇环可用拓展域并查集。暴力复杂度\(O(mq)\)。发现插入容易删除困难,用不删除的莫队,可撤销并查集,复杂度\(O((n+q)\sqrtm\logn)\)。大概要\(5\)秒左右,只能过洛谷上的前\(5\)个子任务。等价对于每个\(r\)......
  • CTS2024
    水镜先考虑如何判定一个区间\([l,r]\)是否合法。首先肯定存在一个分割点\(mid\),使得\([l,mid]\)取\(\min(h_i,2L-h_i)\),\((mid,r]\)取\(\max(h_i,2L-h_i)\)。因此,记\(p_i=\max(h_i,2L-h_i)\),则\(p_i\)需要先不升,再不降,并且只能在转弯处有至多一对相等。考虑其反面,......