NOI 及正式赛事题目重做

既然是重做,绝大部分是之前做过的,所以做不起反而是不应该的。正式赛事的题目和我们平时看到的各种狗屎确实是很大不同的,需要仔细察看。下面记下的是思路。

NOI2024

很喜欢 NOI 的题目!!

D1T1

题目要求 \(A_p[i]=B[i]\)。首先,必须有 \(|A_i\cap A_j|=|B_i\cap B_j|\)

考察多个下标的限制。尝试用圆圈画出来看看。我们可以做的是什么?交换两行。要让左边和右边图形上相等。这样发现条件等价于行之集合相同了,也就是每个数出现位置集合之集合相同了。这样随便扫描线一下就可以完成。好像也可以双指针。

D1T2

首先题看错了,要排序怎么可能。首先,二分可以达到最低目的。可以看出分三团可以更好一点。

基本操作应该是问一个团然后扔掉一些。相当于一个拆分。为了最小化次数,应当均分,看起来也很对,最好尝试说明一下正确性。把无限制情况的询问次数扩充到实连续函数 \(f(x)\),拆分为 \(\sum_{i\le m} c_i=x\)。若要调整 \(dx\),那么要有 \(f'(c_i)+c_i\) 全部相等。盯一下差不多有 \(1\le f'(x)\le 4/3\),那么 \(c_i-c_j\le 1/3\),相等差不多比较对了。

这样 dp 处理的话就看余下的部分如何处理。应该可以整除分块优化或者对大数手动决定。还没写 dp。

D1T3

两两均有限制是说相邻的边上下不同。而菊花图的限制是 2-SAT 问题,但是特性是二分图。如果要求强连通分量,几乎没有什么限制。

如果确定了一个边,缩掉这条边。这样做去,如果没有产生矛盾而没有直接更新的就必定合法了。这样只需要处理更新问题。我记得做法是减半警报器什么的,但是没有完成 \(O(n\log n)\)。但是如果发现可以做到 \(10^5\) 应当直接离开。

\(O(n\log n)\) 在于直接维护所有倍增数组的报警信息而非挂载每个链的报警信息。

D2T1 ??

D2T2

依稀记得之前听lxl的时候会一个启发式合并做法,现在不知道和启发式有任何联系。。。所以重新想了一下。

\((i\to j)\to k,j\in Sub(i),i\in Sub(k)\) 的过程,如果(一开始看错的)贡献是 \(f_i\to f_k\) 就太棒了。

我的 \(i,j,k\) 条件是 $dep_k\in I_j,dep_k\le \min h_{i\to j} $。很好只和 \(dep\) 有关那么从大到小扫描 \(dep\) 处理 \(k\)。这个时候 \(h_{i\to j}\) 的限制是说 \(i\to j\) 路径在允许的点连通块内,而点是逐渐被允许的。\(I_j\) 的限制则是一个点作为 \(j\) 的贡献。此时处理 \(I\) 显然是树链 \(i\) 被加,而加入允许点也是数链影响 \(i\)。那么我存下这些链,反过来做的时候说是链加 \(b\),然后区间对位加 \(b_i\times v\),至少可以线段树 \(O(n\log^2 n)\)!!

代码比较好写,大概 1.5h 就可以通过。

做完总结一下。这是从基本结构考虑 \(k\) 出发的做法。考虑 \(j\) 看起来很抽象,然而考虑 \(i\) 呢?

对于 \(i\) 考虑 \(j\) 带来的贡献。推一下得到了第一次讲的倍增的做法,懒得记录了。

另外一个奇怪的思路是似乎考虑 \(j\) 可以得到启发式合并的做法。所以这三种做法得到了联系,别的轻重儿子的似乎属于野蛮做法(,,)

D2T3

第一类点是在说只有树边和返祖边。找到另外的一类点,只需这个点子树内有且仅有一个跳出的返祖边,这个边到达的是一类点。

对于二类点不能消除一类点的限制,只是一些边说完全不能删。从下到上启发式合并,上面下来再反过来回去就可以完成这个过程。

最后全部问题在于找到一个一类点。这个不会了。

题解是说找到一个一类点的类似于广义串并联图那样(其实没有关系)的收缩方法。每次删去只有一个入度的点,删去自环,缩到了最后一个点,并且这个过程不依赖于谁是根。结束。

NOI2023

D1T1 简单

D1T2 \(m=1\) 是说答案 \(=2n-1\),而 \(k=0\) 在说考虑逐个加点的过程,当然这是有式子的。然而逐个加点的过程好处在于只需记录 \(\le k\) 个还没扫描到但是在虚树的点,这样记录哪些点在虚树就可以了。不知道可不可以更好,但是没有必要。

D1T3

\(k\le 6\) 明示容斥。链情况是简单的。

