2020 集训队作业 - 第一部分

脑子好像还是不好使,做题全靠题解 /kk

不会的题越来越多了 /kk

计算几何怎么这么多啊 /jk /px ,标有“计算几何”或是“跳过”的题就先不管了,最后题数不够再回来。

标有“口胡”字样的不保证正确性,有可能没有看过题解

口胡题目就像吃东西,口胡完再补代码就像把吐出来的东西又吃回去……

现在才发现NEERC等比赛都公开了官方数据的是不是可以去世了……

已经凑够 135 道题了,不出意外的话被咕掉的题就是永久咕了。

A (WF 2014) : A B C E F G H I J K L
B (WF 2015) : B E G H J K L M
C (WF 2016) : A B D F H I J K M
D (WF 2017) : A B D G H J K L
E (WF 2018) : C D E G H I J
F (WF 2019) : B C F G I J K
G (NEERC 2017) : F G H I J K L
H (NEERC 2016) : B C D G I K L M
I (NEERC 2015) : B C D H I J K L
J (NEERC 2014) : C D E G H I
K (NEERC 2013) : A C D E G H I K
L (CERC 2017) : B C D E I K L
M (CERC 2016) : B D E G I J L
N (CERC 2015) : C E F G I J L
O (CERC 2014) : A B E G J K L
P (CERC 2013) : A D E G H J
Q (NEERC,NSub 2017) : C D E F G H J
R (NEERC,NSub 2016) : B D E G H I J
S (NEERC,NSub 2015) : D F G I K
T (NEERC,NSub 2014) : C E F H K
U (NEERC,NSub 2013) : C H I J L

——抄自兔队

试题一 完成情况 试题二 完成情况 试题三 完成情况
UC 独立完成 DG 独立完成 RB 独立完成
HC 独立完成 IB 独立完成 FJ 独立完成
GK 独立完成 UH 独立完成 QH 独立完成
EE 参考题解 DJ 参考题解 IH 独立完成
HL 独立完成 MI 独立完成 EJ 不会
MB 独立完成 UI Itstddw ED 做过
AA 参考题解 BG 参考题解 ML 独立完成
CF 独立完成 TE 独立完成 QG 参考题解
PH 独立完成 UJ 独立完成 BB 参考题解
CI 参考题解 SD 独立完成 NG 独立完成
DK 参考题解 LD 独立完成 IJ 独立完成
NC 参考题解 BJ 独立完成 FK 独立完成
CH 计算几何 NJ 独立完成 RH 不会
QF 独立完成 BE 独立完成 KI 降智
AC 独立完成 PG 参考题解 HM 独立完成
PJ 独立完成 ID 独立完成 EG 计算几何
SI 独立完成 KC 独立完成 GI 独立完成
OG 参考题解 CK 独立完成 DB 独立完成
QE 独立完成 GH 参考题解 NI 独立完成
OL 独立完成 KA 独立完成 MG 参考题解
SG 独立完成 NL 独立完成 KH 独立完成
QJ 独立完成 KG 独立完成 AB 独立完成
KD 独立完成 IL 独立完成 NF 独立完成
CM 跳过 NE 参考题解 HD 做过
DH 参考题解 EC 参考题解 BM 独立完成

别问,问就是抄兔队的

UC

预处理 \(s\) 中每个子串的所有出现位置,以及 \(s,t\) 的哈希值。

枚举替换 \(s\) 的哪个子串,那么通过 \((m-n)/cnt\) 即可得到替换后的长度,也就知道了要变成 \(t\) 的哪个子串,最后用哈希判一下即可。注意开 mapunordered_map 存子串编号会因为元素太多而暴毙,只能 sort 。复杂度 \(O(n^2\log n)\)

提交记录

DG

如果没有奇怪翻转操作,那么无脑回退做到 \(O(n^3)\) 是很简单的。

眼光不要太长远,只考虑最后一步。如果最后一步翻了,那么一定无法回退到一个合法的上一步,并且可能的翻的位置是唯一的。

所以先尝试回退,如果成功就继续;否则,回退时卡住的一行一定是翻转的位置所在的行,只需要分别从上下做到这一行,就可以求出真正的位置。如果这个位置不存在就输出。

复杂度 \(O(n^3)\)提交记录 (代码极丑警告,不过总算一次过了)

RB

称环中长度至少为 2 的极长连续段为有效段,设有 \(l\) 个。显然每个有效段的端点会给 BG 分别贡献 1 。对于剩下的点,有 \(a\) 个只和 B 相邻,\(b\) 个只和 G 相邻。通过输入容易解出 \(a,b,l\)

先判掉 \(l=0,a=b=0\)

如果 \(l=1\) 那么一定有 \(a\ne b\) ,构造就像样例那样。

如果 \(l\) 为偶数那么放一堆 BBGG ,然后在 BB 之间可以搞掉 \(a\)GG 之间搞掉 \(b\)

否则假设 \(a\ne 0\) ,那么放 BBGGBBGG..GGBBG 然后仍然在 BB, GG 之间搞掉剩下的 \(a,b\)

提交记录

为什么集训队 rank 1 的作业难度也就这样啊,是不是真的 150 道题均匀随机啊 /fad

HC

