noi2021题目分析大纲

写在前面
金牌线 393
银牌线 205
100银 282

文章目录

  • day1T1
      • n , m < = 5000 n,m<=5000 n,m<=5000
      • A , B / A A,B/A A,B/A
      • B B B
      • n , m < = 2 e 4 n,m<=2e4 n,m<=2e4
      • n , m < = 1 e 5 n,m<=1e5 n,m<=1e5
  • day1T2
      • k = = 2 k==2 k==2
      • B B B
      • n < = 10 n<=10 n<=10
      • n 1 = n 2 = . . . = n k / A n_1=n_2=...=n_k/A n1=n2=...=nk/A
      • 正解
  • day1T3
      • n , q < = 5 , k = 0 / n < = 1000 n,q<=5,k=0/n<=1000 n,q<=5,k=0/n<=1000
      • m = n − 1 m=n-1 m=n1
        • k = 0 k=0 k=0
        • k = 1 k=1 k=1
        • k = 2 k=2 k=2
      • 正解
  • day2T1
      • 数据点 1,3
      • 数据点 8,9
      • 正解
  • day2T2
      • n , q < = 2000 n,q<=2000 n,q<=2000
      • A A A
      • B , C B,C B,C
      • C C C
      • 正解
  • day2T3
      • 算法1
      • 算法2
      • 算法3
      • 算法4
      • 算法5

day1T1

据说有类似原题

染色[SDOI2011]

n , m < = 5000 n,m<=5000 n,m<=5000

暴力标记
喜提30

A , B / A A,B/A A,B/A

区间修改+单点修改+区间查询线段树
喜提20

B B B

树剖线段树维护标记

因为查询点必定为父子关系,所以考虑把操作1换成区间修改的“修改的最晚时间是什么”

查询的时候只要考虑这两个点的最晚修改时间是否相同

(其实这个是和正解最接近的部分分)

喜提20

n , m < = 2 e 4 n,m<=2e4 n,m<=2e4

不知名log^3做法(并没有找到也没有想到什么参考)

估计是给正解常数大的人

10pts

n , m < = 1 e 5 n,m<=1e5 n,m<=1e5

树剖线段树,维护区间左边颜色,区间右边颜色,区间内重边数目

20pts

day1T2

(吐槽)据说是过了一车人的LGV,不过…

据说和CF167E大致相同

CF167E

很容易观察到题目考察的内容——交点数的奇偶性——只与两条路径的起点与终点有关系。

如果起点是1,2,3,…n,终点是 p 1 , p 2 , p 3 . . . p n p_1,p_2,p_3...p_n p1,p2,p3...pn

那么交点数的奇偶性就是 p 1 − n p_{1-n} p1n 的逆序对数

k = = 2 k==2 k==2

邻接矩阵的行列式的答案

35pts

B B B

(感觉意思就是保证每一层的节点数都是1)

20pts

n < = 10 n<=10 n<=10

估计是乱出的,我感觉它是想出个 2 10 ∗ 2 10 2^{10}*2^{10} 210210的dp,然后数据范围出错了…(但是砍掉一半好像也没法做)

咨询了一些人 姑且把它当做乱出处理了
不包含AB,10pts (是不是给正解数组开小的人的)

n 1 = n 2 = . . . = n k / A n_1=n_2=...=n_k/A n1=n2=...=nk/A

行列式的值乘起来

(已经和正解非常接近了qwq)

(没有计算包含B的) 20pts

正解

乘起来的行列式/或者说lGV定理 不过如果是从上面的部分分推过来的话,其实可能会跳过LGV这一步

至于为什么行列式乘起来不对:喂喂,你的行列式是正方形耶…

但是不同的点数之间可能会出现长方形

20pts

day1T3

注意到题目只考虑可达性 因此要考虑缩点

自闭了我读错题了 我一直以为 加的两条边是可以钦定的 没想到是题目给定的 我恨…

所以我的那个new idea是不是可以出题之类的)

n , q < = 5 , k = 0 / n < = 1000 n,q<=5,k=0/n<=1000 n,q<=5,k=0/n<=1000

考虑 一个点合法 当且仅当正向的时候 这个点能被 s s s 走到

