pkusc/wc 做题记录&题解

鲜花#

所有题目来源:search pku in qoj

参考文章:

pkusc 2024 Day1#

T1 (回文路径)#

原中原P4324

给定 2×n 网格,每个格子上有一个字符,考虑一条只能向下和向右走的路径,如果路径上每个字符连成的字符串是回文串,称这条路径是好的,求最长好路径。

1n105

solution

枚举回文中心在啥位置,不妨设在第一行。二分出在第一行能走到的最长距离(容易证明这样贪心是对的),然后往下走,再二分在第二行能移动到最长距离。

判断回文用哈希即可,复杂度 O(n)

record

T2 (正方形计数)#

给定凸 n 边形 (x1,y1)(xn,yn),求有多少正方形(可以是斜正方形)在该多边形内。

1n8,1xi,yi2000。时限 4s

solution

考虑枚举正方形的一条边向量 (Δx,Δy),然后对起点坐标有若干限制,可以写成半平面交的形式。

相当于数某个多边形内部整点数,可以拆成对 O(n) 条线段下方的区域内数点个数,类欧几里得算法解决。

时间复杂度 O(nV2logV)


但是本题小常 V3 能过,于是有如下做法:

直接记录凸包当 x=t 时包含的整点区间 lt,rt

然后同样枚举正方形的一条边向量 (Δx,Δy),然后枚举起点 x 坐标,此时起点 y 坐标限制显然是一个区间,通过 l,r 算出即可。

上下界实现精细一点就能通过。

record

T3 (独立)#

弱化版:P8352

给定 n 个点的树,每个点点权在 [1,m] 中随机,求所有方案下树上最大权独立集的和。

数据范围:1n2000,1m108


pkusc 2024 Day2#

T1 (分流器)#

在一张 n+1 个点的有向图上,1n 出度都为 2,且边 ij 满足 i<j。称每个点的两条出边为左右手。在这个图上做一个投球游戏,多次在 1 放球,每次球从 x 的左手滚下,然后交换 x 的左右手。

求最小周期,即最少放球个数使得左右手状态和初始状态一致。

1n5×104

solution

考虑维护 1i 的最小周期,并且求出此时每个点被经过的次数 fi

可以据此计算出 fi+1=i+1out(u)fu2,如果 2fi+1 那么最小周期要翻倍,每个 fi×2

一个较好的实现是令 f1=2n,令 k=mini=1nlowbit(fi),答案就是 2nk+1,压位高精度维护。

时间复杂度 O(n2ω)。—— solution by Dairuichen

record

T2 (排队)#

给定 n 个区间 [li,ri],定义 fi(x)=x+[lixri]q 次询问 L,R,求 fR(fR1(fL(0)))

1n,q106

solution

扫描线,设当前扫描到 RxL=fR(fR1(fL(0))),容易发现 xL 单调不增。

线段树维护所有 xi,二分出 xL[li,ri]L 区间,区间加即可。复杂度一只 log

record

T3 (最短路径)#

给定纯随机的 n 个点 m 条边的带权有向图,q 次随机询问某对点 ST 的最短路。

1n2×105,1m3×106,1q104


pkuwc 2024 Day1#

T1 (Caught in the Middle)#

给定一个长度为 n 的仅包含 L,R 的字符串 sAlice,Bob 博弈,Alice 先手。

每次操作时,假定当前剩余字符串为 s。如果 s 为空串,则此时操作者输掉游戏。否则操作者可以选择整数 i[1,|s|]

如果 si='L',则操作后剩余字符串为 s1s2si1;如果 si='R',则操作后剩余字符串为 si+1si+2s|s|

求在最优情况下谁会获胜。1n106

solution

RL 分别看成左/右括号,发现答案是括号序列能否匹配。

证明就考虑一个括号序列任意操作一次后,把和其匹配的另一个括号也操作一下就仍然是括号序列。

而不是括号序列时操作从左到右第一个有多余 L 的那个 L 就一定能操作成括号序列。

如果没有多余的 L,则一定能找到一个 R 使得操作其合法。

record

T2 (最小值之和)#

T3 (堆操作练习题2)#


pkuwc 2024 Day2#

T1 (圆)#

round(x) 表示 x 的四舍五入。给定 n 个恰好一位的小数,构成了可重集 S。你可以进行两个操作:

  • 取出 xS,放入 round(x)

  • 取出不同的 x,yS,放入 x+y

你要使最终集合 S 中只剩一个数,并最大化这个数。

1n106,ai[0,10),保证 ai 都只有一位小数。

solution

十分位 5 的直接四舍五入,=0 的不影响答案。接下来贪心地做匹配:

  • 优先匹配 4,1,然后把所有 4 变成 3(容易证明这不影响答案)

  • 再依次做 3+2,3+1+1,3+3 的匹配,然后把所有 3 变成 2(容易证明这不影响答案)

  • 最后匹配 2+2+1,2+1+1+1,2+2+2,1+1+1+1+1,就求完了答案。复杂度线性。

record

T2 (排序)#

T3 (栈)#


pkusc 2023 Day1#

T1 (Border)#