考虑返祖边,这类似于树上的区间。一个观点是这是两段区间,但是这个不容易做。一个事实是如果记录 \(f_{i,S}\)\(i\) 子树有 \(S\) 点被选了,现在考虑 \(i\) 下去的返祖边,则只与 \(LCA(S)\) 相关,因此做到了 poly。不改变 LCA 的情况只是做一些清零工作,LCA 变成自己情况也是容易计算的。

横叉边好像就比较容易了,,,横叉边是说选点必须在某两个子树中。对于横叉边 \(u,v\) 在 LCA 处统计其贡献,首先不能选这个 LCA 和它上面的东西,就在这里就死了。因此这个计算对上面的过程是无影响的。拉出挂载的所有 \(u,v\) 对它在每个子树分别建虚树,在虚树上遍历的时候就处理另一边的贡献。还需要知道完全在这个 LCA 子树外的返祖边贡献。这样就完成了。考场上实现完成大概需要更快的代码速度,,本来题不错但是代码有点长,要是只写做法就好了

D2T1 有点难,,忽略不可达情况,可以把情况化为第一类边边权为 \(0\),第二类边有边权。不可达错误贡献好像可以计算。然后设 \(f_{i,d}\)\(i\) 点到达 \(dep=d\) 的祖先的最短路再取前缀min之类,然后直接计算。感觉有点去 NOI 化,,,

D2T2

首先说是后缀数组需要满足 rk 相关的限制 \(rk_i<rk'_{i+2l}\),而还说有不能是回文串的限制 \(t_{i+l}<l\),这样直接做是 \(O(n\log^2 n)\)。然而容斥考虑就需要是回文串并且 \(rk_i<rk'_{i+2l}\) 的情况。这限制可以不直接计算,因为其比较等价于 \(rk_{i+l-1}\)\(rk'_{i+l}\) 比较,这只跟中间值有关,这样就完成了 \(O(n\log n)\)

D2T3 也是奇奇怪怪的题目,不清楚思路的来源。感觉有点去 NOI 化,,,

NOI2022

D1T1 实际上就是摩尔投票合并信息,然后判定可以采取线段树或者平衡树之类的合并

D1T2 略(?)

D1T3

D2T1 重点是相同哈希值应该贪心匹配,剩下的随便枚举即可。

D2T2

我记得 A 性质是没有用的,还容易误导人到转 01 上面去,,

B 性质是说确定了一些点值。一个直接的事情是无限制位置是递增的,并且事实上就是把等于的代价全加入直接取 min 得到。这是正确的,因为随着扫描的增加 \(\min\) 位置应当是增加的,两边都取到了最优。

C 性质是区间无交,强于 B(事实上也强于 A),然后一个区间当然应该把 \(V_i\) 放第一个,然后剩下的就是 \(\ge V_i\) 限制。

说到这里可以把任意情况变成无交情况。首先 \(V\) 大的覆盖小的,其次化开相交情况:相同 \(V\) 是全都 \(\ge V\) 的区间限制,然后 \(\exists =V\) 的限制可以直接挪到交那里去。显然若不然 \(V\) 的限制就在左侧和右侧,中间又 \(\ge V\),不如把右边的 \(V\) 聚过来。

只剩区间 \(\ge V\) 的限制(当然相当于搞到点上)。考察最优解。区间的(不妨假设)无限制的右边位置如果 \(<V\) 那么不可能做到改变;直到 \(\ge V\) 的值 \(y\)。最优解里一定有区间之取值 \(x\ge y\) 若不然可以交换。因此后面要么是不可改变的要么无影响。然后就可以直接取到 \(\ge V\)\(\min\) 取值。

D2T3 哇,好巨大

NOI2021

我请问了这是出的什么题?

NOI2020

D1T2 容斥,只允许在下断点钦定。然后线段树合并优化 dp。

D2T1 首先 \(m\ge n-1\) 我们一定有解,这是因为 \(n=2\) 时 可行,而 \(n\) 可以通过取最大次大或者最小最大(依据最大够不够)来做 \(n\gets n-1,m\gets m-1\)(突然发现好像只需要最小最大)。把关系连成边,由于每个点都不能是孤立点,而 \(n-2\) 边不能完成图的联通,因此 \(m=n-2\) 等价于分割为两个 \(m=n-1\) 情况。背包。

D2T2 首先判定 \(v\) 属于 \(grow(u)\) 的方法是如果两者只有一个为空就炸;如果 \(u\) 是单点赢了;否则如果子树状况不同就炸,相同就递归判定。上面过程知道不完备等价条件是存在一个无穷大的不可 \(grow\) 树,然后递归判定。有单点就赢。否则分左右都有,只有左边和只有右边。三种必须都有。左边右边递归。两边都有的发现严格最强是某一边只有一个点,因此照样递归即可。

这两道题目在场上看到是十分高兴的。像这样的题目不依靠什么技巧或者高级算法,思路也非常连贯,是出题的模范,要是不输出方案就更好了。

posted @ 2025-06-30 22:05  British_Union  阅读(76)  评论(3)    收藏  举报