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,biab
然后对于当前的人,考虑他是加入成为组长,加入一个只有组员的组,还是作为组员,单独开一个只有组员没有组长的组
按照这个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)=dnf(n)

g g g的意思就是把第二个条件改成 d ∣ g c d ( b 1 . . . . b n ) d|gcd(b_1....b_n) dgcd(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] da[i]的个数
    然后 n − c n t [ d ] n-cnt[d] ncnt[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)ncnt[d]
    对于满足 d ∣ a [ i ] d|a[i] da[i] k − ( n − c n t [ d ] ) k-(n-cnt[d]) k(ncnt[d])个中每个位置只能取 ( m d − 1 ) \large (\frac{m}{d}-1) (dm1)
    最后剩下的那些位置和第一种一样随便填

反演回 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

posted @ 2021-04-29 15:56  lahlah  阅读(44)  评论(0编辑  收藏  举报