考虑树怎么做。从下往上合并,保证子树内只有根颜色是 1 ,其他都是 4 。合并一个儿子的时候把儿子颜色改成 3 ,连上,再把 3 改成 4 。

考虑环怎么做。 一个一个合并,保证链头的颜色是 1 和 2 ,其他是 4 。合并一个点的时候把这个点改成 3 ,连上,再 \(2\to 4,3\to 2\)

建出圆方树,圆点方点分类讨论一下即可。提交记录

IB

显然有 \(\mathrm{lowbit}(10^k)=k\) ,所以答案位数不超过 5000 。猜想位数并不是太多。

从小到大枚举,一个数可以被看做最高位和其他位拼起来,而其他位组成的数必须是合法的,且这个合法的数的下一个 1 要大于最高位。

于是枚举即可。实践证明 \(n=10000\) 时答案只有 161 位。

提交记录

FJ

直接枚举每个选手,求出其他选手的折线与他的折线的交点,然后暴力即可。

有点细节,写起来非常要死。

提交记录

GK

由于 \(n\le 64\) ,所以可以想到 \(n\le 42\) 的时候直接冲 meet in the middle ,复杂度 \(O(2^{n/2}n)\)

\(n\) 更大的时候,由于 \(q\) 不算太大,而 \(a_i>\sum_{k<i}a_k\) ,所以 \(a_1\le q/2^{n-1}\le 2^{22}\) ,可以枚举 \(a_1\) 。注意 \(\gcd(r,q)=1\) ,所以 \(a_1\) 的 2 的幂要等于 \(b_1\) ,设为 \(2^k\)

有了 \(a_1,b_1\) 即可算出 \(r\)\(2^{64-k}\) 的值,所以再枚举一个 \([0,2^k)\) 表示 \(r\) 的最高位。然后 \(r\) 知道了就可以判断求出的 \(a\) 是否合法了。求逆元可能要 __int128

总复杂度 \(O(2^{n/3}n)\)提交记录

UH

显然字符串没有啥用。就是给了两组集合,要在里面选一些,使得覆盖了所有点。

所以是二分图最小点覆盖模板题。输出方案直接放弃思考写了 2-sat 。这也能调一年

提交记录

QH

冷静分析一下会发现,每棵树大体上还是用贪心删叶子的策略,而那些删不掉的叶子或是多出来的根就用别的多出来的根补掉。

所以把树排序,把根已经被匹配了的放前面,根没有被匹配的按多余叶子个数从大到小排序。1 如果没有匹配就也当叶子处理。

然后扫一遍贪心补前面的叶子,再扫一遍把没有匹配的根两两匹配。

提交记录

EE

计算几何 + BFS 二合一。只要会暴力判断两个点之间能否一步到达就做完了。

暴力判断的时候还要推一堆式子来求各种速度,放弃思考直接去膜 txc 题解。

然后各种 sb 错误调了 1h 。

提交记录

DJ

先不管 \(v\) ,把 flubber 看做另外一种水,最后给答案除掉 \(v^a\)

对于两种水不能反向流的限制,可以先忽略掉,然后每次找到一条不合法的边,用退流的思想把它变成合法的。

考虑一个 \((F,W)\) 何时才是合法的。分别跑出 \(F\)\(W\) 独立的上界,再跑出 \(S=F+W\) 的上界,那么可以证明满足这三个上界的 \((F,W)\) 都可以构造出方案。

证明:

可以发现 \((F_{max},S-F_{max})\)\((S-W_{max},W_{max})\) 是合法的:以 \((F_{max},S-F_{max})\) 为例,我们可以先流 \(F_{max}\) ,然后两边一起流,但此时 \(F\) 已经流不动了,而流 \(W\) 的时候显然无法减小 \(F\)

那么用 \(\alpha,1-\alpha\) 的系数把两个线性组合起来,就可以得到 \((F,W)\) ,并且每条边都没有爆掉。

在这样简单的限制条件下容易得到 \(F^aW^{1-a}\) 的最大值在最接近 \({F\over W}={a\over 1-a}\) 时取到。

输出方案就把满足流量平衡的子图拎出来,在上面 dinic 两次,跑完第一次的时候把用掉的流量删掉。

提交记录

IH

考虑二维翻三维是怎么处理的:确定一个面作为底面(”虚拟维“坐标为 0 ),然后以它为根,从下到上翻折,每次以相邻的边为轴向“虚拟维的正方向”翻折一个子树,最后判断每个面(以中心点为代表点)是否都在该在的位置。

所以主要问题在如何「以相邻的面为轴向“虚拟维的正方向”翻折一个点」。大胆猜想是这样:设点坐标为 \((x,y,z,w)\) ,面是 \((?,?,c,0)\) ,那么就会翻转到 \((x,y,c-w,z-c)\) 或是 \((x,y,c+w,c-z)\)(类比二维平面上绕点旋转)。有两种情况的原因是在 \(x\)\(v\) 的时候要保证 \(w\) 维为正(具体见代码)。

提交记录

HL

发现用到的质数很少,和也很小,所以就是简单背包,注意细节。

提交记录

MI

如果方向唯一,那么就很好做:无脑枚举所有 hint 出现的顺序,然后大力贪心。

