NOIP 前做题

CF1439B Graph Subset Problem

对于二可以用一个经典的求 k-core 的算法,每次拓扑删除那些度数小的点。然后到了 \(k\) 的时候我们就直接看一下是不是全部被删光了即可。

关于第一个求团。我们发现一个大小为 \(k\) 的团在不存在 k-core 的情况,这些点都必然是 (k-1)-core 中的点。于是我们对于每个在求 \(k-1\) 的时候求出来的点遍历它所有连接的点,然后判断是否是团。这个单次操作是 \(O(k^2)\) 的。

但是,实际上 k-core 点的个数是 \(O(m/k)\) 的级别的,这意味着求团的复杂度为 \(O(mk)\)。然后,团的边数应该在 \(O(k^2)=O(m)\),也就是说复杂度是 \(O(m\sqrt{m})\)

具体操作时,我们维护一下 deg,然后用 unordered_map 作邻接矩阵。本人曾经使用过 unordered_set 来代替 vector 和 deg 存邻接表,然后被卡常死了。然后数据中还存在卡 unordered_map 的数据……

https://codeforces.com/contest/1439/submission/131558660

CF1340D Nastya and Time Machine

考虑其欧拉环游序。每一次一个点出现,它必然是不同的时间。可以得到理论下界为 \(D=\max \deg(u)\)。实际上这个下界可以达到。考虑钦定每个点出来的时间是进来的时间 -1。这是可以构造完成的。遍历的时候,如果一个点加到 \(D\),就穿越到 \(D-\deg(u)\)

https://codeforces.com/contest/1340/submission/131561302

CERC2014 Outer space invaders

时间离散化,然后对时间做区间 DP。考虑一个区间 \(f(l,r)\) 的全部被杀死的方法。容易知道这个区间中距离最远的一定被直接带走。(注意,一定是被完全包含的那一个,否则会被更大的区间统计到)所以我们枚举带走他的时间。

https://codeforces.com/gym/100543/submission/131607895

CERC2017 Justified Jungle

存在 \(k\) 的解相当于子树大小为 \(\frac{n}{k+1}\) 倍数的个数为 \(k+1\)。于是对于一个子树我们更新即可。

https://codeforces.com/gym/101620/submission/131608594

COCI2019.12 Sob

首先题面说了对于任意 \(n,m\) 都可实现,所以考虑递归求解。

找到 \(A\) 中最大的数,设其为 \(u\);我们暴力找到 \(B\) (设其为区间 \([l,r]\) ) 中最小的 \(v\) 与其匹配。可以证明,\(B\)\([l,v]\)\(A\)\([u-v+l,u]\) 区间都能一一顺次匹配。于是就能转化为更小规模的问题了。

https://loj.ac/s/1271785

AGC043B 123 Triangle

很人类智慧。首先全体 -1,这样保证数字都在 0~2 之内。

然后首先 \(0\) 对答案没有影响。看 \(1,2\)

考虑设一个数的被计算次数为 \(c_i\),表示这个数在运算中出现了多少次(算正负)。

  • \(1\) 算了奇数次:那么答案必然为 \(1\) (必然为奇数)。
  • \(1\) 算了偶数次:那么答案为 \(0\)
  • \(1\) 没有出现且 \(2\) 算了奇数次:那么答案为 \(2\)(加减偶数次的话变化一定是 \(4\) 的倍数,也就是加减 4,所以为 \(2\))。
  • \(1\) 没有出现且 \(2\) 算了奇数次:那么答案为 \(0\)

至于如何算出现次数,第 \(i\) 位会被算 \(\binom{n-1}{i-1}\) 次。\(\binom{n}{m}\equiv 1 \pmod 2\) 的充要调键位 \(n\&m=m\)

https://atcoder.jp/contests/agc043/submissions/26519645

CF1322B

考虑影响第 \(k\) 取值的东西。考虑 \(b_i=a_i\%2^{k+1}\),则 \(a_i+a_i\) 在第 \(k\) 位为 \(1\) 当且仅当他们的和 \(\in [2^k,2^{k+1}-1]\cup [2^k+2^{k+1},2^{k+2}-2]\)。two-pointers 扫一下即可。注意数对无序所以/2。

https://codeforces.com/contest/1322/submission/131726261

CF1379C

有种被 div2 反杀的奇怪感觉……

首先显然一定是一堆同样 \(b\) 加上一些 \(a\) 的形式。那么枚举这个 \(b\) 是啥,然后看 \(a\) 选哪几个即可。二分出比 \(b\) 大的最小的 \(a\)

https://codeforces.com/contest/1379/submission/131731985

CF1410F

一开始看错题了……不过无论有没有看错题这题都挺简单的。

维护一棵线段树。设一个点的高度为这个点的区间长度对 \(2\) 取对数(叶节点深度 \(0\) 其他为子节点深度 \(+1\))。然后每个点维护一串标记,\(t_{u,i}\) 表示 \(u\) 子树中高度为 \(i\) 的点需不需要交换自己的两个子节点。这个标记是容易执行容易下放的。复杂度 \(O(n\log n+q\log^2n)\)

HAOI2015 树上操作

打个树剖板子。

https://loj.ac/s/1278245
https://codeforces.com/contest/1401/submission/131737140

BJOI2015 骑士的旅行

树剖+线段树,线段树中维护线段树上区间前 20 大,由于一个点会有很多骑士,于是线段树的叶节点同时维护一个 multiset 记录该节点所代表的节点上的骑士,然后到叶节点的时候根据该 multiset 暴力重构叶节点的前 20 大即可。

https://hydro.ac/d/bzoj/record/616a5d40cf7da6892ab4b4ce

SCOI2005 王室联邦

按照 \(B\) 的块的大小先给树分块。考虑对于一个子树的根节点,它要连接一些子树并作为其省会。容易发现这样的话最大的省的大小 \(<3B\)

https://loj.ac/s/1275180

LOJ113 最大异或和(线性基板子)

注意 1ll!!!

https://loj.ac/s/1278251

HAOI2015 树上操作(树剖线段树板子)

https://loj.ac/s/1278245

LOJ103 子串查找(KMP 板子)

https://loj.ac/s/1278263

LG5357 AC自动机(AC自动机 板子)

快读一定要注意在读入前排掉非合法字符!!!

https://www.luogu.com.cn/record/60435071

LG3834 主席树(主席树板子)

注意叶子结点也需要连历史版本的边!!!

https://www.luogu.com.cn/record/60445307

LOJ124 除数函数求和(线性筛板子)

\[\sum_{i=1}^{n} \sum_{d|n} d^k=\sum_{d=1}^{n} \lfloor \frac{n}{d} \rfloor \]

线性筛自然数幂即可。

https://loj.ac/s/1278662

LOJ125 除数函数求和2(数论分块板子)

\[\sum_{i=1}^{n} \sum_{d|n} 2d^2+3d+5=\sum_{d=1}^{n} \lfloor \frac{n}{d} \rfloor (2d^2+3d+5) \]

区间的 \(2\sum d^2\)\(3\sum d\)\(5\sum 1\) 是好算的,上数论分块。

https://loj.ac/s/1278686

posted @ 2021-10-12 06:50  LarsWerner  阅读(36)  评论(0编辑  收藏  举报