大概只有比较有意思又不过分超出能力范围的题叭。
可是兔子的“能力范围” =∅ qwq。
任意一个状态可以描述为 (m,s),表示剩下 m 个·总价值为 s 的物品未选。若当前决策为 X 操作,那么由于决策的确定性,我们必然不停 X 直到出货。所以代价为
x2(nm+1),
若当前决策为 C 操作,代价则为 sm。
同时注意到,两种操作对已有卡牌集合的影响都是:随机获得一张卡。所以相同大小的卡牌集合被抽到的概率是相同的。设 c(m,s) 表示满足该状态的卡牌集数量,w(m,s)=min{x2(2nn−m+1),sm} 表示状态的转移代价,那么答案 R 满足
R=∑m∑sc(m,s)(nm)w(m,s).
DP 计算 c(m,s)/(nm) 即可,复杂度 O(n2m)。
离离原上谱了属于是。一个自然的想法是跟着当前的大佬猜,但如果两个人的对错情况是
TFTFTFTF...
FTFTFTFT...
我们就很容易比乱猜更摆烂。那么另一个自然的想法是设计一个关于正确数量/错误数量/正确率的权重函数,这里以错误数量为例,对于错了 x 个人给出的答案,视为给这一答案投出 w(x) 张票,最终我们以正比于票数的概率选取答案。经尝试令 w(x)=127⋅1.0712−x 可过,我有空一定证明正确性。(
注意题意:Richard 可以在自己家里停留任意时刻再出发,出发后才不允许停留。
问题比较复杂,答案具有单调性,可以先尝试二分答案 W 强化约束条件。Richard 受到的约束大体分为两类:在 A 时刻之前,他得保证可以在 A+W 时刻或之前冲到 n;在 [A,B] 时刻内,他得随时 on call,即前脚刚踏上一条边时接到电话,在 W 时间内冲到 n。
对于第一类约束,满足条件的点集为 V′={u∈V∣dist(1,u)+dist(u,n)≤A+W};对于第二类约束,满足条件的边集为 E′={⟨u,v⟩∈E∣w⟨u,v⟩+dist(v,n)≤W}。我们利用这两个集合等价地描述 Richard 的行动:
- 首先,通过最短路走到某个 u∈S;
- 若在 u 有“绝对空余时间”,即 dist(1,u)+dist(u,n)<A+W,就地睡觉(等价于先在家里睡觉,然后走到 u);
- 进入 [A,B] 阶段,仅能通过 E′ 内的边游走。若不得不走不在 E′ 内的边,Janet 立马打电话,Richard 就失去了爱情;否则若 Richard 坚持到 B 时刻,Janet 不得不打电话,Richard 完美到达。
可见,设 f(u) 表示从 u 开始沿 E′ 游走的最长距离,Richard 保持成功的等价条件是存在一个 u∈V′,使得 f(u)+A+W−dist(1,u)−dist(u,n)≥B。当然若存在环,f(u)→+∞ 自然合法;否则可以在 DAG 上 DP。瓶颈在于最短路 O(mlogm) 的 Dijkstra。
注意一个坑点,答案上界是 dist(1,n),但当 W=dist(1,n),至少说,我的实现无法正确判断出“W 可行”。原因在于此时“Richard 一直留在家里等电话”无法被等价模型描述。而我们可以通过加一条边 ⟨1,1,0⟩ 来很好地描述这一行动,这条边会在 W=dist(1,n) 时成为 E′ 中的环,保证了正确性。
自然地尝试寻找分治的可能。可以注意到:对于独立集 A,B,我们可以将 A,B 分别拆成两个等大的集合,然后分治处理,最终询问得到 A,B 间的连边。进而,联想到关于独立集划分的结论:图 G=(V,E) 可以被划分为 O(√|E|) 个独立集。
证明
对于结点 u∈V,若其度数 du≥√|E|,我们将其单独作为独立集;否则,在图上任意顺序遍历结点,定义结点的颜色为其邻接有色结点的颜色的 mex,显然颜色编号 ≤du\l√|E|,依据颜色划分独立集,最终得到不超过 2√|E|。 □
因此,考虑对原问题的分治:先将点集分为两份,求解各自诱导子图内的边并划分独立集,然后独立集两两进行处理。复杂度据说是 O(mlogn) 次询问,O(n√m) 的点集大小。此处没有细究。
巧妙的分治做法:设 solve(S) 表示规划从 S1 出发,任意顺序经过 S2..|S|−1,最终到达 S|S| 的合法路线,保证路线在 S 的凸包内。在 S2..|S|−1 里随机一个中间点 P,按与 →S0P 的顺逆时针关系将 S 划分为 Sa 和 Sb 递归处理,可见 Sa 与 Sb 的方案互不影响。复杂度为
T(n)=O(n)+1n−1n−1∑k=1(T(k)+T(n−k))=n(n∑k=2(1−(k−12)(k2)))=O(nlnn).
设当前站在 u 点,答案为 f(u),不妨以 u 为根,考虑让 u 沿着 (u,v) 走一个 dx,那么 df=32∑w∈subtree(v)√dist(u,w)−32∑w∉subtree(v)√dist(u,w)。显然最多一个 v 使得 df>0,此时答案要不是 u,要不就在 v 子树内。点分求解即可。复杂度 O(nlogn)。
询问可以转化为“求 0..k 对应的点是否能被包含在一条树链里”,建关于点权的线段树维护这一信息即可。弄个 O(1) LCA 可以做到 O(n)/O(nlogn)−O(logn),树链合并的细节的确很细节 qwq。
照着 qls 的课件写?没想到吧,这个得反悔贪心。
不难求出 {xn}∈{0,1}n,表示位置 i=0..n−1 需要被操作奇数次还是偶数次。接下来根据 {xn} 和 {sn} 构造方案。对于还需要被操作的 (xi,si)=(1,0)/(1,1),讨论:
-
(xi,si)=(1,0),这是最理想的情况,一步操作即可变成 (0,1)。
-
(xi,si)=(1,1),我们可以先处理完前一种情况,此时能操作的位置一定是 (0,0),显然有一个 (1,1) 与它相邻,继而,还有一个 (1,1) 与这个 (1,1) 相邻,这样才能保证 {xn} 是可行的。所以现在有形如
的情况,以此操作第 1,2,1,3 个位置即可消掉两个 (1,1),因此最坏 2n 次完成操作。
通过合法性判断方法设计 DP 状态。
对于已知序列,可用 DP f(i)=[∃ j<i,cj=ci∧f(j−1)=1] 来判合法,在计数的角度看,对于当前的 i,我们只关心有多少中颜色 c 满足 ∃ j<i,cj=c∧f(j−1)=1。因此,定义状态 f(i,j,0/1) 表示前 i 个位置,有 j 个符合条件的 c,当前序列不合法 / 合法的方案数。转移不难。
按照一贯套路,将问题简化为将两个排列分别排序。枚举已知排序算法,这里“不妨”先考虑归并,我们面临的问题是:合并两个升序的序列 A,B。首先如同归并的双指针,我们找到 A 的一段后缀 A[p:] 以及 B 的一段前缀 B[:q],满足 A[p:] 排序后在 B 序列上(下标 >|A|),B[:q] 同理。依次翻转 A[p:],B[:q],A[p:]+B[:q],即可归纳到合并 (A[:p−1],A[p:]) 以及 (B[:q],B[q+1:]) 的子问题。
记归并两个长度为 n,m 的序列的复杂度为 f(n,m),总复杂度即为 T(n)=2T(n/2)+f(n/2,n/2)。如果把 f 抽象成 f(n,m)=maxa{O(a)+f(n−a,a)+f(a,m−a)} 的话,打表出来 f(n,n) “长得像” O(nlnn),那么总复杂度是 O(nlog2n)?这里存疑,求巨巨教导 qwq。
UPD: 考虑几何抽象后的最终图形,只有 O(n) 个拐弯,每次选中间一个拐弯折回去,最多分治 O(logn) 层,每层横纵分别 O(n),故总边长 O(nlogn)。
邓老师的做法我脑补出来大概 O(n4)?实在写不下去了搞了个 O(n5) 的屑 qwq。
奶酪顺序不重要,奶酪转圈圈不太重要,甚至……奶酪跑来跑去实在是灵异。我们现在钦定没有奶酪转了完整的圈圈,并考虑 n−1 对“奶酪-老鼠”的匹配,也就是说,n−1 块奶酪在圆上画出了 n−1 段圆弧。现只计算第 n−1 只老鼠没吃到奶酪的概率 R,枚举经过了 −0.1 位置的圆弧数量 x,以及初始时每条弧放上有多少奶酪弧的起始点 ⟨cn⟩,有
R=12∑x≥0∑⟨cn⟩,∑c=n−1[(n−1c0,c1,⋯,cn−1)n−1∏i=0pcii][2−xn−2∏i=0(1−2i−x−∑j≤icj)].
其中系数 12 是因为奶酪可以疯狂转圈圈再被吃掉,算重了 1+12+14+⋯=2 次。无穷级数不好弄,我们尝试整理式子,令 z=2−x,整理 ∑x≥0 后面的式子:
f(z)=∑⟨cn⟩,∑c=n−1[(n−1c0,c1,⋯,cn−1)n−1∏i=0pcii][zn−2∏i=0(1−2i−∑j≤icjz)].
那么
R=n∑i=0[zi]f⋅∑x≥0(2−x)i.
后面就等比数列求和啦。算一次 O(n4),所以算出 n 个答案的复杂度是 O(n5)。
令 f(i) 为从 i 出发的期望最优收益,f(k)=f(kmodn),显然
f(i)=max{ai,f(i−1)+f(i+1)2−bi}.
取到最大 ai 的位置有 f(i)=ai,我们把它转到 f(0),破环成链。接下来,联想到 f(i)=max{ai,f(i−1)+f(i+1)2} 所描述的上凸壳形式,配凑常数列 ⟨dn⟩,令
f′(i)=f(i)−di=max{ai,f′(i−1)+f′(i+1)2}−di.
那么 di−1+di+1=2bi。可以令 d0=d1=0, di=2(di−1−bi−1)−di−2 (i∈(1,n])。此后,单调栈求出点集 (i,ai−di) 的上凸壳,计算 x=0..n−1 的纵坐标之和的平均数即为答案。复杂度 O(n)。注意尽量采用整数运算减少浮点误差。
当邓老师用锦囊这个意象去描绘 DP 的时候,他是这个世界上最伟大的诗人。 —— 毕飞宇《我读<时间简史>》(大雾
还是通过合法性判断的方法设计 DP 状态,这道题真的神仙。
如何判断一个序列是否奇妙呢?注意到 k 很小,可以暴力一点——枚举一个锦囊序列 S,S 是 0..m−1 的排列。初始时,令奇妙整点 P=(−1,−1,⋯,−1),依次扫描序列。当 P 与扫描到的整点 Ai 失配时,依次打开锦囊,不妨设当前打开了锦囊 Sk,那么令 P(Sk)←A(Sk)i,可见 P 能与 Ai 匹配了,继续扫描。若不存在锦囊序列使 P 完成匹配,则显然原序列不奇妙。换句话说:原序列奇妙,等价于存在这样一个锦囊序列。
受此启发,设计 DP 状态:令 f(i,S) 表示考虑从 Ai 出发开始匹配,锦囊序列为 S 时,锦囊序列非空前缀决定出的 P 的失配位置序列。(注意 A 下标从 1 开始,S 下标从 0 开始。)
一个栗子 awa
若 A=⟨(1,1,4),(5,1,4),(1,9,1),(9,8,1),(0,0,0)⟩,S=⟨0,1,2⟩,那么 f(1,S)=⟨2,4,5⟩,失配时对应的 P 分别为 (1,−1,−1),(1,1,−1) 和 (1,1,1)。
考虑转移,对于
f(i,S),我们出门必用
锦囊 S0,而我们希望找到一个与
f(i,S) “相似”的
f(i+1,S′)。可以先把
S0 丢到最后得到
T,考虑
f(i+1,T) 中,可能存在一个失配位置
p,满足
A(S0)i=A(S0)p,可以发现,如果把
p 失配后使用的
锦囊替换为
S0,那么
p 失配后,两个
锦囊对应的
P 变得一样了,失配位置自然也是一样的,这样就能完成转移。如果不存在这样的
p,就先将就着用
f(i+1,T),但是删掉最后一个失配位置(
S0 重复使用没有意义)。
最后,ri=maxS{f(i,S)m−1} 即为 i 开始最远端的奇妙序列右端点。复杂度 O(nk!k)。
令 f(u,i∈{0,1,2,3}) 表示 u 下挂了长度为 i 的链时,u 子树内部的最大和。合并时,f(v,0) 和 f(v,2) 可以匹配,f(v,1) 和 f(w,1) 可以匹配,匹配的选取过程可以用背包描述。令 gu(i,j) 表示(处理 u 的 DP 信息时,)选的 f(v,0) 数量与 f(v,2) 数量之差为 i,f(v,1) 数量奇偶性为 j 是的最大和。最后真正需要的 gu(i,j) 满足 i∈{−1,0,1},根据经典 trick,shuffle 孩子们,然后限制 i 这一维绝对值不超过 √n 即可。复杂度 O(n√n)。
不难证明:2m 件物品可以分为两组,每组 m 件,且质量和之差不超过 n。令 f(k,w) 表示所求答案,构造如下递归方式:
f(k,w)={maxi∈[1,n]{f(k−1,w−i)+ai},2∤kmaxd∈[−n/2,n/2]{f(k/2,w−d)+f(k/2,w+d)},2∣k.
可见仅会涉及 log 个 k,且 k 一定时,w 的取值在一个较小的区间内,大力记忆化即可。
暴力 DP,令 f(i,j,k) 表示还要接待 i 个客人,当前所考虑的服务员手上还有 j 天的工作,前面还有 k 个服务员先于他接客时,被这一服务员接待的客人的等待时间之和。可知转移式为
f(i,j,k)={(1−p)f(i−1,max{j−1,0},k)+pf(i−1,max{j−1,0},k−1),k≠0(1−p)f(i−1,max{j−1,0},k)+p[f(i−1,j+d−1,m−1)+j],k=0.
注意 i 维和 k 维的大小是固定的,但是 j 显得比较特殊——因为 p∈[0.4,0.6],当 d 较小时,服务员很难积累到较大的 j;当 d 较大时,服务员将处于无休状态,此时再令 j←j+t 时,服务员接待的客人全部都要等待 t 天,所以 Δf=tg(i,k),其中 g(i,k) 表示还要接待 i 个客人,当前所考虑服务员前面还有 k 个服务员先于他接客时,这一服务员期望接待的客人数。因此,我们设定一个阈值 S,钦定有
f(i,S+j,k)=f(i,S,k)+jg(i,k).
经邓老师分析,S 取 1500 是足够的。复杂度为 O(nSm)。
离线扫描线维护线段树求出一个盒子内的糖最后一次在上下界横跳的地方,就能直接算答案了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现