双向稍微麻烦一点,可以考虑从左往右做,记录当前已经完成了哪些 hint ,正在做哪个从右往左的 hint \(x\) (以及做到哪了)和从左往右的 hint \(y\) (以及做到哪了)。每次加一个数,有两种可能:

  1. \(x\) 做完了,那么可以找到一个 \(x'\) ,那么 \(x'\) 可以继承 \(x\) 的前缀。
  2. \(y\) 做了一些,并且找到了 \(y'\) ,使得 \(y\) 在继承 \(y'\) 的时候可以直接完成。

大力转移即可。

\(dp_{s,i,x,j,y}\) 表示已经完成的有 \(s\) ,左边做完了第 \(i\) 个的第 \(x\) 个,右边在做第 \(j\) 个的第 \(y\) 个,的最小步数。当 \(x=0\) 时可以转移到 \(i=n,x=0\) ,当 \(j=n\) 时可以转移到 \(j=?,y=0\) 。由于转移有环,使用 01 BFS 模拟。复杂度 \(O(2^nn^5)\)

细节较多(或是我比较菜)。提交记录

EJ

不会。

MB

左右分别预处理出哪些集合是合法的(即对面啥都不选的时候能覆盖的集合),用格雷码+匈牙利做到 \(O(2^nn^2)\)

然后发现两边各选一个合法集合一定也是合法的,证明留作练习

提交记录

UI

给大家表演一手身败名裂。

先是一手折半搜索:一个数独枚举行置换和对角线翻转得到集合 \(S_i\) ,另一个枚举列置换得到 \(T_j\)

然后数字之间的置换其实非常沙雕,只需要把集合内每个数独处理成字典序最小的数独,然后判两个集合是否有哈希值相同的数独即可。复杂度 \(O(n(k!)^4k^4)\) ,其中 \(k=3\)

提交记录

ED

做过了,忘记了。提交记录

大概也就我会蠢到写高精度了

AA

讲一次忘一次……

基本步骤:

BABABABABABABABA \(\to\) ABBABABABABABAB__A \(\to\) ABBA__BABABABABBAA

于是中间的 BABABABA 是子问题,可以递归,最后再用两步处理前后。 \(3\le n\le 7\) 的时候要特判。

于是操作次数是 \(n\) 。为什么这是最少次数呢?要从 0 个相邻相等变成 \(2n-2\) 个相邻相等,至少要 \(n-1\) 次,然而至少有一次操作会把两个丢到最前面,于是就至少要 \(n\) 次操作了。

提交记录

BG

我好菜啊……

容易发现这是一个二分的过程,最后要分成若干段,每段长度至多为 \(t\) 。所以容易发现询问的位置只有 \({v_2-v_1\over t}\) 个,每个位置有一个时间限制,必须要在这个限制之前问。显然限制只有 \(O(v^{1/2})\) 个。

二分问的次数,然后就是判断一组限制是否合法。模拟建树过程即可。提交记录

ML

一个显然的贪心是把能加的限制都加上,然后再用某种方法判断是否只有三个解。

容易想到优化:三个解中取值都相等的两个变量,一定会有一组限制使它们必须相等。那么加上这组限制之后就只需要考虑一个变量了。于是 \(n\) 个变量会被缩成 8 个,然后随便做。

想知道 spj 怎么写的

提交记录

CF

做一条河的时候,它一定一直延伸到根,而别的子树的策略是

  • 如果来自儿子的河流都不比那条河长,那么选最短的往上走。
  • 否则,选一个已经超了的往上走。

这么做的正确性是显然的。

为了优化,先处理出全部选最短的时候的信息,然后乱搞,考虑每个点的贡献,用树状数组随便维护一下。复杂度 \(O(n\log n)\)

提交记录

TE

建图:把表达式树建出来,然后每个子树建一个起点和终点,然后

  1. 如果是字母或 . 那么起点向终点连一条权值为字符的边。
  2. 如果是 | 那么起点分别向两个儿子的起点连边,两个儿子的终点向自己的终点连边。
  3. 如果是拼接那么起点向左儿子起点连边,左儿子终点向右儿子起点连边,右儿子终点向自己终点连边。
  4. 如果有 * 那么终点向起点连边,起点向终点连边。

然后设 \(dp_{x,i}\) 表示走到 \(x\) ,匹配到第 \(i\) 个字符,的最短长度,随便 BFS ,复杂度 \(O(n^2)\)\(i\ne 0,i\ne |T|\)\(dp\) 数组可以滚动。

输出方案只需要用到 \(i=0,i=|T|\) 时的 \(pre\) ,中间不管怎么走都是直接输出 \(T\)

提交记录

QG

看是否有一个点双 \(m>n\) ,只要有就容易构造出解。但这样写起来会很恶心。

考虑另一种做法,把 dfs 树建出来,那么一个解就是把两个非树边拼起来,要求它们覆盖的树上路径的交至少有一条边。可以无脑树上差分,但更好写的做法是维护两个 \(low\) ,即子树中两条返祖边。

然而还是写了一车sb错误……提交记录

PH

首先把三个方向的链子分类。由于同类链子之间全部没有边,所以它们必须分到同一个集合。所以只有三种分集合方法。

