• CSP/NOIP2021 赛前集训


    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\) 在每次询问给出。

    额。。。题目里说的是求下面这个式子,其实就是上面说的,

    \[\sum_{i=0}^{2^{n}-1} \prod_{j=1}^{m}\left(\operatorname{cnt}(i \& x) \& \operatorname{cnt}\left(i \& a_{j}\right) \& 1\right) \]

    注意数据范围, \(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

    首先这个可以轻易地用生成函数表示,

    \[ans_m = \left[ x^m \right] \prod_{i=1}^n \left( 1+k^i x \right)\\ \]

    显然可以分治 NTT 爆算(

    考虑优化的话,一段区间内的左半边可以直接求出右半边。

    但这只是 70 ( / 80? ) 分做法,下面考虑线性做。

    \[F(x)=\prod_{i=1}^n\left( 1+k^ix \right) \]

    那么

    \[F(kx)=\prod_{i=1}^{n+1}\left( 1+k^ix \right) \]

    于是有

    \[\frac{F(x)}{F(kx)} = \frac{1+kx}{1+k^{n+1}x} \]

    这时候就可以解方程了嘛,因为我们有 \(\left[ x^m \right]F(kx) = \left[ x^m \right] F(x) \times k^m\) , 所以(跳过一段推导步骤)

    \[f_i=f_{i-1} \times \frac{k^{n+1} - k ^i}{k^i - 1} \]

    这里, \(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\) 个位置时的环总数,答案就是

    \[ans = \sum_{i=0}^n (-1) ^ n \left( {n \choose i} \times \left( f_{n-i} + i(n-i)! \right) - (n-i)! \sum _{j=1}^{i} {n-j \choose i-j} t_j \right) \]

    问题在于后面,拿出来算

    \[\begin{align} sum&=\sum_{i=1}^n (-1)^i (n-i)! \sum_{j=1}^i {n-j \choose i-j} t_j\\ &=\sum_{j=1}^n (n-j)! t_j \sum_{i=j}^n \frac{(-1)^i}{(i-j)!}\\ \end{align} \]

    后面可以轻易地预处理,问题结束。

    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.

    对于散点,先维护出相邻两个散点之间相隔多少整块,然后也是双指针维护。

  • 相关阅读:
    ssh实现免密码登录和文件传输
    linux后台执行程序相关命令
    orchestrator
    curl下载安装与使用
    goland使用
    mysql集群
    consul理解
    my.cnf
    数据库的表设计
    项目常见面试问题
  • 原文地址:https://www.cnblogs.com/Kelvin2005/p/15554327.html
Copyright © 2020-2023  润新知