XN2025 集训记录 D11
今天就进入四月份了啊 ... 回顾这一个月 , 应该总还是是有一定的进步的 , 当然这个东西比较不可量化 .
感觉上模拟赛的思路是对的 , 不用担心别的 , 就有规律地打好比赛 , 尽可能拿分 , 回头看看题学一些有趣的思路 , 就很好了 , 其他的还能做什么呢 ? 都到这个程度了 , 除了少数算法和知识还要再熟练 , 其他可以称为 "内容" 的也就是做各种题 , 感受各种思路 , 而模拟赛一方面能看到各种各样的人出的 , 搬的题 , 另一方面也是构造了一个独立生成思路的过程 , 挺不错的 .
就是正反馈和负反馈相对于平淡的做题会放大很多 , 正好也算是锻炼心态了 .

大样例不给出题人 .
( 这里有一段鸟语花香 )
水题场 .

因为大样例没有给出题人所以分挂了 T3 .
模拟赛 255/300
呜呜呜我的 AK 场啊.

纯纯是没有大样例导致的 , 写个 T1 签到还得特意写个暴力 , 剩下俩题更是没法调 , 一个 T2 输出一大坨 , 一个 T3 都没啥靠谱暴力好写 , 这能有两道题不挂也真是烧高香了 . 这 T3 平面矩形 , 还得不交 , 这去哪里构造啊 , 这只能丁真调题 , 鉴定为昨天 T1 的奶龙制造机制造出来用于米哈游面试的幽默题 .
题目反正也全水题 , 这个 T1 和 T3 不知道是怎么好意思放到这两个位置上 , 甚至是省选模拟赛 , 感觉不如 NOIP 了都 .
T2 倒是有点意思 .
T1 题意
\(n\times n\) 棋盘格里放 \(k\) 个象 ( 国际象棋 ) , 使象两两无法互相攻击的方案数 .
\(n=1000\) .
T1 题解
考虑 dp , 发现每一个对角线的长度不同 , 方案数也不同 . 先把黑白格分别 dp , 考虑从短往长填 , 这样如果之前填了 \(j\) 个 , 这一对角线就必然有 \(j\) 个不能填 , 所以状态只记录 dp 到第几个对角线 , 填了几个就好了 , \(O(1)\) 转移 . 最后把黑白格卷一下 , 复杂度 \(O(n^2)\) .
这种题为什么会出现在 NOI 的模拟赛上 .
T2 题意
CF1458C .
有一个 \(n\times n\) 的矩阵 \(a_{i,j}\) , 每个行向量和列向量都是一个 \(1\cdots n\) 的排列 , 有以下若干中操作 :
R
对每个行向量循环右移一位 .L
对每个行向量循环左移一位 .D
对每个行向量循环下移一位 .U
对每个列向量循环上移一位 .I
对每个行向量视作一个置换 , 把它变为它的逆置换 .C
对每个列向量视作一个置换 , 把它变为它的逆置换 .
其中 , \(p\) 的逆置换即满足 \(p_{p^{-1}_i}=i\) 的置换 \(p^{-1}\) .
给出一个长为 \(T\) 的操作序列 , 求 \(a\) 依次进行所有操作之后的结果矩阵 .
\(T\le 10^5,n\le 800\) .
挺有意思一题 .
首先考虑前四个操作快速做很简单 , 只需要累加 $x $ , \(y\) 方向上的位移 , 最后统一位移依次就好了 .
考虑加入操作 I
, 这时发现如果只有 I
的话 , 操作 II
相当于没有操作 , 而 I
与其他操作相结合可以有一些变换 , 也可以理解出找出这些操作之中的某些运算律 . 先给出 I
的意义 , 相当于把第 \(i\) 位变为原排列的 \(pos_i\) .
考虑操作 RI
, 相当于每个 \(i\) 的 \(pos\) 都循环 \(+1\) , 那么操作 I
之后相当于对原 \(pos_i\) 进行了一次循环 \(+1\) .
这里引入操作 +
和 -
, 分别表示对每一个值循环 \(+1\) 或 \(-1\) , 意义是如果得到的值为 \(n+1\) 就视为 \(1\) , 如果得到的值为 \(0\) 就视为 \(n\) .
引入表示 (xY)
表示把 Y
操作进行 \(x\) 次.
那么就有结论 :
-
RI
=I+
.同理 , 有
(xR)I
=I(x+)
以及(xL)I
=I(x-)
. -
+I
=IR
, 可以理解为原序列每个位置循环 \(+1\) 的话 , 对应的 \(pos\) 序列就会循环移位 .同理 , 有
(x+)I
=I(xR)
以及(x-)I
=I(xL)
. -
UI
=IU
,DI=ID
.U
与D
操作与I
无关 , 它们可以与I
任意调换 .
这些操作的意义是让这六种操作可以与 I
交换 , 而这六种互相之间又有交换律 , 所以仅考虑它们和 I
的情况下 , 可以对序列进行调整 , 使得所有其他操作全在 I
的前面 , 而 II
可以消去 , 所以总共的 I
操作最多有一次 , 总复杂度 \(O(n^2)\) .
考虑加入 C
, 与上面讨论类似地有对 C
的结论 .
-
(xD)C
=C(x+)
,(xU)C
=C(x-)
. -
(x+)C
=C(xD)
,(x-)C
=C(xU)
. -
LC
=CL
,RC=CR
.
因此仍然可以把这六种操作提前处理好 , 相邻的 II
和 CC
消掉 .
现在仅剩的问题是交替的 IC
或 CI
结构的处理 .
发现每次仅从行向量或列向量的角度看 IC
结构 , 几乎是完全打乱的 , 因此很难再从刚才运算律的角度来解决这道题 .
通过观察发现 , 若干次 IC
操作似乎有循环节 , 搜一下发现循环节很小 , 一般是 6 .
考虑证明一下循环的问题 , 考虑把每个位置表示成独立的 \((i,j,a_{i,j})\) , 则 I
操作相当于 \((i,a_{i,j},j)\) , C
操作相当于$ (a_{i,j},j,i)$ , 而每个点最多有 \(6\) 种排列方式 , 之后的置换一定会重复 .
因此搜出循环节 , 直接对不完整循环节的部分暴力做 I
和 C
即可 .
题解给的版本是上矩阵维护 , 感觉不如找循环节适合考场 .
当然看出三维交换这个事情还可以直接维护当前顺序是怎样的 , 以及 \(LRUD\) 操作对每一维的修正 , 最后得到的结构对每个点都适用 , 直接构造 , 写起来更简单了 .
T3 题意
平面给出 \(n\) 个相互没有交点的矩形 ( 可能有包含关系 ) , 有 \(m\) 个询问 , 给出上述矩形当中的两个 \(a\) 和 \(b\) , 已知当前有一个点被 \(a\) 包含 , 且 \(a\) 是包含它的最小矩形 , 想要到达一个被 \(b\) 包含 , 且 \(b\) 是包含它的最小矩形的位置 , 求最少要经过多少条矩形的边 .
\(n,m\le 10^5\) .
这种仅包含的关系可太经典了 , 可以建成一棵树 , 然后发现询问其实就是在询问在树上 \(a\) 和 \(b\) 的距离 .
建树也是经典操作 , 扫描线一维 , 线段树里面套个栈 , 每次取出所有被包含的点 , 这里因为是仅包含关系所以随便找个端点插入线段树 , 就能保证查询时能查询到 .
而且从左到右扫刚好保证了每个点被最小的覆盖它的矩形查询到 , 因为如果 \(x\) 和 \(y\) 都包含 \(z\) 且 \(x\) 包含 \(y\) , 必然满足 \(x\) 的最大横坐标大于 \(y\) 的最大横坐标 , 先扫到的一定是 \(y\) .
然后没了 . 别人放 T1 的题放 T3 , 无敌了也是 .
欸 , 下午又放了一个题单 , 是杂题 .
不过明天不是图论吗 .
刷题单真模拟赛爽吧 . ( 模拟赛特有肾上腺素过山车 ) .
全都不会做啊 .

