算法竞赛复健记录

高三学了一年文化课感觉已经不会算法竞赛了,开个博客记录一下复健历程。

CF1662F

题意:有 n200000 个点,每个点有能量 pi,消息能从 i 传到 j 当且仅当 |ij|min(pi,pj),求消息从 a 点传到 b 点至少需要经过几个点。

考虑把点按 pi 降序依次插入某个数据结构 S。当 i 要插入的时候,将 i{jjSipiji+pi} 里的点连边。这里选择可持久化线段树作为 S,用线段树优化建图的方式连边。时空复杂度是 O(nlogn),但是由于实现得不好 MLE 了。

题解的一种做法比较巧妙,直接用线段树优化了 BFS 的过程。本题相当于每条边长度是 1,所以 BFS 时让每个点只访问一遍就可以保证正确性和时间复杂度。对当前 BFS 到的点 i,它能走到 j 当且仅当 j[ipi,i)ij+pj,或者 j(i,i+pi]ijpj。对前一情况,用一个支持单点修改、查询区间最大值的线段树 S,令每个 Sj=j+pj,当从 i 能走到 j 时,即 S.max[ipi,i)i,就把 j=S.argmax[ipi,i) 从线段树里删去,并将 j 加入 BFS 的队列。后一情况同理。这样的时间复杂度是 O(nlogn),空间复杂度是 O(n),常数也小,不会 MLE。

CF1765J

题意:有一个 n×n 的矩阵 c,其中 ci,j=|aibj|,有两种操作:

  1. 将矩阵一行或一列的的元素减去(加上)x,代价为 xx
  2. 将矩阵一个位置的元素减去 x,代价为 x,要求 x>0

求将该矩阵所有元素变成 0 所需的最小代价。

设第 i 行做了 pi 的操作,第 j 列做了 qj 的操作(pi,qjR)。我们希望最大化 i=1n(pi+qi),因为操作 1 显然比操作 2 更优。这可以写成一个线性规划问题:

maximizei=1n(pi+qi)subject topi+qjci,ji,j

考虑其对偶问题:

minimizei,jλi,jci,jsubject to1=jλi,ji1=iλi,jjλi,j0

可以只考虑 λi,j{0,1} 的情况。这相当于从 c 的每行每列选恰好一个元素,即选出一个排列 p,使得 ici,pi=i|aibpi| 最小。显然选择 a,b 同序的排列最优(即,选择的排列满足 aiajbpibpj),那么将 a,b 排序即可。

QOJ1643

写成线性规划问题如下:

maximizei=1npiaisubject to|aiai1|1a0=an+1=0ai0

转为对偶问题:

minimizei=1n+1|ci|subject toci+1cipi

fk(x) 表示当 ck=xi=1k|ci| 的最小值,那么有转移

f1(x)=|x|fk(x)=|x|+minypk1xfk1(y)

再令 gk(x)=fk(xi=1k1),有转移

g1(x)=|x|gk(x)=|xi=1k1pi|+minyxgk1(y)

g 的转移可以用 slope trick 优化,时间复杂度 O(nlogn)

值得一提的是,直接在原问题上转移会得到一模一样的做法,见:https://codeforces.com/blog/entry/90956?#comment-794463

CF GYM 103107 I

博弈论

参考 Sprague–Grundy theoremNimber

  • 公平组合游戏等价于(等价的定义见上述链接)一个 Nim 游戏
  • Nim 游戏中,状态 x 可以到达的状态集合为 S,则 SG(x)=mex{SG(y):yS}
  • Nim-和(相当于对 Nim 游戏做笛卡尔积?)具有交换律结合律。
    a+b={a+b:aa}{a+b:bb}
    SG(a+b)=mex({SG(a+b):a<a}{SG(a+b):b<b})=SG(a)xorSG(b)

平衡树

做题的时候需要写一种平衡树,支持比较两个元素的序关系,于是想到了后缀平衡树用的那种将节点映射到实数上的写法,可是已经看不懂自己写的代码了...

现在看懂了,当时用 fhq-treap 实现的,为了维护元素到实数的映射,插入元素的时候不能 split 再 merge,而是要找到插入的位置,然后把那个子树的映射重构。这样做的复杂度期望是 O(nlogn) 的,因为每个元素只会被其祖先重构,而 treap 的树高是由随机性保证 O(logn) 的。

Tarjan 算法求强连通分量

更新 low 的时候注意:搜索到横叉边的时候,如果点在栈中则要更新 low,这里的栈不是 dfs 搜索栈,而是维护所有 还未确定所属强连通分量的点 的栈。

线性规划

Lagrange 对偶

最优化问题

minimizexXf(x)subject tog(x)0

其中 f:XR 是目标函数,g:XRc 是约束函数。该问题的拉格朗日对偶是:

maximizeλRct(λ)=minxX[f(x)λg(x)]subject toλ0

注意到有 t(λ)=minxX[f(x)λg(x)]f(x),因此 t(λ) 给出了 f(x) 的下界,而对偶实则是最大化该下界。

线性规划对偶

maxx,y,zcx+dy+fzdualminλ,η,μpλ+qη+rμs.t.Ax+By+Czps.t.λ0Dx+Ey+Fzqη0Gx+Hy+Jz=rμ freex0Aλ+Dη+Gμcy0Bλ+Eη+Hμdz freeCλ+Fη+Jμ=f

线段树上二分

ac-library 及其 文档,写法是 zkw 线段树。

二分图匹配

Theorem (Hall's marriage theorem). A bipartite graph with n vertices on both sides has a perfect matching if and only if for every subset S of vertices on the left side, |N(S)||S|. Here, N(S) is the set of vertices on the right side that have an edge to one of the vertices of S.

最大点权匹配:求二分图的带权最大匹配,其中只有一侧点有点权。做法:将点按点权排序,贪心地依次尝试增广(使用匈牙利)。

最大边权完美匹配:设 xi 表示第 i 条边是否在匹配中,ci 表示边权。相当于求 xici 的最大值(在 x 构成匹配的约束下),写成对偶问题为求 hi 的最小值,其中 hu+hvcee=(u,v),这里的 h 称为顶标。根据互补松弛定理,hu+hv=cexe=1.

QOJ9372

S 的前缀函数为 π,记 Πi={πk(i):kN},其中 π0(i)=i,πk+1(i)=π(πk(i))。所求为 i=1nAijΠi0Bij+1

fi=jΠi0Bij+1,考虑如何转移。

注意到 Πi={0}C,其中 C{x+1:xΠi1}。我们记 Fi={x+1:xΠi1}C,那么 fi=fi1xFiBix+1
更进一步,若 π(i)=πk(i1)+1, 那么 Πi={0}Ti,其中 TiRi={πr(i1)+1:rNrk}。现在考虑 RiTi,可以发现 RiTi=Fπi。于是我们就得到了 Fi={πr(i1)+1:r>k}Fπi

按上述方法维护 Fi,复杂度应为 i=1n|Fi|。注意到 |Fi||Πi1||Πi|+1,因此 i=1n|Fi|n

Other CP Resources

See https://t.me/CP_resource.

posted @   Ancker-0  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示