怎样判断两类链子之间是否两两有边呢?容易想到把它们拍扁到二维,然后由于链子一样大+与坐标轴平行就很容易做了。

提交记录

UJ

反人类语法增加了!

直接模拟显然会暴毙,所以考虑向量里面每一个位置的贡献。显然贡献是一个多项式。

根据限制,除了 fold 操作以外所有表达式的 "complexity" 就是多项式次数。而 fold 操作得到的结果相当于是一个常量,也很容易计算。

所以在操作树上模拟一下即可。提交记录

BB

辣鸡计算几何不可能写的真香。

初始想法:

首先容易想到固定一个凸包,让另一个凸包飘。

然后凸包的交可以拆分成三角形的交,而三角形的交的面积感性理解一下应该是个分段二次函数,所以凸包的交的面积也应该是个分段二次函数。分段点显然应该在点与边重合的时候。

二次函数怎么求?大力插值即可。

看完题解之后:

不知道为什么就是可以直接冲三分,然后就做完了。

提交记录

CI

学完单纯形算法之后这题就是模板题了。

写完这题之后就恰好 135 道题了,可喜可贺。

提交记录

SD

这题也能卡我这么久……

注意到可以把 \(n\) 的 2,3 质因子先除掉,然后再进行操作。所以假设 \(n\) 是奇数。

那么就好办了,只需要把最大的 3 的幂减掉,剩下的一定是个偶数,就一定会有 2 ,就一定不会冲突,所以递归即可。

提交记录

NG

在不考虑相等的情况下:先差分。做 A 的时候把极长负段拿出来,段头加 1 ,段尾的后面一位减 1 。做 B 就是正段的段尾减 1 ,段头前面加 1 。

发现一个位置如果变成 0 就永远都是 0 ,所以可以直接删掉,用一个链表维护剩下的。

所以负段的段头段尾只会加,正段的段头段尾只会减。维护一下变成 0 的位置即可。但是要特判长度为 1 的段和开头结尾,比较恶心。复杂度 \(O(n\log n)\) ,常数较大(我用了 6 个堆)。

我写了个不知道为什么是对的东西就一次过了,迷惑

提交记录

然后看了一眼题解,发现根本没有必要用堆,只需要标记一下还有几次会变成 0 (大于 \(m\) 就可以忽略了),然后插在桶里。

DK

猜一手和 border 的字典序有关,结果还真差不多?

对一个串,记录 \(S_i=\{k\mid k\in \text{border}(S_i),k\ge 2|S|-n\}\) ,然后把 \(S_i\) 从大到小排序,比较字典序即可。提交记录

证明……?咕了,等中文题解。

LD

LCT维护基环树裸题?

注意到询问和修改次数非常少,而且没有强制在线,所以可以把 \(O(m)\) 个关键点(被询问过或是出边变过)拉出来,其他点处理出倍增数组,以及跳几步才能跳到一个关键点。

然而点数有 \(4\times 10^6\) ,倍增数组开不下,于是只能树剖求祖先+特判环,就写得非常要死……

提交记录

好像和正解差距比较大,不管了……

IJ

显然我们应该先找到一个返回值为 \(n/2\) 的串。从全 0 开始,从左往右每次把一个 0 变成 1 ,则一定有一个位置返回值为 \(n/2\) 。不失一般性,假设这个串是全 0 。

那么任取两个位置把它们变成 1 ,就可以知道它们的真实值是相同还是相反。

于是获得了询问次数 \(2n\) 的做法真垃圾

那么正解是什么呢?找串的时候直接随机!nmd

原因是 \({2n\choose n}/2^{2n}\approx {1\over \sqrt{\pi n}}\)斯特林近似白学了

提交记录

NC

以下参考 https://www.cnblogs.com/wxjor/p/9643234.html

先把图逆时针旋转,变成正常的坐标系,那么变成往右上走。

正解根本不需要搞这么多东西。直接设 \(f_{i,j}\) 表示从 \((i,j)\) 开始能走到多少朵花,然后从右到左扫描线。

加入栅栏的右边界时,无脑区间赋 0 。

加入栅栏的左边界时,设 \(f_1\) 是左上角的 \(f\)\(f_2\) 是右上角的 \(f\) ,那么区间赋为 \(f_1\) ,并给下面一段都加上 \(f_1-f_2\)

对于每一朵花,给下面一段都加 1 。

所以需要区间加、区间赋值、单点查询,查找下方第一个栅栏。用线段树即可维护。

虽然代码不长,但还是感觉挺重工业的……提交记录

BJ

设矩形长宽为 \(n,m\) ,切点为 \(a,b\) ,面积为 \(x\) ,那么有 \(an+bm-2ab=a(n-b)+b(m-a)=x\) ,其中 \(a\ne 0,a\ne m,b\ne 0,b\ne n\) 。这等价于 \(ab+cd=x,abcd\ne 0\) 。所以筛出约数个数再做个卷积即可。

提交记录

FK

相当于算能通过每个前缀的概率,即每个前缀的限制取交。如果对于每个限制枚举模 \(r+g\) 的余数,那么合法当且仅当对于任意两个同余方程,\(\gcd(m_1,m_2)|a_1,\gcd(m_1,m_2)|a_2\)

