ZR2021 20联测题解

Day1

http://zhengruioi.com/contest/1005
我是傻狗,4道憨批题都不会
分析题全挂,不愧是你
考完半小时订正完,麻了

A

注意到 a + b a+b a+b的和是不变的
我们要求的实际上是 a = c a=c a=c的步数,每次 a = 2 a a=2a a=2a a = 2 a − s a=2a-s a=2as
把式子写出来可以得到
2 t a − o s = c 2^ta-os=c 2taos=c
其中 o < 2 t o<2^t o<2t
移项后可以得到
2 t a − c s = o ≤ 2 t \frac{2^ta-c}{s}=o\le 2^t s2tac=o2t
要求的就是最小的 t t t
直接枚举 t t t然后冲就行了
code

B

随机题直接送了
考虑把前 25 25 25位先取出来,然后对于剩下的贪心分类,使得最后的差 s ≤ W s \le W sW
然后对于前面 25 25 25位,直接 2 25 2^{25} 225枚举子集,因为 2 25 远 大 于 W 2^{25}远大于W 225W,所以几乎必定出现相差为 s s s的两个子集

求出来即可
code

C

有点小nb的题
通过前几个小的样例可以得到如果父亲和自己的子树都 ≥ k + 1 \ge k+1 k+1那么可以通过做差得到自己
但是这样下面第一个样例就解释不了了
还有一种情况是,可以通过1先得到1子树和,减去所有儿子的工资和,再减去 2 , 6 2,6 2,6的子树和就可以得到 18 18 18的工资了
在这里插入图片描述
具体代码实现不难
code

D

诈骗sb题
吧贡献拆一下就行了

code

Day2

http://zhengruioi.com/contest/1008
终于又一次打ZR的比赛上300了,感天动地

其实题目也不算难

A

xjb爆搜,3阶幻方只有8个

code

B

xor操作就是一个trie
and和or是一样的
我们考虑and

每加入一个数,我们只需要把它的子集全部加进去就行了
然后询问就从高到低匹配,能匹配就匹配
然后就没了(感觉是一种新的自动机?)

code

C

a , b a,b a,b这条路径抽出来

然后要选一个断点,使得两边的值尽量相等

因为一个是递增的,一个是递减的,所以可以二分,然后如果差值>=0就往左
否则往右

代码实现不难
code

D

