PKUWC2020?退役记
RT,暂时退役搞期末考了。
Day -inf
woc,发现自己能去 PKUWC,rp 好爆了。
woc,发现自己压线能去 WC,rp 好爆了。
woc,发现自己 div2 的题都不会,而且一次不会就不会两道,实力弱爆了。
然后就是颓废颓废颓废。。。
Day 0
忘了学校盖章。。。
住宿被搞了两次。。。
rp 差爆了。。。
途中听说 PKUWC 改 OI 赛制了,爆零预定
Day 1
早上两个小时讲课变成 40 分钟了
去未名湖和博雅塔(一塌糊涂)玩了一下,再去西门拍了照。
真是颓废
中午去睡了一觉,去考场一看
不愧是听说,赛制是 IOI 赛制
没有主地斗,可能有学上了
我在想桃子
t1 先想了一个矩乘,然后萎了
t2 暴力不会
t3 数论结构
暴力有 50 左右,不愧是我
然后发现 memset0 和 zoxx 在我旁边
他们好厉害啊,我自闭了
码码码,大概三点半成功 get 58
我是 sb,然后上了个厕所冷静了一下
算了,心态崩了,打四方暴力吧
艹,居然打出来了,四点半了。
好像可以二方?
打完五点十几,脑子一抽,会一个 log 了。
码一码,五点半了。
md,没调出来我退役好了
终于,五点四十八调出来了,1A 了。
然后 t3 m=1 的包没时间写了
不过 a 了一题,很开心。
(21+100+19=140)
题目:
t1:
给定一个排列 P,将字典序 <=P 的排列按顺序接在一起,求本质不同的子序列(可以为空)的个数。
(nle 50)
t2:
有 n 个集合,每次等概率选择两个不一样的集合合并起来
定义一个集合的价值为 (max(S)-min(S))^2。若有 k 个集合,价值为 k 个集合价值之和。
f(i) 为有 i 个集合的期望价值,求 f(l)^97673+...+f(r)^97673
(nle 2 imes 10^5)
t3:
有一个 n*m 的矩阵,初始为空。有 q1 次操作 1,有 q2 次操作 2,操作 1 后操作 2
操作 1:s,l,r,x,将 gcd(a,s)==1,l<=b<=r 的格子 (a,b) 加 x
操作 2:s,l,r,询问 gcd(a,s)==1,l<=b<=r 的格子之和
数据保证 s 随机。
(n,mle 5 imes 10^4,q_1,q_2le 10^5)
t1,t2 mod = 998244353
t3 mod = 2^32
题解:
t1: 找规律,然后类似数位 dp 的方式矩乘算一算方案数。
t2: 三次 NTT,过程挺复杂的,期末考后再补。
t3: 你觉得我会?听 jls 说复杂度要求导证明,(O(nlog^3n+nsqrt{n})),神仙莫比乌斯反演。
Day 2
我是 sb。。。
花了两个小时大众分拿到后先开 t2 没开 t3
t2 没调出来,t3 没写
艹,我 tm 如果三个小时写 t3 我还写不出来???
最后三小时就没拿分。。。
(100+65+42=207) 滚粗了。。。
有一种深深的无力感。。。
Day 3
拿了个奖,海星。
一道数学题让我拿了个奖,海星。
不过让我知道了我的实力不行。。。d2 难度严格小于 d1 难度时我 d2 考成 sb。。。开题策略失误,先开 t2 再开 t3,导致 t2 没调出来 t3 没时间写。。。
然后 t3 想了半个小时会了。。。我考场上如果最后 3h 全放 t3 上我还写不出 t3???
这让我想起了别人打 cf div1 随便 A 题,我打 div2 都有些吃力。
基础不行啊。。。要好好补一补了。。。(还有 ubuntu)
算了,结果是好的,我无所谓了。运气好爆了。
题目:
t1: sbt
t2:
有一个分式序列,给定每个位置的值和长度的排列,分式长度小的先计算,每次询问一个区间经计算后的值。
(n,mle 5 imes 10^5)
t3:
有一个无向图,无向图上再连一个环(i->i%n+1)的边,权值为 10^9,问这张图两两之间的最小割之和。
(nle 7000,mle 10^5,wle10^4)
t2,t3 mod = 998244353
题解:
t1: sbt
t2: 好像有 O(n) 的做法,考虑每个数单调栈上的奇偶性。不过出题人的做法是线段树合并,暴力又好懂,不过问了一下 srz,这个可以不用合并,记一记前缀后缀用最大子段和的方式算一算。
t3: 环上断两条边后把问题转化成一段区间内 l<=(i or j)<=r 相连和其他点之间相连的 max,这个东西可以用最小割树的方法,也可以预处理出矩阵的前缀 max 和后缀 max,O(1) 出答案。
附:
晚上睡觉的时候想了一想,发现我考场上 t2 的思路是对的,只不过细节有些多,我 naive 的以为左右边应该有对称美(调不出来 flag*1),然后就爆炸了。
我们将这个序列用广义线段树的方法建出来,发现一个区间对应了一段右儿子和左儿子拼起来。那么我们可以用 zkw 线段树的方法,从叶子结点向上跳,l-1 的叶子碰到左儿子把右儿子合并一下,r+1 的叶子碰到右儿子把左儿子合并一下,这样就能算出答案了。
我们再考虑合并时一个值会变成它的逆元(下面记为翻转)几次。对于左边,因为每一个子区间都是右儿子,所以除了第一个从叶子开始的右儿子结点,其他右儿子会被翻转一次。那么我们预处理从根开始向下的逆元之积,再处理出一个节点向上最近的左儿子,跳到 lca 处就可以出答案了。
对于右边,因为每一个子区间都是右儿子,所以每一个节点都会被翻转到 lca 路径上左儿子个数次。那么一段左儿子相邻一定是奇数不翻转偶数翻转,所以我们可以类似左边的方法预处理出从根开始向下的答案,不过不用处理向上最近的右儿子。不过如果 lca 下面那个结点开始到根左儿子个数有奇数个,那么要把答案翻转。这样就能出答案了。
不过有很多细节,比如 lca 下面那个结点是不算的,如果左边没有右边不用翻转等等。。。我考场上就被各种细节弄自闭了。。。
唉,day2 应该是可以 ak 的啊。
再说一下 d1t2 我考场的做法吧。
首先考虑排序后一对 ((i,j)) 构成的集合对答案的贡献。我们只用考虑这个集合在 ((i,j)) 中间选了几个,剩下的数合并了多少次。
有 (n) 个集合,每次有 (nchoose 2) 种选法,一共有 (f_n=prod_{i=2}^n{ichoose 2}) 种选法。因为集合个数为 (0/1) 时可以不合并,所以 (f_0=f_1=1)。
我们设在 ((i,j)) 中间选了 (k) 个,一共合并了 (t) 次。
这样就 (O(n^4)) 了。
接着,我们发现只有两项与 (i,j) 有关。预处理出这些项,就可以优化了。
那么式子就变成了
这样就可以 (O(n^2)) 了。容易发现这三个式子都可以 ( ext{NTT}),所以就 (O(nlog n)) 了。
不过我 (ans_1) 有锅,要特判一下,我也不知道为什么。。。如果你知道的话可以私信我。。。
以前以为自己数据结构还可以,结果反倒在大型考试做出来的第一道题居然是一道不错的数学题。。。看来可能还是数学题比较适合我吧。。。