注意到 \(r+g\le 100\) 比较小,所以可以枚举模 \(\mathrm{lcm}(1\cdots 100)\) 的余数按照 \(>10\) 的质数分类,每组进行操作之后再合并回来。

由于 CRT 的性质,我们并不关心每组合并出的结果模那组的大质数的值,而只关心模 \(M=2^63^45^27^2\) 的值。每组分别搞出来取每个位置时能通过的概率,然后点乘在一起求和。

然而 \(M\) 还是太大了。注意到一旦有大质数,剩下的 \(\rm lcm\) 不超过 \(2520\) ,所以考虑特判最后一组。用最后一组的结果得到 \(f_i,0\le i<2520\) 表示前面所有组的结果的第 \(i\) 位的贡献。更新最后一组时暴力求出哪些位置要被删掉,然后更新 \(f_i\)

理论复杂度 \(O(46M)\approx 3\times 10^8\) 竟然一秒跑过去了,CFnb!

提交记录

CH

毒瘤计算几何不可能写的

口胡。

jls 讲过了。有三个自由量:旋转角度、横向平移,纵向平移。先枚举两条边重合,然后枚举一个点卡到一条边,即可确定两个简单多边形的相对位置。然后瞎搞搞?

NJ

最小割树裸题?

巧了,刚给学弟讲完最小割树的证明 /fad

提交记录

RH

一副不可做的样子,先跳了。

QF

口胡。

复杂度分析大赛

由于变量实在太少,容易想到缩点之后求合法的拓扑序个数。如果缩点之后有 \(u\) 个点,拓扑序有 \(m\) 种,那么复杂度就是 \({m\over u!}n^u\)\(20!\) 刚好没有爆 long long 。

提交记录

BE

由于子序列具有传递性,题目本质上就是要把集合分成两个团,其中两个点有边当且仅当一个是另一个的子序列。那么可以取补图,然后判二分图。

按照长度排序,从大到小做,维护现在的两个链尾(初始都是最终节点)。每次加入一个串的时候,如果只能接在一个链尾后面,那就接上去;否则,形成一个新链,以后加入串的时候:

  1. 如果能接在新链的链尾那就接上去;
  2. 否则,它和新链的链尾不能在一条链,所以把它们俩分别接到原来两个链尾的后面。

判子序列一共判了 \(O(n)\) 次,所以复杂度 \(O(n|s|)\)提交记录

KI

所有可能的情况在二维平面的一个正方形里,而一次询问相当于用一条(或两条)斜率为 \(t\) 的直线去切它。由于坐标范围较小,可以直接存储每个横坐标对应哪些纵坐标还可能是答案,然后询问的时候二分询问点,使得把剩下的点切成尽可能均匀的两部分。

由于询问次数比较宽,应该怎么写都问题不大。

提交记录

AC

直接求出吊机的重心,然后随便搞即可。

提交记录

PG

找了很久性质然后发现什么也找不出……

以下的贪心有的时候不考虑没有交的线段的顺序限制,因为贪出来的结果必然满足限制。

显然答案具有可二分性。二分答案之后,第一条线段放右端点最小的一定不亏,否则可以和第一个交换。

现在,每条线段会有一个 \(R_i\) ,表示它的编号不能超过 \(R_i\) 。根据 \(R_i\) 找到第一个前缀和为 0 的位置 \(p\) ,那么下一个就必须放 \(R_i\le p\) 的线段。我们直接在这个线段集合里面找到右端点最小的 \(x\) 放进去,然后更新 \(R_i\)

为什么这样是对的呢?把 \(R\) 相同的线段分为一组,由于前面的前缀和都没满,所以 \(x\) 可以一直往前面的组跳(把不属于前面的组却待在前面的线段换下去),直到跳到第一组,那么显然就应该放在第一个了。

提交记录

HM

显然是模拟费用流。由于深度是 \(O(\log n)\) ,可以类似线段树维护从每个点开始往下走到一个有食物的点的最短距离是多少。询问时枚举 \(lca\) 在哪个点,然后暴力更新即可。

怎么这都能挂两发……提交记录

PJ

nmd,怎么这种题都卡常……

考虑求那个矩阵的逆。注意到这个矩阵转置后变为求点值的矩阵,其中点值为 \(F_i(1\le i\le n)\) ,所以可以通过拉格朗日插值得到逆矩阵,然后再转置得到原矩阵的逆。复杂度 \(O(n^2)\)

然而,被卡常了……(提交记录,注意这份代码忘记清空 \(a_{i+1}\) 了)。

于是大力改改改,终于推出了和正解一样的式子……最重要的一步是 \(f(x)=\sum_i F_i^{n+1}\prod_{j\ne i}{x-x_j\over x_i-x_j}\) ,其中 \(x_0=0,x_i=F_i\) ,有 \(f(F_i)=F_i^{n+1}\) ,所以 \(x^{n+1}-f(x)=x\prod_i (x-F_i)\) 给出了 \(f(x)\)

提交记录

ID

经典分治,选出一条最靠中间的边分成两半,那么显然两边的点要互达必须经过这条边的两个端点,分别跑 BFS 即可。

提交记录

EG

毒瘤计算几何,先跳过。

