20260429

A - 灾难

题意:给定一个 DAG,求每个点能支配的点的数量。

n≤65534n \le 65534n≤65534,输入的文件大小不超过 1 MB


求一个点支配别人的数量很难求,考虑求出每个点会被那些点所支配。

对于一个点 iii 而言,连向它的点记为 pi,jp_{i,j}pi,j,那么能支配 iii 的点必须在 LCAj=1∣pi∣pi,jLCA_{j=1}^{|p_i|}p_{i,j}LCAj=1∣pi∣pi,j 到根节点的点上。(这里的 LCA 并不是正常 LCA,我感觉而是类似于另外一颗由这个 DAG 所构成的树的 LCA).

具体做法如下:对于每个点,求出连向它的点在另一颗树上的 LCA,最后在把自己与那个 LCA 在另一棵树上连接。最后在用 dfs 求出子树大小就可以了。

B - 字符合并

题意:有一个长度为 nnn 的 01 串,你可以每次将相邻的 kkk 个字符合并,获得一定价值。

给出所有长度为 kkk 的串被合并所获得的价值以及得到的新字符,问把原串缩完能获得的最大价值。

n≤300,k≤8n \le 300,k\le8n≤300,k≤8


注意到 n,kn,kn,k 都很小,对于一段区间 l,rl,rl,r 而言,由于 wi>0w_i>0wi>0,所以区间 l,rl,rl,r 最终一定会变成 (r−l+1)mod  (k−1)(r-l+1) \mod (k-1)(r−l+1)mod(k−1) 的 01 串(特别的,为 mod 后为 000 实际上是 k−1k-1k−1)。

考虑区间 dp,设 fl,r,xf_{l,r,x}fl,r,x 表示对于区间 l,rl,rl,r,最终变成 xxx 这个状态的方案数,转移考虑枚举分界点最后一位。

看起来可能会超时,但实际上很多无效状态和不可能的情况可以剪枝。

C - 异或

题意:

有一颗以 111 为根节点的由 nnn 个节点组成的树,节点从 111 至 nnn 编号。树上每个节点上都有一个权值 viv_ivi。现在有 qqq 次操作,操作如下:

  • 1 x z1~x~z1 x z:查询节点 xxx 的子树中的节点权值与 zzz 异或结果的最大值。
  • 2 x y z2~x~y~z2 x y z:查询节点 xxx 到节点 yyy 的简单路径上的节点的权值与 zzz 异或结果最大值。

n,q≤105,vi,z≤230n,q \le 10^5,v_i,z \le 2^{30}n,q≤105,vi,z≤230


看到这两个查询就非常像树剖啊。

而对于异或,很容易想到 tire。

两者结合,用树剖的线段树套 trie 树。

时间复杂度 O(nlog⁡2nlog⁡V)O(n \log^2 n \log V)O(nlog2nlogV)

但这样可能会 TLE,毕竟 8 亿再加上线段树。

注意到不需要修改,可以考虑用倍增去优化,直接把线段树改成 st 表维护,查询 O(log⁡V)O(\log V)O(logV)。

总时间复杂度 O(nlog⁡nlog⁡V)O(n\log n \log V)O(nlognlogV)

赛后发现用可持久化线段树其实可以做到 O(nlog⁡V)O(n \log V)O(nlogV),其实就是不树剖了,直接就在 dfs 的时候处理,两种情况分别考虑。第一种可以继承上一个 dfn 的状态,第二种则是继承父节点的状态。

相关推荐
careathers26 分钟前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛1 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla1 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
tellmewhoisi2 小时前
深度学习0:数学知识:正态分布1
人工智能·深度学习·算法
-梅2 小时前
算法(1) 动态规划
算法·动态规划
沫璃染墨2 小时前
从零入门计算机网络系列(十五):TCP可靠传输机制详解——从序号与确认应答到乱序处理
服务器·网络·c++·tcp/ip·tcp
青少儿编程课堂2 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:Bellman-Ford与SPFA含负权最短路及负环检测全解析
c++·python·算法·bfs·信息学竞赛
旖旎夜光2 小时前
【C++ 基础入门】类和对象(下):初始化列表、static 成员、友元与内部类
c++·笔记·学习
j7~2 小时前
【C++ 八股文】(篇四)C++11 新特性
开发语言·c++·面试·c++11·八股文
eggwyw3 小时前
C++中大括号的用法合集
开发语言·c++