给定长度相同的非空字符串 S,T,对于任意 1i|S|,进行如下询问:

  • 假设将 S 的第 i 个字符替换为 T 的第 i 个字符,形成的新字符串 S 的最长的 border 是多少。如果不存在 border,则返回 0

询问互相独立。1n2×106,字符集为小写英文字母。

solution

特判掉 Si=Ti 的位,答案就是原串的最大 border

首先如果原串的某个 border 在其不包含某一位,则直接贡献上去。

否则枚举 border 长度,二分哈希出第一个不同的位,修改成前缀或后缀的对应位值分别贡献上去。

所有过程均可用哈希实现。复杂度 O(|S|log|S|)

record

T2 (狼人杀)#

n 个人,第 m 个人是狼人,其余随机一个人是预言家,预言家每天等概率随机一个区间 [l,r](lr) 并知道其中有没有狼,求期望几天确定狼的位置。

1mn150

solution

记一个集合 S 表示当前状态下可能为狼人的人。那么 S 应该满足包含 m (正确的狼人) 并且不包含预言家。

考虑在这个状态 S 下期望需要多少次询问才能得到新的不是狼人的信息。

如果一次询问没有得到信息,要么区间内所有的人都已经确定不是狼人,要么区间包含所有的可能的狼人。

如果一次询问是此类区间的概率为 p(S),则 S(1)|S|+11p(S) 的值即为答案的值。

考虑集合 S 外每段连续的人。设每一段连续的人的长度依次是 c1,c2,,ck (如果两端不选则记为长度为 0),函数 f(x)=x(x+1)2 表示长度为 x 的区间的子区间数目,则 p(S)=f(ci)+(c1+1)(ck+1)f(n)

注意到 f(c1+ck+1)=f(c1)+f(ck)+(c1+1)(ck+1),所以我们可以视开头和结尾的段是相连的并且额外多出来一个一定要选择的人。

考虑动态规划,设 f(i,j,k) 表示对于前 i 个人,贡献的子区间数目 (即上述式子的分子部分) 为 jk=1 表示预言家的位置已经确定的方案数。

转移是容易的,时间复杂度 Θ(n4)

By @masterhuang: 那个 (1)|S|+1 那里可以用 min-max 容斥理解。要求的是最后被确定的时间 (max),转化成求某个子集里第一个能有元素被确定出来的时间。

—— solution by Milmon

record

T3 (天气预测)#

一棵以 1 为根的树,每个点 u 有一对权值 (au,bu)au1 的概率为 pu,为 0 的概率为 1pu。确定 au 后,计算 buaubvvu 的子节点)的众数(保证子节点个数为偶数个,即参与计算众数的点数为奇数)。求 b11 的概率。Q 次更改某个点 upu

N2×105Q5×104,修改不独立。时限 5s

solution

Zaunese's blog


pkusc 2023 Day2#

T1 (排队)#

有若干个人排队,一开始队列是空的,在第 t(t=1,2,,n) 个时刻发生了如下的事件之一:

  1. x:新增了一个人,他的编号顺延,他站在编号为 x 的人后面(x=0 表示在队伍开头)。
  2. i,y:设编号为 i 的人进入队伍的时间为 t,则修改 t 时刻的操作为 1 y
    • 修改操作会影响 t 时刻之后的所有操作。
  3. z:查询此时编号为 z 的人站在队伍的第几个位置。
1n3×105
solution

考虑用平衡树维护序列,发现只需要支持:按 siz 分裂,合并,查询平衡树内最右端的 x 的位置。用 FHQ-treap 维护即可,复杂度 O(nlogn)

record

T2 (圣遗物)#

T3 (解方程)#


pkuwc 2025 Day1#

T1 (电池检测)#

给定 a+b 个电池,a 个好 b 个坏。你知道 a,b 是多少。

你每次可以同时在灯泡上接两个电池,当且仅当两个都是好的时候灯泡会亮,求最坏情况下使灯泡亮的最少次数。

多测,a2,b1,T,a,b103

solution

抽象成图,连两个电池看成连边。于是你要连最少的边使得覆盖 a+b 元完全图的所有 a 元团。

根据 NOI 2024 百万富翁 的思路,显然把图均匀连成 a1 个团是最优的连法。(我赛事是根据 a=3 的情况发现的规律)

即连 (a+b)mod(a1)a+ba1+1 元团,连 a1(a+b)mod(a1)a+ba1 元团。复杂度 O(T)

record

T2 (Ancestors)#

给定一颗 n 个点的树,m 次询问 l,r,x,记 fak(x) 表示 xk 级祖先。

你需要求 |i=lr(fax(i))|,即区间本质不同的 x 级祖先个数。

1n105,1m106。时限 4s

Hint:有一档部分分是保证 l=1。还有就是 n5×104,m2×105 这样的分。

solution

T3 (基础博弈练习题)#

给定一张 n 个点 m 条边的有向图(有重边无自环),绝顶聪明AliceBob 在上面博弈,Alice 先手。

图中每个点 u 都有一个颜色 au。称点 A 能到达 B 当且仅当 A 走若干条边能走到 B