SI

被瞎jb随机搞过去了哈哈哈哈哈哈……

随机 5 个数,随机打乱它们的位置,然后重新计算当前满足的个数,如果增多了就变过去。

优化:1.重新计算的时候只考虑包含这 5 个数的限制。 2.把没有在限制里出现的元素删掉。然后就很稳地冲过去了。

模拟退火什么的真没用

提交记录

KC

先考虑树怎么做:显然重心置换之后还是重心,所以令重心为根(有两个就新建一个虚根),然后树哈希随便搞即可。

推广到仙人掌的自然想法是建出圆方树,那么对原图置换之后相当于对圆方树进行了置换。不过此时要注意圆不能变成方,所以有两个重心的时候只取一个为根。

由于方点的儿子是有序的,所以方点只支持 reverse 儿子序列;但如果方点是根那么就是循环移位+翻转,一共 \(2\cdot \texttt{circle_cnt}\) 种。

提交记录

GI

口胡。

从空序列开始,每次加入一个奇数,再加入一个偶数,维护它们的大小关系。无法分辨的一堆奇偶性相同的数就放在一起。

加入一个奇数的时候,二分它与之前的偶数的大小关系;加入偶数的时候同理。

比较次数 \(O(n\log n)\) ,复杂度 \(O(n^2)\) ,应该能过。

然后看了一眼题解,发现可以直接把所有奇数放在一堆,然后偶数一个一个加进去,每次二分出对应的一组,再在组里面暴力。由于 \(\sum_{i\le n} {n\over i}=O(n\log n)\) 所以可以冲过去。提交记录

OG

显然构造可以反过来变成删除&翻折。先证明一个简单但重要的性质:能翻折的时候必须翻折。

很容易证明,只需要考虑下一次翻折是什么时候即可。

所以,第一次翻折必然是翻折一个极长回文串,我们只需要求出每个回文串的一半对应的操作次数即可。由于一个串里面本质不同的回文串个数是 \(O(n)\) 的,接下来就比较好做了。

考虑一个子串的下一次翻折,发现要么是删到一个极长回文串(指原串中 manacher 求出的极长回文串)再翻折,要么是删到最长的回文前/后缀再翻折。证明就用上面那个性质。最长回文前后缀容易求出,而极长回文串的贡献可以用二维线段树维护。(一副很难写的样子)

但是有更好的方法:转移顺序比较严格,所以可以用 CDQ 分治去掉一维,好写很多(个鬼啊)。

然后写+调了一晚上,它TLE了……辣鸡玩意儿开 18s 不告诉我字符串总长度多少

正解是考虑回文树的时候很容易直接 DP :枚举下一步是删掉尾部还是从尾部开始走一个回文串,而删掉尾部后还是回文串的一半。提交记录

CK

先证明一个重要的性质:对于一串阶为 \(n\ (n>1)\) 的序列,可以变成一个阶为 \(n\) 的序列。证明很简单,考虑一次把两个缩起来。以 \(n=5\) 为例:5432112345 5432112345 可以把中间的 2345 5432 全部拆成单独的引号。

那么枚举答案,无脑判断即可。提交记录

DB

考虑一次查询会发生什么,相当于钦定某几个人不能有什么&&某个人必须有某个集合中的至少一个。

那么可以先分别求出另外三个人的可能集合,然后 \(O(3^{16})\) 卷到一起,再判断每张牌能否未出现。注意一种牌不能全部出现。

提交记录

QE

把所有数分成两种,有倍数的和没倍数的。有倍数的可以直接消掉,没倍数的先给出现次数最小的出现次数的代价,然后也可以消掉。提交记录

GH

好!统计学非常有用

有亿点点玄学……

随机 30000 个 \(a_i\) 丢进去询问,设返回值是 \(q_i\) 。显然 \(q_i\) 可以减掉第 7 行的贡献。

由于 \(d\)\(m\) 互质,显然有 \(d\) 的第 0 位为 1 ,所以 \(r\) 的初值可以看做 \(a_i\) 。下面从低到高依次确定第 1~59 位。

\(p_i\)\(a_i\times (a_i^2)\) 花的时间,那么一个想法是如果 \(d\) 的第一位是 1 ,那么 \(p_i\) 较小的地方 \(q_i\) 也应该稍小一些。

协方差 \(cov(p,q)=E[(p-E[p])(q-E[q])]\) 表示两个随机量一起增大/减小的趋势(感性理解)。考虑样本协方差

\[cov\left(p_{i}, q_{i}\right)=\frac{\sum p_{i} \cdot q_{i}}{k}-\frac{\sum p_{i}}{k} \cdot \frac{\sum q_{i}}{k},k=30000 \]

\(d\) 的第一位是 1 时,\(q_i=p_i+r\) ,其中 \(r\) 是后面花的时间。由于玄学,可以假装 \(cov(p,r)=0\) (因为 \(a_i^3\) 比较随机),于是 \(cov(p_i,q_i)\approx cov(p_i,p_i)\) 。否则, \(q_i=r\) 中后面有一步是 \(a_i\times ?\)\(a_i\) 有关,就有 \(cov(p_i,q_i)\approx cov(p_i,t_i)\) ,其中 \(t_i\)\(a_i\times ?\) 花的时间。可以取 \(?=a_i^4\)

