20211013省选组
T1 送你一个DAG
将式子列出来之后,拆开 \(m^k = \sum_{i=0}^k {k \brace i} m^{\underline k}\) ,
转变求和顺序,\(m^{\underline k}= k! {m \choose k}\) ,组合数有杨辉三角的规律可以直接合并。
T3 送你一棵圣诞树2
赛时暴力没打出来好痛苦QwQ
主要是题意的转化:
原题等价于给树上每个点赋一个 \(\left[1,k\right]\) 的权值,要求相同权值的点两两之间,必须相隔有至少一个权值较小的点,求方案数。
容易发现实际上,原题中的 \(father\) 就是权值的大小关系,可以直接丢掉(
考虑DP,设 \(f_{u,S}\) 为以 \(u\) 为根的子树的方案数,对于每个 \(k \in S\) 的权值都存在仍未满足条件的点。
20211014省选组
因为不想打细节题所以滚来写总结了
这套题面过度玩梗。。。
T1 Hello my friend
题意:树上每个点有黑白两种颜色,如果是黑色则每次走到都有贡献,白色则只有一次贡献,问从点 \(1\) 开始的期望。
(定位是签到题,然而爆零。。。)部分分的提示非常明显
考虑将黑白两种颜色分开做,黑色是经典题目(指不知道叫什么),每个点 \(f_u\) 的表达式都可以写作 \(f_u = k_u f_{fa} + b_u\) 的形式,用这个形式一直转移到 \(1\) 即可, \(b_1\) 即是答案,若是白色点则不计算贡献,将表达式中的 \(+1\) 去掉。
白色的话就是求每个点被到达的概率,维护 \(f_x\) 、 \(g_x\) 分别表示 \(x\) 走到 \(fa_x\) 和 \(fa_x\) 走到 \(x\) 的概率, \(DP_x\) 表示到达 \(x\) 点的概率,像换根DP一样求即可。
注意有两个数据是不符合题目所给 \(d_1>1\) 的条件的( \(d_x\) 为点 \(x\) 的度数)。
T2 Try to find out the wrong in the test
题意:将一个序列分成一些连续的区间,每个点有一个 \(L_i\) 、 \(R_i\) 表示该点所在区间的大小上、下限,要求分出的区间最多,并求出方案数。
首先 \(n^2\) DP是显然的嘛,然后考虑优化。
这个整个是不具有单调性的。。。不要卡死在一个点上了。。。
但是满足 \(R\) 条件的区间是具有单调性的,因此可以对于每个点维护出 \(Left_i\) 表示能转移到该点的最左点,可以用单调队列实现。
然后考虑分治,每次将 \(L\) 最大的点作为分治中心,设该点为 \(L_k=c\),用左边更新右边。
此时我们就知道了每个区间的最小长度,
根据 \(Left_i\) 给 \(i\) 分成 \(Left_i \le l\) 、 \(l < Left_i < k\) 和 \(k \le Left_i\) 三段,
最后一段没有贡献,中间的贡献区间不确定,暴力转移,
前面的一段我们发现有 \(i \le k+1-c\) 和 \(i > k+1-c\) 之分,前者相邻两个 \(i\) 之间的贡献区间只差 \(i-c+1\) 这一个,对于第一个用线段树求解后可直接更新;后者每一个的贡献区间都是一样的,将答案标记打到整个满足条件的区间上即可。
T3 【JSOI2015】投影面积(light)
题意:平面上有一个屏幕和一个光源,还有若干个反射或阻挡的障碍物,求屏幕被照亮区域的占比。
将光线分离成几十万条后暴力判断是否可以到达屏幕。
暴力细节题。。。恶心坏了
20211016 A组
照例讲完题先写总结再改题(
还是得稳当一点,先打暴力再试结论,对拍不能少。。。
T1 厜蓧篈壻鑨(1ysa93e)
可以说是非常简化版的生命游戏了,
而且确实签到题,虽然爆零了。
考虑一个点 \(k\) 时刻扩散出的面积 相当于 用 4 个与其相邻点 \(k-1\) 时刻扩散出的面积并。
因此可以二分答案,令一定不会爆的点放置为初始点,让其生长。
T2 鞩铃夐鑏繦(snow)
百度之星2021复赛T3弱化版(这就是不改题的后果吗。。。)
这里直接讲原题吧。
让答案算满再考虑减,如果我们让每个点都复制成原本的 \(p_i\) 倍,此时每个点便有 \(a_i \times p_i\) 个,两个相邻点匹配即可让答案减一,问题变成求最大匹配。
我们发现,实际上,一个点的匹配连向哪些点是不会对答案产生影响的,反而可能留给 \(fa\) 的太多而浪费。
所以每个点如果能跟儿子连就尽量连。
T3 蘄壺螸壚黜(rainbow)
T4 Extra
20211018提高模拟
真是没什么好说的了又被点名。。。
主要是时间没有安排好,习惯了省选组暴力都写不出的日子。。。
T1 doubt
给出数组 \(a_i\) 和 \(b_i\) ,将其排序使 \(c_i=a_i \oplus b_i\) 的字典序最小。
像 Trie 一样分位做就行。
T2 葡萄庄园(grape)
题意不写了。
枚举在那个点改变颜色,两个连通块大小减去交集。
T3 决斗(fight)
跟第一题差不多。。。吃了没有看完全部题的亏。
分位做,两边的连接用 Tire 找最优解。
T4 ckw的和(sum)
真真挺妙的,没想到绝对是我的问题。
题意:给出数组 \(a_i\) 和 \(n\) ,求在 \(\left[0,2^n \right)\) 中 \(i\) 的个数,使得 \(i \& a_j , \forall j \in \left[1,m\right]\) 二进制下 \(1\) 的个数是奇数,且 \(i \& x\) 二进制下 \(1\) 的个数也是奇数,\(x\) 在每次询问给出。
额。。。题目里说的是求下面这个式子,其实就是上面说的,
注意数据范围, \(n \le 60\) , \(m,q \le 10^5\) 。
联想到异或高斯消元,每个 \(a_i\) 或 \(x\) 都相当于是一部分位置的异或和为 \(1\) 。
每次读入一个 \(x\) 都做一次高斯消元显然太劣,我们把 \(a_i\) 的限制写成线性基形式,每次只用这个基处理 \(x\) 的限制即可。
由于元的个数只有 \(n\) 个,基的大小也至多为 \(n\) ,因此复杂度只需 \(O(nm)\) 。
20211029 联赛模拟
T1
总算赛时切一道数据结构题啦哈哈哈哈哈哈哈
还记得曾经有一道类似的, MoQZ 喷我写不出来,然后这次他没切(
考虑从左往右做,那么可用区间就是一些区间的交,线段树维护即可。
T2
绝对不是生成函数,发现 \(m\) 很小,枚举有多少对绑定的物品,于是可以列出一个式子,发现这个式子对于相邻的 \(m\) 可以直接转移,预处理一下逆元即可。
T3
不知道35分程序为什么爆零了QwQ
其实比赛时间安排还是有所欠缺,
20211030 联赛模拟
前一天晚上打 CF 太晚,导致9点才到机房,还一直困。
T1
一开始没有头绪,但是看题目形式一定是某种规律披了个皮,于是把序列打出表来。
这时就能看出显然的规律了:奇数位是原串,偶数位是反串。
于是偶回文前缀其实相当于一个 border ,哈希值的话拆成奇偶位算即可,然后写的貌似是 KMP?
然后就摸了一早上
T2
看明白了?没写
首先想到的肯定是维护上凸壳嘛~然后......就没有然后了。
问题在于不会动态维护凸包啊,删点加点什么的太难搞了。
考虑离线,将点都排序后插入就不需要二分找到位置了,以时间戳为下标建线段树维护区间内的凸包。
此外,如果我们将询问按斜率排序后查,它的最佳点就应该是单调的,所以就不需要二分啦!
update(11.01)
T4
首先这个可以轻易地用生成函数表示,
显然可以分治 NTT 爆算(
考虑优化的话,一段区间内的左半边可以直接求出右半边。
但这只是 70 ( / 80? ) 分做法,下面考虑线性做。
设
那么
于是有
这时候就可以解方程了嘛,因为我们有 \(\left[ x^m \right]F(kx) = \left[ x^m \right] F(x) \times k^m\) , 所以(跳过一段推导步骤)
这里, \(f_i = \left[ x^i \right] F(x)\) 。
然后就可以欢乐地递推了!
20211102 「冲国家队」模拟
然而这都是自己人出的题
T1
MoQZ 的题,出的时候给我讲过但没听( ,隐约记得有什么斯特林数之类的东西?(然而根本没用到。。)
做法比较暴力是根据 \(O(n^2)\) 推的。
先设 \(n\) 个位置任意排列,恢复原状的次数和 为 \(f_n\)
预处理出每个环的长度扔到桶里,即 \(t_i\) 表示 长度为 \(i\) 的环的个数。
考虑容斥,设有 \(i\) 个位置 \(A_i = B_i\) ,其他位置随意。
此时的答案是 \(f_{n-i} + (n-i)! \times i\) 减去钦定 \(i\) 个位置时的环总数,答案就是
问题在于后面,拿出来算
后面可以轻易地预处理,问题结束。
T2
先不看 \(S_1\) 的移动选取,只考虑两个字符串 \(S_1\) 和 \(S_2\) 的移动次数。
将形如字母转移的需求画成图,就是一个只有 \(4\) 个点的有向图,再考虑到自环就至多只有 \(6\) 条边。
考虑每一个环可以使答案减一,当点数只有 \(4\) 时任意两个环都一定会交,所以环的个数实际上就是最大边权。
然后要快速计算边权,对于 \(6\) 条边分别计算,发现对于每对对应的点 \(S_{2,i}\) 和 \(S_{3,j}\) ,对于终点 \(i+m-j\) 会有 \(1\) 的贡献,卷积形式,NTT 处理即可。
20211108 联赛模拟
T1
博弈论?
显然只有 0/1 两种答案,赛时找不出规律尝试用 \(O(n^2)\) 失败,题解给出的结论是考虑最大值的奇偶性,奇数 \(1\) ,偶数 \(0\) 。
题解给的说明是:偶数的情况一定会转移到奇数,奇数情况一定可以转移到偶数,终止态又属于偶数情况。
T2
notice: 题目给的输入生成器会数组越界。。。
嗯这就是这题的考点
题意:给出一个序列,每次问一段区间和一段前缀有没有相同元素。
对于每个元素求出其第一次出现位置,ST 表维护即可,注意不能 线段树/树状数组 (询问 \(Q \le 5 \times 10^6\))。
T3
盯了好久根本看不懂题,这要放赛时一定慌死了,APIO T1 既视感。
比赛结束前 10min 看懂题,然而没有头绪暴力也没时间打。。。
T4
顾着看前面题没看这个啊~~~血亏,比赛策略出现重大失误,难度估计出问题了。
最显然的 DP 是可以想到的(就是过不了),看到 \(m \le 18\) 肯定就状压了,后面的是真没想到。
联系去年 CSP-S 初赛 ,阅读程序第二题的优化技巧,将一个压缩状态分成两半,将原本的 \(2^{18}\) 转移分成两个 \(2^9\) 在修改和查询时分别维护。
20211109 联赛模拟
这真的不是码力训练吗?
T1
把一个无向联通图每条边设方向,使其仍然强联通。
直接Tarjan。
T2
在数列 \(a_i\) 中选出尽量多个数使两两互质,问最大个数。\(a_i \le 1000\)
重点在数据范围。
显然的就是不会同时存在两个大于 \(\sqrt{1000}\) 的质因子。
将存在质因子大于 \(31\) 的数拎出来,按照最大质因子分组,每组只取一个,没有的可以认为每个数一组。
剩下的就只有 \(11\) 个质因子,可以直接状压,DP 解决。
T4
真·真·真·真·真· SB 题
调了2h+调不出来。
想法是很简单的,因为只有一个环,将环上每个点挂出来的子树分别考虑,求出删去某棵子树后的最长链和最长在根的链,剩下的用线段树维护即可,倍增破环成链。
嗯实际上倍增没有必要因为根的左右儿子是一模一样的,并且不会合在一起算,所以把前后拼在一起效果是相同的(少2常数)。
T3
矩乘优化 DP 。
考虑 DP ,保留最后一列状态。
这时就不用考虑全部都填的因为断了(
所以有 \(7\) 个状态,但是我们可以放置大块,因为多出两个状态形如 \(100\) 和 \(001\) 表示后面一定要有障碍物拼成大块。于是状态数有 \(9\) 个。
然后将指数拆开用二项式定理之类的算。
多开两个位置计算系数和统计答案(从当前位置断开)。
(关于这个,我写另一种做法:由于断了之后要考虑的是合法性而非连通性,所以可以开三个位置来统计,保证合法即可)
20211110 联赛模拟
有一半的时间在搞印尼比赛所以没有交题呢!
T1
裸01背包,只要注意到 \(\sum w \le 5000\) 即可。
T2
首先增加的跟减少的一定不会相交
枚举有多少个由 \(+1\) 来,后面的二分。
T3
貌似是莫反的最前面的式子?\(\sum_{d |n} \varphi(d)=n\) ,用这个将 \(gcd\) 拆开,数论分块解决。
T4
DS 题 , 当然有并查集的又快又好写做法。
把平方拆开,线段树分别维护 和 和 平方和 ,按 \(y\) 从小到大枚举统计区间内答案。
并查集做法:也是按 \(y\) 从小到大枚举,区间的操作只有合并,同时维护一下区间内的值即可。
20211111 联赛模拟
前两题是简单题,但是调 T2 的时间花太久导致没时间后面两题了。
T1
显然最优的时候总操作次数一定最小。由于我们可以任意交换 \(b_i\) ,因此在控制总次数最小的前提下让大的尽量大,小的尽量小。
那么从大到小贪心地放置,用链表维护一下放的位置即可。
T2
题意:将序列 \(a_i\) 划分成若干段,使每一段的 \(mes\) 相同。
先找出这个 \(mes\) ,即整序列的 \(mes\) ,然后考虑 DP ,设 \(f_i\) 为以 \(i\) 为结尾的划分方案。
此时转移是从一段前缀转移来的,可以使用前缀和优化(开个数组就行了 bushi)指针搞定。
T3
考虑暴力的做法就是从小到大枚举起点,统计有多少符合条件的终点,并将该起点删去。
如何优化呢?
考虑维护出删点时还能到达的点,像 kruskal 重构树一样维护出一颗树,使一个点的子树内都是它可以到达的节点。
这样我们分别会有大小两颗树,要求的就是数对 \((x,y)\) 的个数,使得在一棵树中 \(x\) 是 \(y\) 的祖先,另一颗树种 \(y\) 是 \(x\) 的祖先。
遍历一棵树,对于每个点查询其祖先中有多少曾经是它的子树内点,利用\(DFS\)序,线段树维护。
20211112 联赛模拟
今天校庆耶!不过完全没有活动。。。
T1
题意:每次操作将一段长为 \(m\) 的区间答案赋值为区间内最小 \(a_i\) ,问 最大答案总和 和 在此情况下的最小操作次数。
用单调栈维护出以一个位置为结尾的赋值大小,再一个单调栈求这个赋值大小的区间最大值,最后处理一下就行,因为每次赋值的区间都是 \(m\) ,所以不连续的区间不会互相影响。
T2
题意:给出一个数组 \(a_i\) ,每次可以让 \(a_i=a_i \oplus a_{i-1}\) ,问最后情况数,其中 \(a_i < 2^{30}\) 。
发现一个点可以对后面的任意一个位置造成影响,并对其它位置不造成影响。于是一个位置 \(i\) 的情况数就是 \(a_1\) ~ \(a_{i-1}\) 的线性基大小。
T3
90pts 做法是直接暴力,最大答案不会超过 28 。
100pts 的话,可以考虑直接 SPFA 爆切。
正经做法,发现把所有状态列出来只有 16000 多种。
在这些状态中,将可接边权集合一样的状态合并,总共就只有 500 种状态了!
T4
构造题,每次操作可以将区间内 \(min\) 和 \(max\) 交换,问最小操作步数使 \(A\) 变成 \(B\) 。
看到构造没有想法,考虑分治。
操作显然是可逆的,那我们考虑将两个序列都变成 \(1\) ~ \(n\) 。
同时对于有序数组是可以轻易做到 reverse 的。
对于一个区间,先将其左右分别向下做,这样我们得到了两个有序的序列,要将它们拼到一起。
根据取终点的思想,我们将其中较小一半取出,这样我们是要将中间的一段对调。
将它们分别 reverse 这一整段就变成了有序的,再一起 reverse 就变成了原本两个有序序列排序的问题,注意不要放到一开始的 solve 就好。
20211113 联赛模拟
全场构造题,时间安排不合理,在 T1 上花了太多时间没有找出结论,实际上 T2 可能能做。
T1
发现数字跟颜色实际上是绑在一起的,每走一步颜色会变一次。此时如果没有奇环的话,该数字到每个点的颜色就是固定的。
就相当于对于一个二分图,左边的 B 和右边的 R 是等价的,反之亦然。
将集合弄出来查查是否一样即可。
T2
考虑设出 \(f_{i,j,0/1}\) 为长度为 \(i\) 的空间,得到一个 \(j\) 的概率/期望。
再设 \(g_{i,j,0/1}\) 表示第 \(i\) 位放 \(j\) 的概率/期望,钦定其不会被后面的数合并。
T4
考虑构造,分奇偶性。
对于 \(c_0\) 偶 \(c_1\) 奇 的情况,\(0\) 处放一个 \(2\) 、一个 \(4\) 和若干个 \(1\), \(1\) 处放 \(1\) 。
对于 \(c_0\) 奇 \(c_1\) 奇 的情况,\(0\) 处放 \(c_1 - 1\) , \(1\) 处放 \(1\) 。
对于 \(c_0\) 偶 \(c_1\) 偶 的情况,\(0\) 处放 \(1\) m,\(1\) 处放 \(2\) 。
对于 \(c_0\) 奇 \(c_1\) 偶 的情况,\(0\) 处放一个 \(2(c_0-2)\) 、一个 \(4(c_0-2)\) 和若干个 \(1\) , \(1\) 处放 \(7(c_0-2)\) 。
当然,如果此时 \(c_0=1\) ,在 \(0\) 处放 \(n-2\) ,\(1\) 处放若干个 \(1\) 和一个 \(2n-5\) 。
20211115 联赛模拟 总结
T1
贪心的从大到小,哪边差小放哪边,最后用单点补缺。
T2
首先发现叶子处的值只能是 \(0\) 或 \(1\) ,那么当 \(gcd\) 不为 \(1\) 时这些边一定往上贡献。
对于一个 \(gcd\) ,若其不为 \(1\) ,则答案至多为 \(1\) 。证明就是对于确定 \(gcd\) 构造树时,由于最底层的边方向都已确定,那么每个点除去它与父亲的权是确定的。为了要满足 \(gcd\) ,此时是否使用该边的权值是一定的。因此边的方向是唯一的。
合法的 \(gcd\) 显然只可能是 \(n-1\) 的因数。当我们用一个质因数构造树时,造出的 \(gcd\) 可能是其倍数,那这个 真·\(gcd\) 的所有因子都不会再有合法的。
T3
长剖,貌似跟板题没什么两样,但是没搞懂。。。
20211118 联赛模拟 总结
最后一场
T1
不看 \(O(n\log n)\) 的做法了吧。。。直接来讲 \(O(n)\)。
考虑到一个位置能放就一定放,它不会影响其他位置是否放。
那么处理出前缀最大和后缀最小,判断当前位置是否能放即可。
T2
套路地把平方拆开。
\(\large \lfloor \frac{i}{x_1} \rfloor\) 和 \(\large \lfloor \frac{j}{y_1} \rfloor\) 可以直接求,另两个整除分块。
T3
对于一个数,它显然只能覆盖一段连续的区间,并且这个区间在左右两个比它大的数中间,不一定要覆盖本来的点。
那么设 \(f_i\) 为已经覆盖了 \(1\) ~ \(i\) 的区间的方案数,这里我们钦定这段区间不会再次被覆盖,否则上面的性质就没有意义了,并且会算重(
转移稍微用一下前缀和。
T4
只能胡,不太会写,细节没搞懂。
求出每个操作最久能维持的区间,就能很方便地求出答案了。
将序列分块。对于整块,双指针考虑每次减去目前左指针处的值,散点直接暴力-1.
对于散点,先维护出相邻两个散点之间相隔多少整块,然后也是双指针维护。