2024 1/2 成七训练

道路(road)

竞赛图三元环计数,答案为 C(n,3)i=1nC(du(i),2)

扫描线维护出度就好了。

图(graph)

考虑最优解是一个森林。

我们想到转到网络流维护。

尝试将图上点随机染色,白点连 S,黑点连 T,之间的边互连,这样网络流就能找到最优解。

正确率为 1(112k)w

拼图(jigsaw)

考虑对于每个点对 (a,b) 算出有多少对 (i,j) 途径了这个状态。

考虑倒退,从 (a,b)(a,a+b)(a+b,b)

这东西类似 S-B-T,可以生成所有的 ai+bjn(i,j)=1

后面就是推式子了。

钥匙(key)

等价于找半平面集,使得交全为给出的点。

找出凸包。

根据皮克定理判断即可。

排列蛤蟆(hammer)

操作不影响逆序对个数。

猜测逆序对相同且 (1,n) 相对位置相同的对可以两两转换。

推性质:若存在 (a,n,b),若 a<b,则可转化成 (b,a,n);否则有 (n,b,a)

性质:存在 O(n2) 次操作,使得操作后 1n 在序列最右。

证明:

首先有 1,n 的相对顺序不变。

假设 1n 左,对于 n 考虑,当其转向时,发现 min(a,b) 下降,则 n2 次操作后,1,n 相邻,然后通过 (1,n,a)n 交换到右侧。

再是 1n 右,对于 1,当其转向时,max(a,b) 上升,则 n2 次操作后,n,1 相邻,然后通过 (n,1,a)1 交换到右侧。

证毕。

我们考虑将 a,b 交换成等价类中的一个序列上,类似于双向搜索。

考虑对 a,b 都按照一种顺序,要么同时将最小值换到最后,要么同时将最大值换到最后。

考虑将最小/最大同时换到最后,然后划分成 n1 的子问题。

a,b1,n 的相对顺序不同,那么由 a,b 有解可以推出 ab1,n 的顺序可以交换(后面详细证。

假设当前是 n1 左,要交换(n1 右同理)。

先将 1 换到最右。

再将 n 换到次右(若 n2 左,则递归计算子问题,即交换 2,n 的顺序)。

此时假设有 a,b,n,1,?

a<b,?>n,可操作;

a<b?<1,可操作;

a>b,考虑利用前面的数得到 a<b

  • c<b<a,可操作;
  • b<c<a,可操作;
  • c>a,递归处理

发现若无法交换,则这整个子序列是完全逆序的,ab 就无解。

这样就做完了。

AT_joisc2017_d 切符の手配 (Arranging Tickets)

有点省选的味道了。

考虑先定向 min(ai,bi)max(ai,bi)

再考虑翻转,当两个区间无交时,不能同时翻转。

则所有翻转区间交不为空,设为 [l,r]

考虑二分答案 lim

考虑枚举 t[l,r]bi 为翻转后的计数,zi 表示含 i 的翻转区间数。

则有 bi=ai+(ztzi)zi,根据 bilim,有 ai+ztlim2zizt

考虑贪心从前往后 i[1,t] 满足条件,显然为了让 [x+1,n] 满足条件,选择的区间右端点应尽量大。

于是从 i 向右做扫描线,每次加入 i 的可选端点,贪心选择可选区间中右端点最大的区间,取到下界即可,最后在判断 [x+1,n] 是否合法,时间复杂度 O(n3logmlogV)

性质:在最优解中,设 tmaxi[l,r]bi 的下标,有 |S|=0btmaxi=1nbi1

证明:若 btmaxi=1nbi2

  • 若存在翻转区间 [l,r],则再翻转 [l,r]bt 加一,maxi=1nbi 减一,这种情况不可能是最优解,舍。
  • 否则分别存在以 l 为左端点和以 r 为右端点的不同区间,都翻转,bt2maxi=1nbi 要么变成 bt,要么不增,不断调整,若最后有 |S|2,由于不存在区间 [l,r],所以 |S|=2,继续删除,得到 |S|=0

那么现在 zt 的枚举量是 O(1) 的。

性质:对于 t,同时有 at=maxi=1nai

证明:设 y[l,r],且 ayat1,又由上有 btby1,则 aybyatbt,与假设矛盾。

那么现在 at 的值域是 O(1)

性质:最优解包含所有的 ai 的最大值的位置。

证明:设 [L,R] 分别表示 ai 的最大值的最左和最右位置,假设有 L<lr<R,则若存在将要翻转区间不包含 L,若翻转了就会变劣,R 同理。

于是 at 的枚举位置是 O(1) 的。

时间复杂度 O(nlognlogV)

矩阵(matrix)

这不是gdkoi?

首先这东西有循环节,然后一个点被操作 2k 后只会产生一个十字(五个点)的影响。

找出循环节,倍增加速即可。

修公路(road)

相交的弦连边,每个连通块构造菊花图(很妙,。

可以线段树优化建图。

序列(sequence)

1705577595316

类似维护最大子段和搞一搞就好了,不写。

重振旗鼓(cheer)

显然有确定链端点时的 O(nlogV) 的做法。

考虑一叶子,先做一遍以它为端点的情况,此时他不再是端点,维护一个 X,表示已删叶子的 gcd,将这个叶子删除,然后 Xgcd(X,au)

考虑优化,发现,当 gcd(X,au)=X 时,au 直接删就行了,不需要做算法。

于是执行算法的次数是 O(logV) 的,于是总时间复杂度 O(nlog2V)

惊鸿照影(memory)

二分答案,相当于求圆内交点个数,映射到圆上,就是个二位偏序问题。

明月来归(return)

离线,显然 O(nm)

在线,随便维护。

女巫(witch)

好题。

赛时没想清楚关于求和在取第 k 位的问题。

拆位,权值相当于前缀异或后 1 的个数乘上 0 的个数。

考虑维护虚树,显然,只会在每个子树内取一个点。

fu 表示以 u 为根的虚树个数,gu,0/1 表示以 u 为根的所有虚树从根往下一层异或和为 0/1 的方案数,hu 表示答案。

考虑 u 的儿子 V 的合并,其中 e(x,y,k) 表示 disydisxk 位的值。

fufu×(1+vsub(V)fv)gu,0gu,0×(1+vsub(V)fv)+fu×vsub(V)gv,e(u,v,k)gu,1gu,1×(1+vsub(V)fv)+fu×vsub(V)gv,e(u,v,k)1huhu×(1+vsub(V)fv)+gu,0×vsub(V)gv,e(u,v,k)1+gu,1×vsub(V)gv,e(u,v,k)+fu×vsub(V)hv

abk 位为 1b 在两端区间内。

考虑加速,线段树合并即可。

生成树(tree)

求边集 E 的 MST,可以将 E 分成若干子集,分别求 MST 得出边,再用这些边求 MST。

考虑点分治优化这个过程,容易发现,每个分治中心将将子树划分为若干个连通块,这一层分治中需要考虑的就是合并这些连通块;发现这个过程类似 boruvka,所以直接用 boruvka 求出合并这些连通块可能用到的边,然后在外层将这些可能用到的边进行一次 kruskal 即可做到 O(nlog2n)

在一个分治中心,从根开始维护前缀和 dis,则要求使 |disu+disv| 最小的 v

disu,disu 放在一起排序,答案就是不同子树的前驱后继。

子树太多不好做。

考虑上边分治,就做完了。

字符串(string)

循环同构经典问题不讲。

找规律,只需要求 ab 内部的答案以及 abbabb 跨过中间的答案。

系数可以矩乘维护。

posted @   蒟蒻orz  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示