NOI2021
Day1
轻重边
-
这个题很明显就有树链剖分的感觉,但是这个路径比较难搞
-
可以发现每一个重边一定是在一次操作 1 中的路径上的一条边,并且两个端点,没有被其他的操作 1 覆盖过
-
那么我们为每一个端点赋一个时间值
-
那么问题就转换成了树上的一条路径有多少对相邻且值相等的点对
-
这个明显就可以合并信息了,那么就可以上树剖做了
总结
- 树链剖分
路径交点
-
这个题可以说其实是在卡科技,如果知道 LGV 引理就很简单,如果不知道那可能就没什么思路了
-
这个题和 LGV 引理的特征太相似了,事实上 LGV 引理的特征也确实太特殊了
-
起点点集和终点点集大小一样,无向图路径无交点计数
-
这个图不在网格内,所以我们需要考虑 \((-1)^{\sigma(P)}\) 的系数影响
-
然而题目中求的是 偶数 - 奇数 ,大胆猜测偶数代表 \((-1)^0\) ,奇数代表 \((-1)^1\) ,直接套 LGV 引理
-
因为幂次是相加的,奇偶数又是很特殊的数字,所以可以考虑每对逆序对的贡献
-
其实就是要证明对于两个点如果最终对应的节点组成逆序对,那么路径交点一定为奇数,反之一定为偶数
-
这个可以用数学归纳法来证明,此处就不证明了
-
所以只要我们能得到最后的行列式,直接算就可以了
-
考虑 \(e(u,v)\) 怎么算,有两个方法
- BFS ,整个图是个 DAG
- 每一层用矩阵表示用矩阵相乘直接得到最后的矩阵
-
复杂度是一样的,我用的方法 2
-
唯一要注意的是取模不要直接取模,自己写一个取模函数,实测会快很多,否则会一直 65 分
总结
-
LGV 引理 + 高斯消元
-
这个题感觉就是卡科技
update 2022.6.8
-
今天看到了一个博客,听说当年这个题一车人都过了,感觉非常的危,因为我感觉我第一眼看这个鬼题特别懵逼,然后就开始重新思考这个题,也就是当不知大 LGV 引理的时候,我们应该怎么做这个题
-
实际上对于偶数减奇数的方案数一般的想法就是用 \((-1)^k\) 来表示
-
首先观察对于 k=2 的情况,那么实际上交点的奇偶性就是相应的排列的逆序对的个数
-
然后考虑将这个逆序对的个数搞到 \((-1)\) 的幂次上去,然后这就可以想到行列式了
-
因为行列式求值最基本的定义就是 \(\sum (-1)^{t} a_{1,p_1},a_{2,p_2},...\)
-
那么拿邻接矩阵直接求行列式就可以做了
-
然后感觉这个方向非常有搞头,我们考虑怎么一步步递推到终点
-
考虑两个相邻的邻接矩阵相乘后的意义,可以发现 \((-1)\) 的幂次相加了,也就是逆序对相加了,也就是说非常的正确
-
但是感觉只对 \(n_i\) 都相等的情况是正确,如果单单考虑值相乘,然后你会发现这就有 75 分了!嗯....
-
直接这么做,最终求行列式的值就是正确的,听说有人场上交了一发惊讶的发现竟然过了...
-
为什么是对的呢,你考虑最终的一个 \(n\times n\) 的矩阵的每个数的意义,然后就感觉很对
-
不过最终你会知道这玩意就是 LGV 引理
-
所以考试的时候要勇于写 “错解” !说不定就是对的呢!我记得 AHOI2022T1 我当时考的时候也是被骗到了
庆典
-
首先考虑暴力分,可以发现一个点可以作为贡献当且仅当 S 可以到达自己,自己可以到达 T
-
那么做一个 \(floyd\) 的传递闭包,应该就可以了
-
再看树结构,我们规定父亲指向儿子,那么一定是个根向叶的一棵树
-
\(k=0\) 的时候,判断一下就可以了
-
对于 \(k=1|2\) ,如果分类讨论的话不太现实,考虑先建出有关点的虚树,边权为两个点链上
-
显然最后的答案只和这个虚树有关
-
我们再将题目所要添加的边加上,这个边权不是很方便,考虑全都拆成点权
-
那么就变成了一个有向图,有点权,问最终的答案
-
注意到虚树中的点很少,那么这个不就是基础暴力的询问,但是这个就不能那么暴力了,因为 \(n^3\) 过不了
-
然后经过亲身实践你会发现 \(n^2\) 也过不了,必须 \(O(n)\) 才行
-
\(O(n)\) 肯定不能直接求传递闭包了。注意到上述第一句话所说的,这个题目的本质。
-
那么考虑从 S 出发将能到达的点打个标记,然后在反图上从 T 出发对于能到达的并且有标记的点,计算贡献,那么就做到了 \(O(n)\)
-
这里的 \(n\) 是指每次询问后的点数,显然是 \(O(k^2)\) 级别的,可以过
-
现在我们看最后的分,一个有向图
-
到此我们仍然没有用到题目所给的条件,但是最低档的暴力做法其实是给了提示
-
对于答案是和传递闭包有关
-
那么再看这个题目给的特殊条件,假设存在 \(s\to v,t\to v\) ,那么 \(s,t\) 之间有边,假设是 \(s\to t\)
-
那么如果将 \(s\to v\) 这条边去掉是完全不会破坏整个图最后的传递闭包
-
那么我们先缩点,那么图就会变成一个 DAG ,每个点的权值为强连通中点的总数
-
然后我们在新图上去掉那些没有用的边,可以发现最后每个点的入度唯一,那么就是一颗树了
-
具体可以体现为拓扑排序的时候每个点的父亲定为拓扑序更大的点
-
所以最终就是需要在一棵树上求解答案,那么就又回到之前说的中档分了
总结
-
缩点 + 虚树
-
这个题目还是比较难想的,代码也是难打,我打了 5k ,还要卡常,总体来说还是很恶心的,但是这个题目的思想确实挺好的
-
关键还是在于要观察特征,树结构是根向叶的结构,图最后能转换成树结构,发现图的结构是解题的关键
-
可以发现这个题目的部分分是环环紧扣的,每个部分都要想清楚,所以思考部分分是很重要的
Day2
量子通信
-
注意到 \(16^2=256,k\leq 15\) ,这是这个题的突破口
-
也就是如果将每个字符串以 16 为一块,那么符合要求的字符串一定至少有一块是和题目给的字符串的块相等
-
那么我们通过这个将这样的字符串先取出来,然后再一一判断,具体的还需要先预处理出每一块值为多少的字符串编号集合
-
两个字符串判断仍然可以将每一块对应的数异或起来,预处理出 \([0,2^{16}-1]\) 的每个数的 1 的个数,就是这一部分不一样的数的个数
-
看起来很暴力,但是要注意到这个题目的 数据随机 !
-
也就是每次期望被拿出来的数的个数为 \(O(\frac{n}{2^{16}}\times 16)=O(\frac{n}{2^{12}})\) ,每个数判断的复杂度为 \(O(16)\)
-
那么整个的复杂度为 \(O(\frac{nm}{2^8})\)
-
注意不要用
vector
,注意卡常! -
参考代码 这个是被卡常了的代码,所以仅参考
总结
-
随机化 + 乱搞
-
这种题型还是很奇怪的,我是第一次遇到
-
对于这种题可以先考虑比较暴力的做法,然后计算期望复杂度
密码箱
-
对于最终的连分数大概分析一下,发现每个操作其实对应一个矩阵,最终答案的分子和分母就是乘上一系列的矩阵得出来的
-
对于第一种操作,矩阵还是比较好构造的
-
对于第二种操作,你会发现矩阵的还要分类讨论?但是实际上两种情况最终要乘上的矩阵是一样的
-
所以对于每一种操作对应要乘上一个矩阵,因为还涉及到区间反转这种东西,那么拿平衡树维护一下就可以了
总结
-
找规律 + 平衡树
-
首先要将分子和分母看成一个 \(2\times 1\) 的矩阵的形式,然后要看出来第二种操作不应该要分类讨论,因为如果你分类讨论第二种操作,那么这个题目就完蛋了