GJOI noip_csp训练赛 大合集

posted on 2025-10-13 13:51:03 | under | source

20

A. 异或

过。

显然从最高位开始考虑,若 \(1\) 出现次数为偶数,后手须每次选取与先手最高位相同的元素,保证其为 \(0\)。那么相当于按照最高位 \(01\) 划分成两个子问题。

若为奇数,无论如何最高位一定为 \(1\),同时凑出 \(01\) 对后变成偶数情况,不可能搞出更大的了。那么后手可以强行钦定一对 \(01\),选最小的即可。拿个 Trie 维护。两只 log。

B. 方

过。

维护 \(b_i\) 表示 \(a_i\) 应该变成其 \(2_{b_i}\) 次幂。开平方时暴力拿出 \(b_i=0\) 的,将其 \(a_i\) 开方再扔回去,若 \(a_i=1\) 就直接扣掉。一只 log。

C. 括号游戏(CF1000F2)

过。

限制相当于不能有跨越 \(a_i\)\(b_i\) 的括号匹配,那么每个 \(a_i,b_i\) 独立。对于一个 \(a_i,b_i\),相当于将被其包含的 \((a,b)\) 丢掉后跑括号序列。

\(f_i\) 为长为 \(i\) 的括号序列个数,按照包含关系建出树,则 \(i\) 贡献为 \(f_{len_i-2-\sum\limits_{j\in son_i} len_j}\)

直接做比较困难,不妨时光倒流,那么只需维护 \(s_i=\sum\limits_{j\in son_i} len_j\),每次删点就将 \(s_{fa_i}\) 更新,并把儿子向上合并。用树上并查集支持删点、找父亲即可。线性。

D. 连通图(P9598 [JOI Open 2018] 山体滑坡)

相当于支持加删边,查询 \([1,x]\) 导出子图连通块个数。

双 log 做法

现场想出但没写。

首先线段树分治,解决掉时间维,同时操作只有加边、撤销。wzr 非常好心给了森林的部分分,这样只需统计要扔掉的边数,即 \(\max(u,v)>x\)。于是以 \(\max(u,v)\) 为权保留 MST 是正确的,用 LCT 即可。维护出 MST 后用树状数组统计答案。总共 2log。

也可以不用 MST,运用 P3206 [HNOI2010] 城市建设 的 trick。考虑对操作序列分治,现在考虑分治区间 \([l,r]\) 的操作,对于未被该区间涉及的操作,称为静态操作,反之区间内的为动态操作。每次往一侧分治时,加入另一侧的静态操作,最终全是静态操作。那么:

  • 钦定动态操作优先做的情况下,跑 kruskal 还是被加入的静态操作一定在最终的 MST 上,直接缩点。
  • 钦定动态操作最后做的情况下,跑 kruskal 还是落选的静态操作一定不在最终的 MST 上,直接扔掉。

如此一来,点边数都是 \(O(r-l)\) 的。总复杂度 2log。

总结:这个 cdq 分治套 kruskal 的精髓在于:将操作分为动态操作与静态操作,利用分治将动态操作变成静态操作;将动态操作边权极端化跑 kruskal,从而将传下去的点边数变成 \(O(len)\)。值得一记。

根号做法

操作分块,对于之前块的操作,考虑询问按 \(x\) 从小到大做,每次加入新的边并用并查集维护,对于本块的操作直接加入并撤销即可,可撤销并查集要带上 log。

块内操作能涉及到的点边数都是 \(O(B)\) 级别,于是可以先后用两个并查集,将之前操作形成的连通块缩点,缩点后直接跑并查集,答案就是加入前的连通块数减去该块合并的块数。log 就没咯。

总结:分块还得练,不能排斥分块做法,要多往分块上想。

21

T3 做过,其它题又很简单。直接跳过罢。

22

A. 编辑数组(ARC119C)

手玩一下,发现可以做到对两个奇偶性相同的位置 \(+1-1\),那么想到一个构造就是将奇数的值全扔 \(1\) 上,偶数扔 \(2\) 上,然后同时 \(-1\) 即可。而操作又无法改变奇偶位置之和的差,于是充要条件就是奇偶位置之和相同。

总结:可以尝试将题目中的操作组合起来,得到一个有用的新操作。

B. 石头(P10100)

考虑起点为 \(i\) 时,每个位置的访问次序。相当于对左右两边序列跑归并,根据经典结论,就是将每个数挂到其前缀最大值上,然后对前缀最大值数组归并,遍历到一个值就会接着把挂着的数都遍历了。

因此,记 \(mx_j\) 为位置 \(j\) 的前缀最大值,那么遍历到 \(j\) 时另一侧序列恰遍历到 \(>mx_j\) 的前一个位置。

对于询问,假设遍历的是 \([p,p+k-1]\),另一种情况同理。那么区间最大值 \(a_q\) 必然与 \(p\) 在同一侧(左侧),同时,需满足 \(a_{p+k}>a_q\),就合法了。

总结:这个归并排序的结论不要忘了。

C. 括号游戏2(CF1781F)

先去掉概率部分的分母,那么变成统计方案权值和。

尝试从折线的视角描述这个问题,好处是 \(+1-1=0\),所以对外界没有影响,那么 () 随便加,)( 只能接在 \(y>0\) 的位置上。

用前缀和数组刻画,相当于在 \(x\) 后面接上 \(x-1,x\)\(x+1,x\),但是不能有负数。那么构成了树的结构,每次形如给一个节点拓展两个儿子,这是容易 dp 的。记 \(f_{i,j}\) 为根权值为 \(j\) 的一棵树操作了 \(i\) 次的权值和,转移枚举第一次插入的两个儿子,系数是多重排列:

\[f_{i,j}\gets p\times f_{x,j-1}f_{y,j}f_{i-1-x-y,j}\frac {(i-1)!}{x!y!} \]

分步转移,即可 \(O(n^3)\)

总结:本题转换很灵活,关于括号序列,可以视为折线、树等等。同时,由于 \(+1-1\) 后和不变,于是用前缀和刻画是方便的,进而写成树型结构,dp 解决。

D. 区间(P10880)

本题难点在于如何给连乘状物比大小。

观察:每个值域区间的 \(f\) 不会太大,因为可以通过劈一刀的方式将 \(f\) 拆分(实际值可能更大),具体来说 \(f\ge 4\)\(2(f-2)\ge f\)。同时 \(f=1\) 显然可以并给其它区间。所以 \(f\in [2,3]\)

那么只需对二次幂乘三次幂状物比大小,化成比较 \(2^a<3^b\),由于 \(a,b\)\(O(n)\) 的,考虑对 \(3^b\) 预处理出最大的小于它的 \(2^a\) 即可。(也可以取对数比较)

考虑转移,记 \(p_i,q_i\) 为从右往左第一个 \([j,i]\) 使得 \(f\)\(2/3\),而 \(f\) 显然递增,于是 \(f_{i}\gets \max(2f_{p_i-1},3f_{q_i-1})\)

考虑如何求 \(p_i,q_i\),考虑支配点对。对于两个数,枚举 \(i\) 是最靠右的,求出包含 \(i\) 的最小左端点 \(l\),那么对 \([l,i)\) 求离 \(i\) 最近的两个数即可。三个数同理,取出离他最近的四个数,分为三种情况讨论。求出支配点对后是易处理的。

\(O(n\log n)\)

总结:这题必然是要寻找性质,需要敏锐地发现绝大多数情况下,将区间剖成几个小区间更优;比大小部分可以借鉴一下。

posted @ 2026-01-13 12:17  Zwi  阅读(0)  评论(0)    收藏  举报