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=2a−s
把式子写出来可以得到
2
t
a
−
o
s
=
c
2^ta-os=c
2ta−os=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
s2ta−c=o≤2t
要求的就是最小的
t
t
t
直接枚举
t
t
t然后冲就行了
code
B
随机题直接送了
考虑把前
25
25
25位先取出来,然后对于剩下的贪心分类,使得最后的差
s
≤
W
s \le W
s≤W
然后对于前面
25
25
25位,直接
2
25
2^{25}
225枚举子集,因为
2
25
远
大
于
W
2^{25}远大于W
225远大于W,所以几乎必定出现相差为
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题
吧贡献拆一下就行了
Day2
http://zhengruioi.com/contest/1008
终于又一次打ZR的比赛上300了,感天动地
其实题目也不算难
A
xjb爆搜,3阶幻方只有8个
B
xor操作就是一个trie
and和or是一样的
我们考虑and
每加入一个数,我们只需要把它的子集全部加进去就行了
然后询问就从高到低匹配,能匹配就匹配
然后就没了(感觉是一种新的自动机?)
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分,巨难受
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
勉强值得一做的题
感觉我讲不太清,直接丢题解吧
Day 4
http://zhengruioi.com/contest/1015
手贱多交一发,罚时爆炸
再一次上300
A
肯定是排序后对应的权值最小(根据切比雪夫不等式)
把
∑
(
a
i
−
b
i
)
2
\sum (a_i-b_i)^2
∑(ai−bi)2拆开套进去就可以证明了
然后我们离散化后得到两个排列,其实就是一个置换,使 p [ a [ i ] ] = b [ i ] p[a[i]]=b[i] p[a[i]]=b[i]然后转化成把 p p p排序最少交换几次
有两种做法,可以直接找置换环,然后 n − 环 个 数 n-环个数 n−环个数
另一种就是考虑每个值,不在它该带的位置就把它丢过去,我写的是这种
B
分奇偶搞一下前缀和就好了,是个挂分好题
C
首先要看出来是个基环森林
然后对于树上的情况推推式子不难算
考虑环上的
不要陷入DP的怪圈,打开思维,说不定就是这种无脑考虑贡献计算维护的题
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
离线下来拿线段树乱搞即可
B
带原题
要保证连续三个不同
那么就
1
,
2
1,2
1,2不同
3
,
4
3,4
3,4不同
连起来
二分图染色一下
code
C
NB题
然后每下一层就会生几个孩子
有亿点卡常
D
不会
Day9
md三道原题
把原题的题解写了,爬了
Day10
同上
Day11
http://zhengruioi.com/contest/1029
巨大简单场,然鹅身体不适没有打完 /kk
A
把质数筛出来二分一下即可
B
通过归纳法可以证明不会超过
n
2
\frac{n}{2}
2n个
具体构造方法可以这样
code
C
二分答案+贪心即可
把一个结点孩子的联通块从小到大往这个结点塞就行了
Day 12
http://zhengruioi.com/contest/1030
A
首先显然是可以求
<
=
d
i
<=d_i
<=di的,然后再差分
考虑钦定1为根,考虑到一个集合最深的那个点一定是直径的一端,按深度排序,一个个加入,那么这个集合连成的联通块一定是之前已经加入的,这样就能保证每个集合只会被算一次
具体实现可以看代码
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
AND值X来容斥即可
code
B
拼接题
考场上看出来了最多只能出现一个基环树,结果发现自己降大智
可以直接钦定一个环,把它缩成一个点,然后跑矩阵树,考虑森林各个树大小乘起来怎么处理,可以建一个虚点,连向所有的点,那么跑这个新树的矩阵树的答案就是相当于原来的答案
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()
即可,代码不难
B
二分答案,把每个数
−
m
i
d
- mid
−mid 然后再做个前缀和
就变成判断最长上升子序列是不是
≥
k
\ge k
≥k
因为是实数,把两位反过来做一下即可
C
NB 题,感觉讲不太清楚
是对这代码写题面的题
先咕咕咕……