ZR19CSP-S模拟赛十联测
Day 1
http://www.zhengruioi.com/contest/388
分组
这题最主要是要分析出来按照经验值排序的时候组长要在组员的后面
然后设计状态DP
设
f
i
,
a
,
b
表
示
排
序
后
的
前
i
个
,
目
前
已
经
有
a
个
组
只
有
组
员
没
有
组
长
,
b
个
组
已
经
配
好
了
的
最
小
代
价
\large f_{i,a,b}表示排序后的前i个,目前已经有a个组只有组员没有组长,b个组已经配好了的最小代价
fi,a,b表示排序后的前i个,目前已经有a个组只有组员没有组长,b个组已经配好了的最小代价
然后对于当前的人,考虑他是加入成为组长,加入一个只有组员的组,还是作为组员,单独开一个只有组员没有组长的组
按照这个DP就好了
具体看代码吧
code:
https://www.luogu.com.cn/paste/s7c5qwnd
折纸
集合
电脑重启一波题解没了/kk
不想补了,大概就是先考虑只有+1/异或,发现这两种操作是可减的
所以可以每次插入/删除的时候先减去/抑或上标记,最后再加上/抑或上标记
考虑拿懒惰标记维护异或
+1可以先把所有数从低位到高位插入
然后沿着1那条路径一路交换左右儿子即可
code:
https://www.luogu.com.cn/paste/nlq6uovf
Day 2
http://www.zhengruioi.com/contest/392
字符串
忘了,发现自己现在好像不太会
散步
首先考虑二分答案
然后发现就是找一条1~n的满足要求的路径
经过的点没有必要再经过一次
这个可以直接拿一个加权并查集维护沿着某种边第一个没有被走过的
跑就完了
大概是
O
(
n
l
o
g
n
α
(
n
)
)
O(nlogn\alpha(n))
O(nlognα(n))
完全能过.jpg
code:
http://zhengruioi.com/submission/226139
树
不会
Day 3
http://zhengruioi.com/contest/399
最长01子序列
枚举两个1之间的距离,然后二分跳到0即可
反正没什么脑子
code:
http://zhengruioi.com/submission/144514
路径长度
对于一个点,记录1到它的所有距离,分析后可以发现
对于三个距离
x
,
y
,
z
x,y,z
x,y,z若满足
1
1.1
<
=
x
<
=
y
<
=
z
\frac{1}{1.1}<=x<=y<=z
1.11<=x<=y<=z那么y这个距离是没有用的
所以对于每个点只用保留log个距离就行了
l
o
g
log
log的底数是1.1
http://zhengruioi.com/submission/147974
动态矩阵最短路
分析一波发现就3种情况
- "井"字形
答案就是曼哈顿距离 - "z"字形
中间那条杠在中间就是曼哈顿距离,否则就找最近的 - 之间的所有行或列都出现过
就是曼哈顿距离
就是写起来有点烦
code:
http://zhengruioi.com/submission/226245
Day 4
http://zhengruioi.com/contest/408
阴间题
不会
Day 5
http://zhengruioi.com/contest/411
同上
Day 6
Digit
分析一波,发现就是(P-1)的约数个数
然后无脑冲就是了
具体分析就是把y写出来,然后发现P和1关于x同余
code:
http://zhengruioi.com/submission/165434
Gcd
设
f
(
n
)
是
要
求
的
\large 设f(n)是要求的
设f(n)是要求的
设
g
(
d
)
=
∑
d
∣
n
f
(
n
)
\large 设g(d)=\sum\limits_{d|n}f(n)
设g(d)=d∣n∑f(n)
g
g
g的意思就是把第二个条件改成
d
∣
g
c
d
(
b
1
.
.
.
.
b
n
)
d|gcd(b_1....b_n)
d∣gcd(b1....bn)
考虑
g
g
g怎么做?
然后反演一手就是
f
f
f了
- 对于k=0
显然答案就是 g ( d ) = ( m d ) n \large g(d)=(\frac{m}{d})^n g(d)=(dm)n - 对于k!=0
要先记一个 c n t [ d ] cnt[d] cnt[d]表示 d ∣ a [ i ] d|a[i] d∣a[i]的个数
然后 n − c n t [ d ] n-cnt[d] n−cnt[d]个肯定是满足 b [ i ] ! = a [ i ] b[i]!=a[i] b[i]!=a[i]的,这一块的答案就是 ( m d ) n − c n t [ d ] \large (\frac{m}{d})^{n-cnt[d]} (dm)n−cnt[d]
对于满足 d ∣ a [ i ] d|a[i] d∣a[i]的 k − ( n − c n t [ d ] ) k-(n-cnt[d]) k−(n−cnt[d])个中每个位置只能取 ( m d − 1 ) \large (\frac{m}{d}-1) (dm−1)个
最后剩下的那些位置和第一种一样随便填
反演回
f
f
f就没了
code:
http://zhengruioi.com/submission/320188
Day 7
dls的生日礼物
挺有趣的一道题
首先以左端点为第一关键字,右端点为第二关键字排序
记录两个值,
mx表示更靠右的那个右端点
mxx表示另一个集合的右端点
考虑加入一个区间[l,r]
分两类情况讨论
如果l<mxx说明无解
如果l<mx说明这个区间只能放在另一个集合里
令mxx=r,然后如果mxx>mx就swap
如果l>mx说明两边都可以放,答案*2,然后令mx=r