若给定一个序列 b1,b2,,bk,给定初始 Alice 的起点 s,则 AliceBob 轮流操作:

  • 设第 i 次操作的人在点 x,他需要走到一个 ay=bix 可达的点 y,若某人无法操作,则他输掉游戏。

  • 若进行完了 k 次操作,则进行第 k 次操作的人胜利。

Alice 可以删掉 b 序列的 r 个数(游戏变成 kr 轮)。对于每一个 i,求出当 s=i 时,能使 Alice 必胜的 rmin,或者报告无解。

1n,k106,1m2.2×106,1ai,bin

Hint:有一档部分分是保证 bi=i。还有就是保证 n,m,k102/103 的部分分。

solution

pkuwc 2025 Day2#

T1 (网友小 Z 的树)#

交互题。

给定 n105,有一个 n 个点的无边权树,你需要通过 Q13×105 次询问 1Q22 次询问 2,询问出任意一条直径的两个端点。

  • 询问 1:给出三个互不相同的数 1x,y,zn,返回 dis(x,y)+dis(y,z)+dis(z,x)

  • 询问 2:给出三个互不相同的数 1x,y,zn,返回一个 0/1 表示:x 是否在 yz 的路径上。

部分分形如 n100,[1,10]×104

solution

这是一个确定性做法,暂时最短解。先特判 n[1,3] 的情况。

首先考虑我们通过 3nϵ 次询问能问出什么。

考虑求出使得 x,2,3 最大的 x,再求出使得 x,y,3 最大的 y,再求出使得 x,y,z 最大的 z

容易调整(或反证)得出 x,y,z 必有两个直径的端点。此时在第三步的时候记 fi=query(x,y,i)


首先设 mn=min{fi},观察此时 fi 取到 mn 的位置,发现此时 i 只能为 (x,y) 树链上的任意点。

任取一个 i,let ti

  • 注意到若 x,y,z 构成链则整张图一定也构成链。

判断 fz=mn 是否成立,若成立则 z(x,y) 的链上,直接回答 (x,y)

否则我们注意到 t 要么在 (x,z) 的路径上要么在 (y,z) 的路径上(也能同时)。

  • 并且注意到 (mn=dis(x,y))+dis(y,z)+dis(z,x)=2×query(x,y,z)

此时还剩两个未知数,于是我们询问出 dis(x,z)(if t in (x,z))dis(y,z)(if t in (y,z)) 就能知道另一个。

我们此时能通过一次询问就能得出 (x,y),(y,z),(x,z) 链的长度,checkmax 后直接找出直径即可。

此时显然 Q13n,因为找 x,y,z 的过程 3n 不满。


但是此时还有一种情况就是找不到在 (x,y) 路径上的 t。即 x,y 相邻。容易发现此时图也必然是一条链。

先询问 in(y,x,z) 判断此时 y 是否在 (x,z) 的链上,是则直接回答 (x,z)

否则此时链的情况是 yxz,我们得出的 t 实际上是在 xz 的方向走一个点。

我们按照同样的方法计算 dis(y,z),dis(x,z)。注意到此时 dis(x,y) 被我们从 1 当成了 2

于是算出 dis(y,z)=dis(x,z)=n2。此时真正的直径是 (y,z),此时我们分别判断:dis(y,z),dis(x,z),dis(x,y) 是否为最大值即可。

注意:有 n=4 的情况此时我们算出的三个直径相等,所以一定 dis(y,z) 的优先级要最高,剩下俩随意。

改一下最后顺序即可,其他不用动。

if(f[z]==mn) return {x,y};//z in (x,y)?
if(in(y,x,z)) return {x,z};//y in (x,z)?这个先判显然也可以,没啥区别
bool o=in(t,x,z);int d1=mn,d2,d3,mx;
if(o) d2=query(x,t,z),d3=2*d-d1-d2;
else d3=query(y,t,z),d2=2*d-d1-d3;//计算 dis(x,y),dis(x,z),dis(y,z)
mx=max({d1,d2,d3});
if(d3==mx) return {y,z};
if(d2==mx) return {x,z};
if(d1==mx) return {x,y};//(y,z) 优先级最高

record

T2 (盒子)#

给定 n,m,k,c,初始有 n 个盒子,第 i 个盒子有 ai 个球,有两种操作:

  • 选择任意一个盒子取出一个球,花费代价 1

  • 选择连续 m 个盒子,取出总共 k 个球,花费代价 c

求取完所有 n 个盒子球的最小代价。

1mn5×105,1ck109,1ai109

solution

T3 (数字变换)#

给定一个数字 x,初始 x=1,每次可以对这个数字进行三种操作:

  • Axx+1

  • Dxx1,条件是 x>1

  • M:选择一个正整数 k>1xkx

小树想知道,对于每个整数 n[l,r],他有多少种长度不超过 B 的本质不同的操作序列,使得 x 按顺序执行这些字符的操作后会变为 n,对 998244353 取模后。

1lr3×109,rl3×104,1B100。时限 7s

solution
posted @   HaHeHyt  阅读(594)  评论(4编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
主题色彩
主题色彩