边反向之后 这个点能被 t t t 走到

标记一下就好

复杂度应该是 m q mq mq,但是就是可以冲过去)

28pts

m = n − 1 m=n-1 m=n1

首先 这个条件转换完之后 是一颗外向树

具体来说 因为题目保证联通,又有一个限制,如果 x , y x,y x,y可以到达 z z z 那么x可以到 y y y 或者 y y y 可以到 z z z

也就是说 到达一个点会出现两种方式

如果出现这种情况 n − 1 n-1 n1 条边会不够用

因此是外向树

在这个条件下

k = 0 k=0 k=0

直接统计 8pts

k = 1 k=1 k=1

8pts

k = 2 k=2 k=2

12pts
noi2021题目分析大纲_第1张图片
贴一个分讨的做法…就不人工手写了(主要还是因为看错题了所以非常悲伤)


这里放一个 当k可以钦定时的想法

k=1

分类讨论一下

d [ x ] d[x] d[x]表示x的深度

如果 s , t s,t s,t是父子关系

如果 s s s 是子节点 那么从 s s s 往下最长链的叶子处 连一条边到根节点一定最优(答案是 s s s子树内的最长链+ d [ s ] d[s] d[s]

如果 t t t 是子节点 答案是max( s , t s,t s,t路径上的点,不经过 s , t s,t s,t路径的最长链)+ d [ t ] d[t] d[t]

否则 是 s s s子树内的最长链+ d [ t ] d[t] d[t]

维护的时候应该需要记录一下最长链,次长链,以及条数

k=2?


正解

所有做法的基础:
noi2021题目分析大纲_第2张图片
做法1: 结合外向树做法分类讨论

做法2: 结合暴力虚树

注意 要写 O ( 1 ) O(1) O(1) lca,不然会卡常到明年…

day2T1

数据点 1,3

bitset+unoerdered_map
O ( 25 6 k + 1   l o g   q ) O(256^{k+1}~log~q) O(256k+1 log q)
8pts
乱搞做法:(据说 没有深究正确性)

枚举有几位不一样 ,然后在trie上跑(也许可以多过几个k比价小的点)

复杂度是在 O ( 25 6 k q ) O(256^kq) O(256kq)左右(吧)

数据点 8,9

思路大致和上面相同 不过因为k=1,改成hash
8pts

正解

抽屉原理,转成16组,1<<16进制

day2T2

n , q < = 2000 n,q<=2000 n,q<=2000

暴力直接做

20pts

A A A

注意 F和R都会改变操作序列

所以意思就是F,R也不会使得操作序列出现连续相同段

所以可能出现的序列只有两种:

W E W E W E . . . WEWEWE... WEWEWE...
E W E W E W . . . EWEWEW... EWEWEW...

比起维护当前序列,直接维护两种可能的序列,判断当前是哪种直接输出应该更简单

注意 每次添加数的时候 虽然是加在了最后,但是实际做的时候,效果应该是原来有…然后最前面多了一项

15pts

B , C B,C B,C

从这里往下的每一档部分分 都需要推出矩乘

不会平衡树15pts

C C C

不会平衡树维护reverse 20pts

正解

操作W对应

( 1 1 0 1 ) \begin{pmatrix} 1 & 1\\ 0 & 1 \end{pmatrix} (1011)

操作E对应

( 1 1 1 0 ) ( 1 1 1 0 ) ( 1 − 1 0 1 ) = ( 2 − 1 1 0 ) \begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix}\begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix}\begin{pmatrix} 1 & -1\\ 0 & 1 \end{pmatrix}=\begin{pmatrix} 2 & -1\\ 1 & 0 \end{pmatrix} (1110)(1110)(1011)=(2110)
noi2021题目分析大纲_第3张图片
之所以这样讨论 是因为当最后一项不是1的时候 用的是第二种情况,最后一项是1时,用的是第一种情况,但我们发现,当最后一项是1时,用第一种和第二种得到的答案相同,因此默认都用第一种就好了

最开始的初值是

