PKUSC2024 + CTS2024

回文路径

题意:2×n 的网格,每个格子有一个字符。从任意位置开始,每次向右/下走一格,任意位置停止。求路径是回文串的最大长度。

数据范围:n105

枚举回文中心 p。设 p 在第二行,假设他能在本行拓展到 s2[l,r],然后从 l 往上走,使得 s1[l,l]s2[r+1,r] 匹配。

如果路径转折点 x(l,p),一定要满足 s1[l1,x]=s2[l,x],才有可能与原路径长度相等。不可能超过原路径。submission

正方形计数

题意:给定格点凸 n 边形的顶点 (xi,yi)。假定 S 代表该 n 边形内部与边上的格点集合。

求从 S 中选择四个互不相同无顺序点 (x,y,z,w) 的方案数,使得 x,y,z,w 构成正方形。n8, 0xi,yi2000

独立

题意:给定一棵 n 个点的树和正整数 m,每个点的权值在 [1,m] 中等概率独立随机。

求不同方案的最大权独立集大小之和。1n2000,1m108

分流器

题意:

排队

题意:给定 n 个区间 [li,ri],定义 fi(x)=x+[lixri]

q 组询问,每次给出 [L,R],输出 fR(fR1(fL(0)))1n,q106,0lirin

重要观察:对于 i<j, 有 f(i,r)f(j,r)

假设 [i,j) 已经累计到 xf(j,r)0 开始累计,始终满足 f(j,r)f(i,r),如果两者相等,则达到相同局面,后续增量也相同。

从左往右做扫描线,用数据结构维护所有的 f(i,r),根据上述结论,随着 i 的增大,答案不增。

也就是说,答案在 [lr,rr] 之间的 i 是一段连续区间,线段树上二分然后区间加。submission

最短路径

题意:

水镜

题意:给定长度为 n 的正整数序列 {h},求满足以下条件的二元组 (u,v) 对数。

  • 1u<vn
  • 存在正实数 L 和一个长度为 vu+1 的序列 {r} 满足 ri{hi,2Lhi}
  • i[u,v), ri<ri+1

pi=max(hi,2Lhi)。由于 hi,2Lhi 关于 L 对称,把序列 r 分割成 <LL 两部分。

小于的部分 min(hi,2Lhi) 单调递增,也就是 pi 单调递减;另一部分 pi 单调递增。

序列合法当且仅当存在 t[l,r) 使得 pl>pl+1>>pt?pt+1<<pr。其中 ? 表示大小关系任意。

注意到 pt=pt+1=L 的特殊情况,此时只要使 L 向下移 ϵ 即可使 [l,r] 合法。

直接统计条件过多,正难则反。如果存在 i(l,r) 使得 pi1pipi+1,则序列非法,这是充要条件

如果 hi>hi+1

pipi+1Lhi+hi+12pipi+1Lhi+hi+12

hi<hi+1 的情况同理。如果 hi=hi+1,说明满足 pipi+1L 的范围是全集 U

非法条件 pi1pipi+1 实际对应了 L 的一个取值范围,设为 Ii

[l,r] 非法当且仅当 i=l+1r1Ii=U,非法情况的并是全集,则没有任何一个 L 的取值能使 [l,r] 合法。

扫描线统计有多少个数对 lr 使得 i=lrIi=U,这和非法区间一一对应。

假设当前在 r,我们要找到最大的 l 使得范围之并是全集,那么对于所有 ll 的并也是全集。

Ir 范围内的数全部覆盖成 r,那么要找的 l 即全局最小值(没被覆盖的位置为 0)。

n1 个关键点 hi+hi+12 把值域分成 n 块,每块中间再选一个与边界不同的代表点,这样就能表示 Ii 及其并(与全集 U 的关系)。

时间复杂度 O(nlogn)submission

线段树

题意:给定一棵线段树,根为 [0,n),按先序遍历给出 n1 个分割点 xi,根的左儿子为 [0,x0),右儿子为 [x0,n),其他点类似。

该线段树维护了一个序列的区间和,给出 m 个区间 [Li,Ri),求能够确定所有给定区间和的子集个数。