NB题
但是还是挺套路的(如果不是看错题我切爆好吗

先把询问离线下来,按电压排序
所有的点也按照电压排序

然后用启发式合并维护信息,用set维护每个联通块的答案就行了

0.5h就能写完
code

Day3

http://zhengruioi.com/contest/1010
出题人赛后改时限是真的屑

被卡常卡了50分,有点烦

正解被卡常,把暴力放了过去,体验极差

A

sb题,把边表压成一个整数,然后用位运算快速得到边数即可

比出题人的lj做法不知道高明到哪里去了
code

B

lj套路题
μ \mu μ筛出来做就行了

被卡常卡了30分,巨难受

code

C

考虑区间dp,设 f [ l ] [ r ] [ k ] f[l][r][k] f[l][r][k]表示对于区间 [ l , r ] [l,r] [l,r]最后的胜者是 k k k是否可行
然后发现 f [ l ] [ r ] [ k ] = 1 f[l][r][k]=1 f[l][r][k]=1的充要条件是 f [ l ] [ k ] [ k ] = f [ k ] [ r ] [ k ] = 1 f[l][k][k]=f[k][r][k]=1 f[l][k][k]=f[k][r][k]=1
所以可以把第三维改成 0 / 1 0/1 0/1表示左端点或右端点胜出是否可行
然后用bitset优化一波就行了

然鹅还是被卡了20分的常
code

D

勉强值得一做的题

感觉我讲不太清,直接丢题解吧

在这里插入图片描述

code

Day 4

http://zhengruioi.com/contest/1015

手贱多交一发,罚时爆炸
再一次上300

A

肯定是排序后对应的权值最小(根据切比雪夫不等式)

在这里插入图片描述
∑ ( a i − b i ) 2 \sum (a_i-b_i)^2 (aibi)2拆开套进去就可以证明了

然后我们离散化后得到两个排列,其实就是一个置换,使 p [ a [ i ] ] = b [ i ] p[a[i]]=b[i] p[a[i]]=b[i]然后转化成把 p p p排序最少交换几次

有两种做法,可以直接找置换环,然后 n − 环 个 数 n-环个数 n

另一种就是考虑每个值,不在它该带的位置就把它丢过去,我写的是这种

code

B

分奇偶搞一下前缀和就好了,是个挂分好题

code

C

首先要看出来是个基环森林
然后对于树上的情况推推式子不难算

考虑环上的
在这里插入图片描述

不要陷入DP的怪圈,打开思维,说不定就是这种无脑考虑贡献计算维护的题

code

D

不会,脑子清醒的时候研究一下

Day5

http://zhengruioi.com/contest/1016

T1看错题浪费了1h
T3卡空间好在我看见了

T2挂没了,我rank 1没了哈哈哈
clb的题真良心

A

看懂题后就不算难了
查分后维护0的连续段,每个连续段可以贡献一个组合数
组合数乘起来就是答案

维护连续段很容易想到用珂朵莉树
然后就做完了
code

B

后几题脑子清醒的时候再写

Day6

http://zhengruioi.com/contest/1018

又上300啦

A

离线下来拿线段树乱搞即可

code

B

带原题
要保证连续三个不同
那么就 1 , 2 1,2 1,2不同 3 , 4 3,4 3,4不同
连起来
二分图染色一下
code

C

NB题

然后每下一层就会生几个孩子

有亿点卡常

code

D

不会

Day9

md三道原题
把原题的题解写了,爬了

Day10

同上

Day11

http://zhengruioi.com/contest/1029
巨大简单场,然鹅身体不适没有打完 /kk

A

把质数筛出来二分一下即可

B

通过归纳法可以证明不会超过 n 2 \frac{n}{2} 2n
具体构造方法可以这样
在这里插入图片描述
code

C

二分答案+贪心即可

把一个结点孩子的联通块从小到大往这个结点塞就行了

code

Day 12

http://zhengruioi.com/contest/1030

A

首先显然是可以求 < = d i <=d_i <=di的,然后再差分
考虑钦定1为根,考虑到一个集合最深的那个点一定是直径的一端,按深度排序,一个个加入,那么这个集合连成的联通块一定是之前已经加入的,这样就能保证每个集合只会被算一次

具体实现可以看代码

code

Day13

http://zhengruioi.com/contest/1031

考场上心态炸了

A

考虑枚举集合 A N D AND AND的值 X X X

  • X > 0 X>0 X>0, 对于 X X X 1 1 1的位置,集合中的每个数这个位置一定为1,且一定一共选了奇数的数,对于 X X X 0 0 0的位置,一定是偶数个数这个位置为 1 1 1,因为前面说了有奇数个数,所以必定有至少一个数这个位置为 0 0 0,那么如果异或完这个位置为 0 0 0,那么就能保证 A N D AND AND完这个位置也是0,那么这个集合如果异或值为 X X X, A N D AND AND值一定也是 X X X, 所以直接线性基大力冲就行了
  • 对于 X = 0 X=0 X=0,不知道那些数选出来 A N D AND AND起来是0,所以容斥一把,枚举 A N D 值 X AND值X ANDX来容斥即可
    code

B

拼接题
考场上看出来了最多只能出现一个基环树,结果发现自己降大智

可以直接钦定一个环,把它缩成一个点,然后跑矩阵树,考虑森林各个树大小乘起来怎么处理,可以建一个虚点,连向所有的点,那么跑这个新树的矩阵树的答案就是相当于原来的答案

code

Day 14

http://zhengruioi.com/contest/1032

A

xjb推一个式子就行了
code

B

用cdq分治优化DP
然后用个vector存一下加速匹配即可

O ( n m 2 l o g n 26 ) O(\frac{nm^2logn}{26}) O(26nm2logn)
code

Day 15

http://zhengruioi.com/contest/1036

A

大力压位 用

__builtin_popcountll()

即可,代码不难

code

B

二分答案,把每个数 − m i d - mid mid 然后再做个前缀和
就变成判断最长上升子序列是不是 ≥ k \ge k k
因为是实数,把两位反过来做一下即可

code

C

NB 题,感觉讲不太清楚

是对这代码写题面的题

先咕咕咕……

posted @ 2021-10-13 07:47  lahlah  阅读(27)  评论(0编辑  收藏  举报