( 1 1 1 0 ) ( 0 1 1 0 ) = ( 1 1 0 1 ) \begin{pmatrix} 1 & 1\\ 1 & 0 \end{pmatrix} \begin{pmatrix} 0 & 1\\ 1 & 0 \end{pmatrix}=\begin{pmatrix} 1 & 1\\ 0& 1 \end{pmatrix} (1110)(0110)=(1011)

注意 rotate是关键字…建议不要关codeblock的代码补全 起码不会撞关键字)

30pts

day2T3

吐槽一下…题解第一篇的all没有任何实际含义,纯纯是为了减掉0那个时候的容斥值,想了好半天…
noi2021题目分析大纲_第4张图片
再吐槽一下

注意这个条件

你以为这个条件没有任何用处?

不 你太naive了

这个条件的用处是:对于一种钦定完之后会爆炸的序列,它有一种合法方案,为全填空

所有的代码参考见这个博客

大佬的博客

算法1

暴力dfs+验证(hash)

注意 因为得到的最终的纸带不同会记做不同方案,所以每个点都要验证

复杂度 O ( 3 m n n 2 m ) O(3^{mn}n^2m) O(3mnn2m)

可以过掉点123

12pts

算法2

我会容斥!

考虑枚举 i i i 表示对于一些纸条来说,可以作为起点,且均合法的点集合(状压表示)

然后一一枚举过程中走到的第 r r r 个位置

可以计算出当前走的是第几步

然后可以判断, r r r这个位置可能的结尾值都有什么

接着判断每个方块对应的开始,结尾的值都可能是什么

那么容斥在哪里呢?

具体来说 比如一个纸条 可以以1,2位置为起点 那么以1的时候会计算一次 以2的时候会计算一次,以12的时候仍然会计算一次

所以需要容斥

记枚举到的合法的点数为 k k k 容斥系数是 ( − 1 ) k + 1 (-1)^{k+1} (1)k+1

复杂度 O ( n 2 2 n m ) O(n^22^nm) O(n22nm)

可过12347 20pts

可以发现 复杂度瓶颈主要在 2 n 2^n 2n

算法3

我会优化算法2!

考虑枚举最后一个合法位置 r r r

那么我们就可以发现走的距离大于 c > n − r c>n-r c>nr 的一定会爆炸

那么其实 我们前面记录的距离一定是 m i n ( r , n − r ) min(r,n-r) min(r,nr)

这样复杂度就变成了 O ( 2 n / 2 ) O(2^{n/2}) O(2n/2)

具体来说 我们转移的时候需要维护min的状态,min前面是否出现过一个转移点

做dp的时候处理当前位置,做完 r r r结尾的dp之后 再处理 r r r之后的位置

(详情见代码)

喜提ex28pts

算法4

我会优化算法3!

具体来说 这个算法不再循环M,考虑在bitset里维护 r c [ i ] [ o p ] rc[i][op] rc[i][op] 表示往后走 i i i 的位置 状态为 o p op op 的机器人都有哪些

那么统计答案的时候 只要把bitset对应算法3做相应的操作,再统计有多少个位置有值就好

复杂度 O ( n 2 m 2 n w ) O(\frac{n^2m2^n}{w}) O(wn2m2n)

(分数比起上一档来说没有显著变化)

算法5

注意到 m − > m w m->\frac{m}{w} m>wm

2 n − > 2 n 2 2^n->2^{\frac{n}{2}} 2n>22n

在这两项上我们很难再有所突破 所以转而考虑 n 2 n^2 n2

注意到 我们在维护bitset的时候 每次都会扫一遍当前枚举到的状态 i i i 这其实很没有必要

具体来说 比如两个状态的二进制表示是 1000001 , 1000000 1000001,1000000 1000001,1000000

我们发现 只有最后一位不一样

因此我们可以结合lowbit的思想 具体来说,不每次去扫状态 i i i

改为 f [ i ] [ o p ] = f [ l b ( i ) ] [ o p ]   ∣   f [ i   x o r   l b ( i ) ] [ o p ] f[i][op]=f[lb(i)][op]~|~f[i~xor~lb(i)][op] f[i][op]=f[lb(i)][op]  f[i xor lb(i)][op]

共计得分100

(老实说 这个题的思维难度真的很大…)

你可能感兴趣的:(题解,题解)