其中子集定义为 2n1 个区间维护的值的 22n1 个子集。2n105

(第一次知道线段树大小是确定的,稍微证明一下,n1 个分割点(显然),每次分裂出两个儿子,再加上根。)

考虑指数做法。枚举子集,对于每个被选中的节点 [l,r)lr 连无向边。最后 [L,R) 的和能被表示当且仅当 L,R 在同一连通块。

重要观察:连边是无交的。一条边对应一个区间,线段树上区间要么包含,要么无交(端点不算)。

从下往上处理每个区间,一个区间 [l,r) 怎样才算处理好呢:使与当前区间有关的限制连通或在未来有可能连通。

由于我们已经把 L,R 视作来考虑连通性了,不需要考虑开闭,[l,r) 表示了 lr 所有点的连通关系,而非 lr1

如果 [L,R][l,r](真包含),在 [l,r] 处理完后必须连通,否则后续不可能有边连向 [l,r] 内部。

否则只有一个端点 x[l,r],分情况讨论:

  • 如果 l,r 连通,后续连边只会连向 lr,因此 x 需要至少与一个端点连通。

  • 如果 l,r 不连通,设t 表示 l 连通块中的最大编号,不会存在一个 r 连通块的编号小于 t,否则有交。

    因此如果 x[l,t] 则必须与 l 连通;否则与 r 连通。

必要性显然,考虑充分性。假设当前在合并 Li[l,mid], Ri[mid,r] 两个区间(显然两个值不会相同)。

  • 两个区间的左右端点都连通,L,R 显然连通。
  • [l,mid] 的分割点为 i[mid,r] 的分割点为 j
    • 只有一边连通,假设左边不连通。如果 Lmid 连通,合法;否则必须要求 l,r 连通才能使条件合法。
    • 两边都不连通。如果都与 mid 连通,合法;如果 l,L 连通,r,R 连通,必须要求 l,r 连通;否则一定非法

一定非法的情况是出现 l,L 连通,mid,R 连通,此时不管你连不连 (l,r) 这条边都不能使条件成立。

同时也说明一点:如果 l,r 连通且左右儿子都已经处理完,则该区间一定合法。

x 表示 [l,r)g(x) 表示使 l,r 连通的合法方案,f(x,i) 表示 l,r 不连通且 l 连通块中最大标号为 i 的合法方案。合法定义为区间处理完。

转移时考虑 (l,r) 需不需要连边,设 u 表示 x 的左儿子,v 表示右儿子:

  1. 2g(u)g(v)g(x)
  2. g(u)f(v,i)g(x), f(u,i)g(v)g(x)
  3. g(u)f(v,i)f(x,i), f(u,i)g(v)f(x,i)
  4. f(u,i)f(v,j)g(x),f(u,i)f(v,j)f(x,i)

前两种情况由于 l,r 连通,不会有非法转移。第三种情况考虑跨过 mid 且属于 [l,r) 的限制,也是合法的。

唯一非法情况是上面讨论过的,有两个分割线 i,j,且存在 L,R 只有一个端点属于 [i+1,j]

如何判断 [i+1,j] 合法?

维护序列 q,对于每对 Li,Ri 随机一个哈希值 hiqLiqLihi,qRiqRihi,求出前缀异或 {a}

i,j 能够转移当且仅当 ai=aj

考虑把方程中的 iai 替代,相当于 f(v)[ai=v]f(i), ai=v,转移方程还是正确的:

g(x)=2g(u)g(v)+g(u)f(v)+f(u)g(v)+f(u,ai)f(v,ai)f(x,ai)=g(u)f(v,ai)+f(u,ai)g(v)+f(u,ai)f(v,ai)

实际上 g(x) 后三项就等于 f(x)f 用线段树合并维护。

答案等于g(root)+f(root,0)0 表示分割线不处于某个限制中间。时间复杂度 O(nlogn)submission

(警示后人:线段树合并两个点都要下传标记)

众生之门

多方计算

投票游戏

字符串游戏

作者:Luxinze

出处:https://www.cnblogs.com/Luxinze/p/18408991

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Lu_xZ  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示