欸我是要去学 fwt 的 , 怎么开始看曹队博客了 ( .
唉 , 又幻想了 . 幻想现在是 2024 年 5 月 , 自己还在高一 , 无忧无虑地追随着 lx 老师作自己的努力 , 曹队 , lpf 老师还在机房 ;幻想自己跟着曹队去打 THUSC 2024 , 虽然分寄了但是也没那么在意 , 开心地逛余姚的街街巷巷 , 顺便为 lx 老师拿下一等衷心高兴 ; 幻想自己跟着 lx 老师去集训 , 天天模拟赛摆烂 , 看其他同学搞抽象 , 给 lx 老师点外卖赤 .
还真是容易沉浸在过去啊 .
一个个使人欢喜使人愁的瞬间 , 不止息地从现实流进记忆 , 总有一天我们会明白那是什么 , 那就是塑造了我们的一切事物 .
那是家 , 是雪花飘飘的黑夜里沉默的足迹 , 是背后路灯的鹅黄色的光 . 只不过这个冬夜虽然温暖 , 前面的路还在等待 .
于是它们终于幻化成晴朗的景象 , 出现在耀眼的梦中 .
我学会 FWT 勒 !
FWT
其实要构造一个贡献函数 \(c(i,j)\) , 根据位运算特性把 \(c(i,j)\) 拆位 , 再根据推式子得到同构形式有 $c(i,j)c(i,k)=c(i,j\oplus k) $ , 根据不同的运算构造出 \(c\) 对应的矩阵并要求可逆 .
构造后发现对于每个运算 , FWT 的贡献系数其实各有两套 , 只不过选取了有位运算意义的一组 :
- \(or\) : $c(i,j)=[i \ \mathrm{and}\ j=j] $ , 相当于子集枚举 .
- \(and\) : $c(i,j)=[i \ \mathrm{or}\ j=j] $ , 相当于覆盖集枚举 .
- \(xor\) : $c(i,j)=(-1)^{i\ \mathrm{and}\ j} $ , 相当于讨论 \(|i\ \mathrm{and}\ j|\) 的奇偶性 .
这些特殊意义一方面可以帮助理解和记忆 , 另一方面 , 有些题目可能会构造相关的形式 , 反过来引出 FWT .
另外 FWT 是线性的 , 有 \(FWT[A]+FWT[B]=FWT[A+B]\) 以及 \(FWT[cA]=cFWT[A]\) .
另外 FWT 还有一个向值域 \(k\) 的 拓展版本 .
\(or,and,xor\) 可以分别扩展值域到 \(k\) 时的 "每一维取 \(\max\)" , "每一维取 \(\min\)" , "每一维上的值相加并 \(\bmod k\) " 三种操作 . 贡献矩阵分别是高维前缀和 , 高维后缀和 . 最后那个需要单位根状物 , 比较复杂 , 感觉也不是很实用 .
最后 , 使用 FWT 有更快的子集卷积 . 用 FWT 保证 \(i=j\ \mathrm{and}\ k\) , 另一个条件转化成 \(|i|=|j|+|k|\) . 因此把序列 \(a\) 按照 \(|i|\) 分层 , 有 \(a'_{i,j}=[|j|=i]a_j\) . 则 \(a_i=\sum b_j*c_{i-j}\) , 复杂度 \(O(n^2 2^n)\) , 比直接子集枚举的 \(O(3^n)\) .
这东西真有什么用吗.jpg
来都来了又不难就学一下.jpg
结果一晚上还是被神秘 FWT 推式子题上市了 .
哎我推式子题怎么这么坏 .
这些东西都是怎么构造出来的啊.jpg