然后看 \(cov(p_i,q_i)\) 更靠近 \(cov(p_i,p_i)\) 还是 \(cov(p_i,t_i)\) 即可。证明不想看了。

提交记录 (我也不知道为什么我选了 \(?=a_i^8\) ,也不知道为什么一份代码卡在 24 测不出来,再交一次就过了)

NI

注意到坐标范围和 \(r\) 小得离谱,而一条线段旁边的整点就只有 \(O(len)\) 个,所以暴力冲就完事。

pb做题一上午,sb错误一火车

被奇怪的卡精度、swap(x1,x2) 而不 swap(y1,y2) 、枚举不从小到大、式子写错等等sb错误搞了一个多小时……提交记录

OL

题目可以抽象成第一象限内有 \(n\) 个与 \(x\) 轴平行的线段,要放一些垂直于 \(x\) 轴的线段把每一个原来的都干掉。

考虑枚举最高点的位置,那么所有覆盖这个位置的线段都没了,两边独立。

所以是个简单区间 DP 。提交记录

KA

直接搜就好了。提交记录

MG

先拉成一维的 01 序列,那么询问 \(t\) 就相当于求出前 \(t-1\) 长的极长 0 段长度之和。简单的想法是无脑分治,然后合并两边,但复杂度显然会起飞。

然后思路差不多对了,但火候还没到……

首先有一个性质:0 段长度只有 \(O(nm)\) 种。这是因为每种用 \(2^k\times 2^k\) 的正方形切割平面的方法都对应到一些 0 段,而这些正方形与多边形的交的形状只有 \(O(m)\) 种:包含角的共 \(O(m)\) 种,而只包含边的在同一条边上都长得一样。这是我们继续往下做的基础。

注意到分治时区域内有角的情况只有 \(O(nm)\) 种,而只有边时有一半情况下切开两边是完全相同的,另一半情况则是把边集分成了两半。由于拆分边集也只能拆 \(m\) 次,所以能走到的情况只有 \(O(nm^2)\) 种。每种情况都要花 \(O(m)\) 的时间判断,所以复杂度 \(O(nm^3)\)

然后询问随便处理。

提交记录

(后记:我又因为把 \(\inf\) 设为 \(10^9\) 而挂了一次……)

SG

显然贪心。维护一个目前入度为 0 的点集,和每个点的一个 mark ,表示它是否需要一条入边(从上一个被输出的点或是后面的点连向它)。从这个点集里面抓出一个最大的 \(x\) (如果 \(k\) 不够了就抓尽可能大的),如果 \(mark_x=1\) 就连 \((lastans,x)\) ,然后把点集内的其他点的 \(mark\) 全部置为 1 。

注意一些小细节。代码使用了更好写的实现方式。提交记录

NL

可以看做是在四维空间里面走,除了原来的两维外还有穿墙次数的两维。

如果把地图四周都看做墙,那么一个连通块的答案一定是一样的,可以缩成一个点。而如果这个连通块没有接触到边界那么它废了,所以现在点数变成 \(O(n)\) 的了。

由于操作全部可逆,不妨先用任意一种方法走到原点。然后就可以看做用一些环的整数倍凑出需要的向量。和最大XOR和路径类似,可以把一棵生成树拿出来,然后所有环都是非树边对应的环的线性组合。于是得到了所有需要的环。

怎么判断一堆向量的整数倍能否凑出一个向量呢?由于 \(\{a,b\}\)\(\{a,a-b\}\) 凑出来的集合相同,所以可以辗转相除,最后只剩下两个向量。询问随便做。 提交记录

KH

这不简单题吗……提交记录

QJ

相当于给所有负数乘一个会变化的权重 \(k\) ,以及单点修改。无脑分块即可。写得稍微好看一点应该就可以 \(O(n\sqrt {n\log n})\) 了。注意正负不要搞反 /fad

提交记录

KG

先把这个平面旋转一下,使得阳光平行于 \(x\) 轴。那么可以把塔的高度乘上一个常数,使它转回直立(虽然有可能卡进墙里)。并且横坐标也不重要了,我们只关心地势最高点和开头的高度差。

又犯了一堆sb错误……提交记录

AB

离散食物无脑背包+斜率优化,然后枚举它占的体积,求连续食物带来的最大贡献。由于是凸的,二分斜率即可(当然也可以不用二分而用别的方法)。

离散食物甚至不需要斜率优化,一个简单的决策单调性即可。提交记录

KD

先把被包含的单词删掉。

人类直觉告诉我们,应当给每个单词设置一个父亲,使得总代价就是总长度减去和父亲的交的长度。

考虑最优解中一个单词 \(x\) 的位置,定义 \(fa_x\) 为满足 \(id_y<id_x\)\(w(x,y)\) 最长的 \(y\) ,其中 \(id\) 按起始点的深度从小到大排序,\(w(x,y)\) 表示 \(x,y\) 在树上交的长度。显然这样定义出来的一定是一棵树。

考虑每一条边被贡献的次数,可以发现只要它被覆盖过就一定会被恰好算一次。

那么题目就转化为给一个完全图,求最小树形图。上朱刘算法即可。为了代码简洁,真正实现中并不需要删除被包含的字符串。

提交记录

IL

二分最高点高度,枚举最高点位置,那么每个位置所需的高度就是从最高点位置开始往左往右 \(h,h-1,\cdots\) 扩展,直到遇上一个原本就足够的位置。把两边的 bound 求出来后求区间和即可。提交记录

NF

考虑每个常数的贡献即可。提交记录

CM

求一个看得懂的题面。

NE

感性理解一下,缩点顺序应该和最终的点数边数没有关系,所以应该可以以任意顺序缩点或撤销。

缩点结束后一条边会代表原图的一条链。不妨先全部缩完,然后一条一条边删掉。

删除原图的一条边时,可能会把新图的一条边断成两条,或是直接消失,所以只需要能维护出这条边此时属于新图的哪条边。用单调栈预处理出这条边在链上两边比它更早被删的第一条边即可。

然后看了一眼题解,发现点数就是 \(n-deg_0-deg_2+cir\) ,边数就是 \(m-deg_2+cir\) ,就好做很多了……提交记录

HD

这尼玛竟然被搬了三次……

提交记录

DH

怎么ICPC也考论文题

又是这种非常神仙的“给出必要条件——证明它充分”思路,可能就是不太能做吧……

对于每一个区间 \([s,e]\) ,考虑它包含的所有任务。现在除了要求它们都在 \([s,e]\) 内拍完以外忽略别的限制,并从后往前贪心放,会得到一个时间 \(C\) ,表示它们最晚也要在 \(C\) 时刻开始拍。那么如果 \(C<s\) 一定无解;如果 \(C-s<t\) ,那么就会有 \((C-t,s)\) 这段时间不能开始拍任何一张照片,即把这段区间 ban 掉了。

从大到小枚举每一个 \(s\) ,再枚举每一个 \(e\) ,都会得到一个 ban 掉的区间,并且这个 ban 掉的区间还会影响后面的贪心。

如果这样处理完了,就直接贪心构造答案:从左往右扫,扫到一个能开始拍照的点时就把现在能拍的结束时间最小的任务抓出来拍。

然后就要证明:如果预处理没有暴毙,那么贪心就一定能构造出解。

先稍微分析一下,使得贪心的时候所有“空跑”的时间都是被 ban 掉的时段(否则从这里切开,两边互不影响)。然后考虑第一个结束时间超过 \(e_{i}\) 的照片 \(P_i\)

如果在 \(P_i\) 之前的照片的结束时间都小于等于 \(e_i\) ,那么就说明 1 到 \(P_i\) 的所有线段并不能卡进 \([s_1,e_i]\) 里面(全程除了被 ban 掉的时段外没有空跑,所以干的事情等价于忽略各自限制直接放),那么预处理时就已经应该暴毙了。

否则,找出在 \(P_i\) 之前且结束时间最晚的任务 \(P_j\) ,设 \(P_{k_1},\cdots,P_{k_l}\) 为在 \(P_j\)\(P_i\) 之间完成的任务,设 \(s\)\(\{P_j,P_{k_i}\}\) 中最早的开始时间,那么区间 \([s,e_i]\) 就应当在预处理时死掉。(???)

反正感性理解是没什么问题的(((

预处理的时候还要稍微优化一下,把每一个 \(e\) 对应的 \(C\) 存下来,这样当 \(s\) 变的时候就不用重跑一次,而只需要在前面再加几个线段。复杂度 \(O(n^2)\)

提交记录

EC

口胡。

我其实还是偏向普通数据结构做法……

题解做法/我的想法:

无脑设 \(dp_{x,i}\) 表示 \(x\) 子树中,在根处增加 \(i\) 个洞(如果 \(i<0\) 则表示增加 \(|i|\) 个老鼠),的最小代价。那么有三种操作:

  1. 从单点开始:全部为 0 。
  2. 从儿子到 \(x\)\(dp'_{v,i}=\min\{dp'_{v,i-1},dp_{v,i}+|i|\times w \}\) ,其中 \(w\) 为边权。
  3. 合并两个儿子:\((\min,+)\) 卷积。

容易想到 \(dp_x\) 是凸的,所以只需要维护两个堆,分别是 \(i<0\)\(i>0\)\(\Delta dp_{x,i}\)

模拟费用流做法:

每个点维护两个堆,分别表示再搞一个洞和再搞一只老鼠的代价。合并儿子的时候分别把两个堆合并到一起,然后如果把两个堆顶合并会更优那就合并,并保留反悔的机会。为了把老鼠匹配完,匹配一只老鼠会有 \(-\infty\) 的额外代价。

代码采用了模拟费用流写法因为好写多了提交记录

BM

前 75 题,以一道大模拟结束……

主要考虑 move 操作:从起始矩形往其他矩形跑最长路,求出其他每个矩形最多被推多远就会卡在墙上,然后模拟即可。

结果没想到因为判矩形相交判错而疯狂 WA ……

也没想到因为 \(\inf\) 设小 + 没开 long long 疯狂 WA ……

pb做题一下午,sb错误一火车

提交记录

posted @ 2020-10-13 07:58  p_b_p_b  阅读(1087)  评论(0编辑  收藏  举报