20220211省选组总结
T1
观察可知答案至多由两个圈组成,因为一旦方向上有身体就会开始“卷小”,此时无论怎么转都会面向身体的一部分。
由此,DP,分别求出一个圈的顺时针/逆时针答案,再枚举连接点将两个圈合并即可。
T2
没有什么营养的题目。。。
对于每个圆算剩余的周长,由于 \(n\) 只有 \(1000\) ,可以直接枚举其他圆,余弦定理求相交弧对应的极坐标区间。
将得到的若干个区间求并可得到答案。
T3
分两个part。
part1: meet in middle 求 $ \le lim$ 的点集个数。
part2: 矩阵树定理 求每个大小的点集的方案数。
20220212省选组总结
T1
可通过从大到小枚举每一个数,根据其位置快速计算逆序对个数。
由此,容易写出答案的 GF:
此时左边易用组合数计算, \(x^i\) 的系数即为 \(i+n-1 \choose n-1\) ,于是问题只剩下右边。
该问题类似背包,容易想到用 DP 做,然而物体太多、值域太大,显然不能直接完成。
注意到 \(k \le 10^5\) ,要求的只是前 \(k+1\) 的系数,如果我们将生效的 \(x^i\) 才称之为物体的话,由于每个物体的价值不同,物体个数至多只有 \(\sqrt k\) 个。
不妨设 \(f_{i,j}\) 为放了 \(i\) 个物体,此时的指数是 \(j\) 的方案数(系数),为了每个物体的价值不同,转移采取每次将全部已放物体的价值 \(+1\) 的方式,每次考虑是否放入 \(1\) ,并且在此过程中可能会“创造”出一个 \(n+1\) ,需要减去。具体地讲,转移式如下:
T2
有自环的情况可以多次刷新排列,先不考虑。
按反拓扑序处理出每个点到终点的期望最短距离 \(F_u\) 。
考虑一个点从多个点 \(v , (u,v)\in E\) 转移过来,点和边权可能会有任意组合,
20220216省选组总结
T1
看到 \(k\) 次方一般几个思路:
- 先计算贡献为 \(x^k\) 的有多少个,再统一算(这很蠢所以基本不会用到)。
- 为了方便统计,同时维护 \(0\) ~ \(k-1\) 次方,用二项式定理维护。
- \(x\) 个合法位置 有 \(x^k\) 贡献 的,可以转化为 \(x\) 个中选 \(k\) 个的方案数(可重)。
这题就是第三种,于是可以将计算 有 \(x\) 个的方案数 转化为 有 \(k\) 个的方案数。
这里有贡献的位置称之为“谷”(取名于其在平面上的形状)。一个“谷”除了该点外还包括两侧的“山坡”。
以下分为几步计算答案:
- 计算 \(f_{i,j}\) ,这里 \(f_{i,j}\) 表示 \(i\) 个“谷”,总长度为 \(j\) 的排列数。
- 计算 \(g_i\) ,表示可重集合 \(S\) 的大小为 \(k\) ,元素种类为 \(i\) 的 \(S\) 个数。
- 统计答案。
2 是很好做的,直接容斥即可。
考虑 1 怎么做,可以发现若两个“谷”没有相交,它们在计算排列数时是独立的。
于是考虑 \(k\) 个谷由多组连续的 “山脉” 拼在一起。
暴力可以跑出“山脉”长度为 3,5,7,9,11 时的方案数,
然后 DP ,转移为 \(f_{i+k,j+2k+1} = f_{i,j} \cdot {j+2k+1 \choose j} \cdot w_k\) ,\(w\) 就是上面说的“山脉”方案数。
T2
构造一幅图
上层是 \(n+1\) ~ \(n+k\) 号点,相邻点连权值为 \(X\) 的双向边,
下层是 \(1\) ~ \(n\) 号点,连单向边 \((n+i,j) \quad 1 \le i \le k , 1 \le j \le n\) 。
选的边要求构成最小直径生成树。
也就是钦定 \(1\) ~ \(n\) 号点度数一定为 \(1\) ,这样做保证了两个点 \(i,j \quad (1 \le i,j \le n , i \not = j)\) 之间的距离就是原题中给的式子。
于是考虑该图如何求绝对中心 \(S\) ,如果在两层之间的边 \((n+i,j)\) 上,则要求 \(dis(n+i,j) \ge \text{S与其他点的最小距离最大值}\) ,后者可以直接 dij 求。
否则,直接按照最小直径生成树的方法做。
20220218 省选组 总结
栋爷的题呢
T1
将 \(a_i\) 取反,那么一个方案合法当且仅当每一个数都有一个位,是由它独自占据的。
那么这些位打上标记,表示被且只被覆盖一次。
设 \(f_{i,S}\) 为 到第 \(i\) 个决策点,目前覆盖的状态为\(S\) 的方案数,其中,\(S\) 的一位为 0/1/2 分别表示 没有被覆盖/被覆盖多次/标记位。
如果直接转移的话容易发现是会算重的,容斥一下,若是标记位的集合为 \(S\) ,就给其赋上一个 \((-1)^{\lvert S+1 \rvert}\) 的系数。
T2
将每个询问区间写成点,有相交的就连一根流量为 重叠部分\(\sum a_i\) 的边。
给每个区间初始的牌堆大小,令其取区间 \(\lbrack l_i , \min(r_i , l_{i+1}) \rbrack\) ,即每个牌堆优先分给右侧的区间,于是上面的连边就必须方向向左,表示可从右侧转移 \(\sum a_i\) 张牌到左侧牌堆。
每次查询直接使用当前牌堆,空了就找右侧第一个有牌的,需要线段树维护边流量的最小值。
20220219省选组总结
T1 树形图求和
貌似跟之前一道省选题几乎一样?
首先想的是对每条边统计其所在的树形图个数,乘上边权后相加。
会用到矩阵树定理求树形图个数。
但这样是 \(O(m n^3)\) 的,显然过不了。
题解做法是快速维护余子式?
根本没有想到这一边,想到了也不会维护(bushi
嗯。。。考虑将原本矩阵中的 度数 或者 边数 改成双元组,即将一条边的贡献变为 \(wx + 1\) (\(w\) 为边权) 的形式。答案是矩阵行列式的 \(x^1\) 项系数。
如何理解?
考虑如果只计算一条边时是如何求答案的。
若一个树形图中包括该边,才会被计算到答案里面,那么如果把该边的 1条 变成 权值 条 ,算出来的也就是该边的贡献。
\(x^1\) 项保证了只有一条边的贡献是边权。
讲到这里应该都明白了吧?还是提多一嘴。
由于求 det 需要高斯消元,一般都会想直接将多项式当成原本的方程系数来消元,这就需要用到多项式求逆了(虽然只有两项简单的很?)
实际上完全不需要求逆(我根本没写多项式……),只用对常数项高斯消元即可。
但是这个高斯消元需要额外步骤,其实就是不仅仅求出下三角矩阵,我们只保留一条对角线,其他位置的常数项要求全部为 \(0\) 。
为什么?
由于我们只会取一个一次项,此时若在对角线外取了数,则有至少两个数不在对角线上,这些数中至多只有一个能取一次项,于是必有常数项 \(0\) 会被取到,也就没有贡献了。
这样真的好写很多。。。
T2 旅行
还没敲。。。
首先是二分答案,由于题设,旅行一定是按dfn序做的。
那么我们对每个点维护二元组 \((a,b)\) 的集合表示第一天 \(a\) 最后一天 \(b\)。
对于所有 \((a,b), (a',b')\) ,若有 \(a \le a' , b \le b'\) ,\((a',b')\) 显然不优,就没必要存在了。
合并儿子时使用启发式合并,根据某种方式排序后就可以前缀最小值+双指针了吧。
排序什么的可以用归并可以保证复杂度是 \(O(n \log n \log Ans)\) 的,或者直接 sort 多个 \(\log\) 貌似也能硬刚。
T3 字符串游戏
先倒着扫一遍判合法性并找出二元组 \((a_i,b_i)\) 表示 \(a_i\) 要移动到 \(b_i\) 的位置。
做完第一次操作后一定是由这些 \(a_i\) 组成的字符串。
然后设 \(v_i\) 表示做完第一次后 可以提供的位置数 , 需要保证能覆盖到对应最左侧的需求位并至少留下一个位置(防止灭种)。
那么每一次操作相当于将 \(v_i\) 往前贡献一次,这样的贡献是会保留下来继续对前面造成影响的。
会不会有贡献多了的情况,比如到达了 \(b_i\) 后继续将后面的贡献转移到后面?
不会,原因是当 \(b_i\) 该过程完成了,前面得到的可行位置就是该过程前的所有位置了,前面的答案也不可能更大。
20220221省选组总结
T1
Burnside引理的基础应用
先考虑旋转,联系裴蜀定理知不动点个数和为:
发现这只跟 \(\gcd\) 有关,于是枚举 \(\gcd\) 计算,若 \(x \vert m\) ,则 \(\gcd(m,i)=x\) 的 \(i\) 有 \(\varphi(\frac{m}{x})\) 个。可以通过预处理 \(\varphi\) ,再 \(O(\sqrt m)\) 枚举因数快速计算。
然后考虑翻转,根据 \(m\) 的奇偶性分成三种情况,分别计算即可。
大胆写式子,列组合数可以合并。
20220222省选组总结
T1
不会暴力怎么打是我的问题QAQ
总归打了个水法20pts。
暴力是对于每个格有两种删法,确定了哪种后在它之前必要删除的格子和删法就都确定了,这是 \(O(n^4)\) 的,35pts。
然而会了暴力怎么就不会满分呢???
每个点有两种删法,左或右,一个先删左的格子,它左边的格也一定是先删左的。
于是左右两种方向做,继承前一个格子删的点,复杂度就是 \(O(n^3)\) 的了。
T2
对于一颗生成树,每个点的度数是 \(d_i\) ,它的贡献就是
所以我们对每个点分别考虑,又结合Prufer序列相关知识,
Prufer 序列与生成树一一对应,每个点的度数则为 序列中出现次数+1,序列总长度为 \(n-2\)
设点 \(i\) 的 EGF 为 \(F_{i}(x)\) ,则
那么答案就是
这里前两个可以预处理,最后一个背包做,最后暴力算答案。
复杂度 \(O(n^2)\) 。
T3
子任务:可以对整个序列维护一个大根堆,每次加入一个数,弹出堆顶元素。
由此可以很自然地得出分块的做法。
对每个块维护同样的一个堆,并记录每次加入的数。
整块情况直接做即可,散块需要将前面的记录先结算,此时直接暴力复杂度会退化,注意到寿司和人实际上地位相当,每个数会被修改为经过它的数中最小值,对加入的数维护一个小根堆,从 \(l\) 到 \(r\) 枚举 \(a_i\) ,将 \(a_i\) 对比并对调。
其实题目就做完了。。。但是卡常挺悲哀的QwQ
注意不要直接对所有块维护小根堆,而是先用 vector 记录下来,在需要维护整块信息(修改散块前)时用构造函数将 vector 转成 priority_queue ,原因是 push() 比 push_back() 要慢得多。
20220225省选组总结
T1
奇技淫巧增加了!
在边权上做文章,要使 \(m^2\) 的其中一个 \(m\) 变成 \(\log m\) 的话,就加点 \(\frac 1 2\) 进去吧!
设一条边还需要的点权为 \(w_i\) ,若其所连的两个连通块点权都不超过 \(\frac {w_i} 2\) ,这条边就不可能有贡献。
那么对每条边设阈值,扔到连通块上,用堆维护。
T2
设两侧都要经过的点个数为 \(A\) ,若 \(A\) 是 \(4\) 的倍数很容易做,直接每四个数一组拆开即可。
否则,若 \(A=4k+2\) , 直接搞就是不行的了,那么如果有两个 \(LR\) 中间夹着至少一个 \(A\) ,可以利用这个 \(A\) 将 \(LR\) 发挥出 \(A\) 的效果。
T3
听说只要把递增的条件忽略掉就可以了。。。
20220228省选组总结
T2
容易发现答案一定满足 \(siz_{ans} > \frac{siz_1} 2\) ,那么把树按DFS序拍到序列上,此时的带权中心一定在答案的子树内,倍增往上跳。
修改操作需要树剖,带权中心需要在线段树上二分做到 \(O(n \log n)\) ,最后的倍增向上也是 \(O(n \log^2 n)\) 的复杂度。
这是使用线段树维护的情况。
然而我们知道线段树求区间和会有 \(3\) ~ \(4\) 的常数,况且复杂度已经是 \(O(n \log^2 n)\) 的了,没必要为了 \(O(n \log n)\) 求带权中心而使用线段树,不如使用树状数组,可以减小最后求答案的常数,牺牲求带权中心的复杂度。
T3
《论爆搜时间复杂度层面的各种优化》
这里详细写写题解做法吧。
里面说的复杂度 \(O(2^{\frac n 2}n^2)\) 和 \(O(3^{\frac n 2})\) 取决于最后的子集卷积写法,然而前者是一定会有的。
对于每个合法方案,每个点的度数都不超过 \(1\) ,于是我们将 \((2i-1,2i) \quad ,1 \le 2i \le n\) 相连,这样做的目的是将边都连起来成为若干个连通块的形式,从而将多条边的贡献统一计算,来加速计算过程。
此时每个点的度数仍然是不超过 \(2\) 的,于是一个合法的方案只能由链和环组成。
将每个链和环的贡献分开计算,可以 DP 分别求出点集 \(S\) 构成一个 链/环 的方案数。
求环这里可能会卡住,用断环成链来避免算重,钦定一定断开最左侧点的一条连边(不删上面所说手动加的边),这样无论是环还是链,状态中都只需要记录点集 \(S\) 和目前的终点 \(x\) 即可。
复杂度是 \(O(2^{\frac n 2}n^2)\) 的。
然后把二者合并起来(子集卷积?),同样,为了避免算重,我们钦定每一次新加入的点集 \(S'\) 包含 \(S\) 中最小点,
如此可以 \(O(3^{\frac n 2})\) 直接卷。
总结
- 时间分配不合理,赛时用了大量时间写T2,快写完时才发现是假的,导致暴力没有时间写。
- 要有效分析复杂度,较低等级的复杂度可以牺牲为目前必要的最大复杂度,以换取最大复杂度的常数减小。
- 关于计数题,为了避免算重可以考虑钦定一些条件,要求该钦定会使最终算得的每个方案出现次数便于计算(如都出现相同次数);
- 接3 ,T3 在优化时间时,利用图“稀疏”的特性将 \(n\) 降为了 \(\frac n 2\) ,实质上是将多条边的贡献同时计算了,这给我们的启示是可以将散的东西利用特性组合,由此一次计算多个贡献,达到加速的效果。
20220301省选组总结
T1
首先注意到答案一定不会有两条路径是相交的,那么将答案的路径保留下来就会是若干个连通块的形式。
这种性质可以在一些方面帮助我们优化算法,同时,不注意该性质显然是不会影响答案优劣的,所以我们应该对题目的性质进行甄选。
在这道题里,可以利用这个性质进行树形DP,设 \(f_{x,t}\) 表示将 \(x\) 匹配 \(t\) ,子树内所有完整连通块的最小代价和。
转移就是考虑一个节点和新加子树的根节点是否在同一个连通块里,转移就比较显然了。
T2
赛时还是浪费太多时间在这道题上了(线代果然是个坑。。。)
将所给的矩阵中提取出一个全为 \(C\) 的矩阵出来,所求行列式就是 \(\det \left(A + B\right)\) 形式的,其中 \(A\) 是全为 \(C\) 的矩阵, \(B\) 是一个上三角矩阵,主对角线由 \(1-C\) 组成。
这样的行列式计算方式是 \(A\) 中选一些行和列, \(B\) 中选其补集,两个分别求行列式乘起来,对所有选择方案求和。
这里两个矩阵都比较特殊,容易发现的是 \(A\) 中至多选一个数,否则其行列式就是 \(0\) ,不选时 \(B\) 的行列式也可以直接求。
下面问题就在于选一个 \(C\) 的情况了。如果这个 \(C\) 的位置是 \((i,j)\) , 如果 \(i < j\) , \(B\) 中得到的行列式一定是 \(0\) ,只需要考虑 \(i \ge j\) 的情况。
此时 \(B\) 中没有了 \((j,j)\) 这一必选的点,就“释放”了 \(j\) 行上的点,选择的 \((j,k)\) 一定是满足 \(j<k\) 的,同时这又“释放”了 \(k\) 行上的点。
于是形成了链状的结构, \(j \rarr k \rarr \cdots \rarr i\) ,其贡献为 \((-1)^{len-1} C^{len} \left(1-C \right)^{n-len}\) 。
设在第 \(i\) 列结束的方案数和为 \(f_i\) ,则有 \(f_i=\sum_{k \vert i , k < i} f_k \frac{C}{(1-C)^2}\) ,用杜教筛加速前缀和过程。
预处理需要做到线性。
T3
题解做法是真的麻烦。。。以下是 FK 的简单方法。
观察题目函数的执行过程,区间 \((l,r)\) 有用的地方只有长度 \(r-l+1\) ,每一次相当于将最左侧一位累加到右侧的数上,
手玩一下就能发现同一层的参数 \(len\) 至多相差 \(1\) ,同一长度且 \(work\) 不同的情况只有 \(2^k\) 和 \(2^k+1\) 。
那么就可以直接求了嘛,特殊处理的在于最右侧的 \(1\) 左侧有连续的 \(0\) 。
于是线段树维护 区间异或1、区间赋值、求前驱1 即可。
20220303省选组总结
出题人咋不承认一下第一题也可以是乱搞题,你看那个暴力跑第一的
T1
路走歪了。
赛时总想着 DP 一类的东西,然后发奋删状态,确实删得很少但是正确性废了QwQ,最终还是交了暴力不知道为啥只有30pts。
最小策略显然是先把一个数变成总的 \(\gcd\) ,目标就是要最小化这个的步数。
另一个很显然的是这个过程至多 5 步,即将 \(6\) 个数取 \(gcd\) 。
所以问题变成了枚举答案,判断是否可行。
这个判断是否可行就很烦,不太正常。
我们喜欢数论,又喜欢计数,所以把问题变成计数吧! —— alpha1022
契机应该是看到 \(\gcd\) 想到数论、莫反,然后莫反不便于判断存在性,但是它可以算方案数。
那么就把判断存在性换成了算方案数,只要方案数不为 \(0\) 即为存在。
T2
判断合法性要求划分内 \(a_i\) 和 \(b_i\) 的数集和个数都相同,这个可以前缀和方便维护。
由于数集可能很大非常难判,那么就哈希一下。
T3
也是路走歪了。
虽然正解也是一个很劣的 DP 优化,然而我的 DP 不一样就根本没有什么优化的可能,死磕是没有结果的。。。
赛时考虑的是,最后的方案画出来每条边的流向是一定的,那么就应该是由一部分点向外流,拼起来的一整个环。所以我算每个点往外流的区间最小答案,瓶颈在于两个端点的状态需要记录。
正解是另一个 DP ,先枚举 \(n\) 到 \(1\) 的流量 \(x_1\) ,后面的 DP 状态只需要记录到达的位置 \(i\) 和 \(x_i\) 。
如何从这个 \(O(n^5)\) 的 DP 升级到正解?
根据题解的相关说明,DP数组 \(f\) 的每一维 \(f_i\) 都是一个凸函数,于是可以用平衡树转移。这样有 80pts。
然后又有答案与 \(x_1\) 的关系也是凸函数,这里三分做。于是就有 100pts 啦!
只能说平衡树和三分都没怎么写过
大多数人路走歪了是可以拿到 80pts 的,费用流一下就行了。
总结
-
要根据一些题目中的蛛丝马迹考虑题意的转化,例如今天的 T1 看到 \(\gcd\) 就应该要想到数论、莫反,进而由莫反的作用范围来考虑将题意的 “存在性判断” 换成 “方案数统计”。
同时应当认识到的是,“计数” 这一概念完全可以表达 “存在性”、“合法性” ,并有进一步的附加属性。 -
碰到比较大的需要判断相同的数据时,应该要想到哈希,并大胆使用随机,以增强答案正确性和判定的简便性。
-
DP 需要比较合理且简洁的状态和转移,DP优化方式上,将DP数组视作函数分析其性质,不失为一种有效的优化,比如 四边形不等式、凸函数、压缩DP状态 这些比较 数学+OI 的东西。
-
考试策略依旧不甚合理,应当认识到没有写完暴力就直接死磕满分是没有前途的。
即使扫了一眼知道能有很多部分分可拿也好写,也要先写好暴力保底。。。
20220304省选组总结
这比赛也太阴间了。(汗)
T1
题意是执行 \(\lfloor \frac n k \rfloor\) 次,第 \(i\) 次求在树上放不交的长度为 \(ik\) 的链最多能放几条,每次前会删去一棵子树,或恢复之前删的一棵。
赛时真是脑子抽风了没想到贪心,就想着DP能不能做,事实证明这是没有前途的。
贪心就是每次找一个最深的子树,满足其直径不小于 \(ik\) ,然后把它删掉。删到不能删为止。
如何加速这个过程?
先不考虑修改,注意到答案总和是 \(n \ln n\) 级别的,于是可以预处理出所有答案可能的位置(要求其儿子子树大小小于 \(ik\) ,且其自身子树大小不小于 \(ik\))。注意这里求的是最底层的那些“基石”。
每次求答案时从队列中取出一个数,再倍增找它最深的满足条件的祖先加入队列。如果该祖先也是队列中其他数的祖先就不加,以保证时间复杂度和正确性。
为判断是否满足条件,需要用到欧拉序求直径,线段树维护。
考虑修改的话,需要在线段树上打打标记什么的。。。看不懂。
T2
看不懂为什么有 \(a_{i,j}<=4\) 的条件。
按右乘看,乘进去的矩阵代表着矩阵的列变换。
最后一列全为 \(1\),最后一行除 \((n,n)\) 外都为 \(0\),意思应该是最后一列每次都统计了前面的前缀和,但不会对前面列的值产生影响。
那么只看前 \((n-1)\) 行和前 \((n-1)\) 列,判断其能否保持一直非 \(0\),位置 \((i,j)\) 上有值意思是第 \(i\) 列会往第 \(j\) 列贡献。
于是建图判环即可。
总结
-
不要被DP思想局限了,DP考虑的状态数多、要求不能有后效性,这些特点使得它有时并不能取得很好的使用效果,而是作为“暴力”一档出现。当DP优化出现困境,并感到不太有前途时,不妨尝试一下贪心、随机化等做法。
-
数据范围有时可以体现题目的一些特性或者引导解法,就如T2的数据范围很大程度上影响到了我解题的思考过程。
然而,并不是所有给出的数据范围都会有非常显然的性质引导,也如T2给出的 \(a_{i,j} \le 4\) 这一条件,并没有对解题起到任何作用。在赛后的讨论中,我们得出的结论是该性质用于保证读入的速度…… -
对数据范围怀抱警惕心理,遇到较大的输入时一定要记得打快读。
-
今天的策略相对前几场正确了不少,只是不知道为何T3的两档部分分都没有拿到。策略上的不足之处在于没有给T1预留足够的时间。规划了2h给 T1 T3,但是写完 T3 就只有 25min 了QAQ,经过短时间的思考根本写不出来,痛失70pts的部分分。
20220307省选组总结
T1
赛时太冒险了,猜了个自己都觉得有问题的结论还硬着头皮写,结果确实出问题了。。。
幸好低分档补了个暴力。
但其实这题策略还是不错的,至少该拿的暴力分拿到了。
看了看 Solution ,也是一种见过的技巧,但没怎么真正使用过……做题量还是太少了。
在这种对数的种类有区分的情况下,可以根据题目的特性将多种数字使用 0/1 简化,
并由此得到一些比较简洁且有效的结论。
同样的套路还在之前的一些题里出现过,比如前年CSP-S的T3移球游戏。
T2
一眼积性函数、Min25,想起前两天还觉得这东西用的不多所以根本没有复习来着……
吃了知识点的亏。线筛 \(O(n)\) 跑路。
首先单求一个点值可以DP快速求得,该过程可以写成多个二元组运算的形式。
容易看出积性函数一样的形式,满足 \(f(p^k)\) 可以快速计算的条件。
然后 Min25 直接做即可。
Min25基本思路:
- 将所有点值都暂时使用质数的计算方式,利用函数 \(g(n,j)\) 表示 \(n\) 以内质数和最小质因子大于 \(p_j\) 的数的点值和 ,计算出 \(n\) 以内所有质数的点值和。
- 设 \(S(n,j)\) 表示 \(n\) 以内最小值因子不小于 \(p_j\) 的数的点值和,利用积性函数的性质,每次枚举最小质因子及其指数求。
20220308省选组总结
T1
简单题!
容易看出来的是一个排列中的环只会变成一个基环树,嗯……同时环上的相对顺序和原本相同。
统计所有排列能形成的序列数之和,可以拆成多个环考虑贡献。
对于一个大小为 \(n\) 的环,变构成的基环树的种数是 \((n+1)^{n-1}\) 。
证明的话可以用 Prufer 序列之类的搞一搞吧。将所有点连向一个虚点,表示留在环内。
后面的就是常规的化式子,用生成函数推一下可以变成多项式exp。
式子推错是真的会歇菜的呀!
T2
T3
总结
策略是真的不行啊~部分原因是心态问题吧,一开始花了好长时间推T1,推出来的式子错了点细节但死活改不出来,心很慌然后心态就崩掉了。导致后面打的暴力漏洞百出,还接连读错题。
20220310省选组总结
呜呜呜这就是没有改题的后果吗QwQ
T1
基本是支配树板子了,主要是支配关系是树形结构的,于是可以建成一个树,一个点可支配的节点为其子树内的所有节点。
注意到是DAG上建支配树所以比较简单,加入一个点时只用将其连到原本应该连的点的LCA处(嗯其实是连到这个点,只是这样说好听一点……)。
LCA怎么维护?
原本要求最长不下降子序列,是可以用权值线段树优化DP搞定的,这里线段树同时维护一下LCA就好了,只用维护 \(f\) 值最大点的LCA就好,其他是没用的。
T2
方案数转化为格子路径划分。
式子推出来reverse一下就可以直接卷了。
T3
硬莫反(雾)
先是一个比较常用(?)的式子
从 \(k=1\) 拓展到 \(k>1\) 。
那么 \(k=1\) 时,经过经典(套路)莫反,有
后面两个的形式是一样的,那么设
这两个都是可以 \(O(n \log n)\) 预处理的,原式就等于
!!!!!这里是令我迷惑的地方。
钦定一个阈值 \(B\) ,当 \(T< n/B\) 时暴力算;当 \(T \ge n/B\) 时数论分块。
为了数论分块,还需要预处理一个 \(Ans(i,j,k) = \sum_{T=1}^k f(T) g(T,i) g(T,j)\)
嗯。。。是要处理这个的前缀和。
那么顺利做到复杂度 \(O(n^{\frac 5 3})\) 。
考虑扩展到 \(k > 1\) 。
构造函数 \(F(x) = \frac{\varphi(xk)}{\varphi(k)}\) ,则有
JYChen指出,除以 \(\varphi(k)\) 根本没有必要,事实也是这样:
式子和 \(k=1\) 长得一模一样,一样做就好了。
20220321省选组总结
(实则是0322省选组)
套用某位神仙的话,T1这种题就该当作不可回收垃圾处理。
T1
后面的 \(\sum_j f(i,j)\) 根据组合意义就是斐波那契数,那么题目就变成求斐波那契的前缀 \(k\) 次方和。
经过多人的努力,尝试通项公式是没有前途的因为 \(p\) 不确定时的 \(\sqrt 5\) 根本搞不定。
然后,矩乘显然也是没有前途的毕竟 \(\log n\) 太大了。
剩下的办法第一时间想到的就是斐波那契的循环节。
由某些结论知循环节大小不超过 \(6p\) ,那么利用生日悖论随机 \(\sqrt{6p}\) 个位置有重的概率就会是 \(50 \%\) 的,也就是有这么多的概率能找出循环节,而且这个概率多数情况是会多上很多的。
T2
首先第二问真的好蠢根本不用理。
观察可知有性质:kruskal过程中的连通块在原图中也都是连通块。
min比较难搞所以直接将其拆成两次的转移,从 \(x\) 走出的代价为 \(a_x + dis\) 。
那么容易得到二分的 \(O(n \log n)\) 做法:从每个点都往外走直到走尽或者和别的块联通。
再结合一下上面的性质,可以将二分变成一种DP做法(甚至直接推出DP也不为过)。
就是对于原图中一个边连接的两侧点集,一定有某一条边将它们连在一起,那么可以DP处理出从下面走上来的最小 \(a_x+dis\) ,从上面下来同理。
容易发现只要所有这样的边都连起来了,就一定是合法的一个整的连通块。
T3
好妙!
首先 \(b_i \leftarrow k-b_i\) ,这样题目的限制就变成了 \(a_i \ge b_j\) 或 \(a_i \le b_j\) 形式的。
然后将其连边,强联通的即表示它们一定相等,可以缩成一个点。
然后如何计数?
观察原图发现这是个两侧所有点都有连边的有向二分图,
那么缩点后对其使用最长路分层,可以看出相邻层的点一定两两之间有连边,
如何证明?
原图是满足该条件的,对于一个缩起来的大点,它一定包含左右各至少一个点,因此它与其他所有点都会有连边。
分层之后有每一层的最大值必小于等于下一层的最小值,\(O(n k^2)\) DP做即可。
20220322省选组总结
(实际上是0321省选组)
T1
赛时推了3h只推出来个 \(n=0\) ,然后发现没有前途(
显然的是一个矩阵由其第一行和第一列决定,然后对其合法条件进行讨论。
最终是对 每个位置的 \(color\) 异或上位置的奇偶性 作出讨论。
T2
不难,就是优秀的复杂度不太好写。
第一眼看到:每个高度的AVL都有其最小版本,而其他版本一定能够容纳该版本,这可以快速预处理出来。
需要注意到的是 AVL 的树高是 \(\log n\) 级别的,因此完全可以设 \(f_{i,j}\) 为 \(i\) 的子树深度为 \(j\) ,且其中所有限制都已经被满足 的最小所需点数。
这里的限制是指我们从 \(1\) 到 \(n\) 依次尝试放入每个数,一旦成功就不会被取出来,成为限制。
这样做是 \(O(n \log^2 n)\) 的,已经可以通过本题。
注意到有另一个有趣的性质,一旦一个点尝试进入时失败了,那么该深度的其余节点都不会成功。
原因是我们放的时候一定是从小到大放,同深度的点来说,右侧的点代价一定不小于左侧,因为左侧的子树高度一定是不比右侧浅的,同时左侧点还更优。
这样可以做到 \(O(n \log n)\) ,去掉了一个 \(\log\) 。
但是这个会不会有 \(O(n)\) 做法呢?
其实想出了一种但是细节太多完全不想写,也可能有锅。
大致思路是利用“最小版本”的转移是 $g_n = g_{n-1} + g_{n-2} +1 $ 的特点,每次往深的点拓展时,利用记录的 \(pre\) 和 \(cnt\), \(O(1)\) 维护代价。
T3
二次离线莫队,这就去学,先咕了……
20220324省选组总结
T1
板题。
建出圆方树然后长剖,又快又好写,调不出来就是另一个故事了……
或者圆方树不会建什么的……
好吧实测是长剖挂了QwQ
T2
赛时直觉是回滚莫队你敢信?
首先看到回文建 PAM。
然后答案就相当于区间内点在 \(fail\) 树上的链并大小。
这样莫队就莫得前途了(
而且在线也是不可能的(
所以离线!
那就扫描线吧!
把每个串的贡献记在最右侧的右端点处,每次加入一个位置就相当于覆盖 \(fail\) 树上的一条链,树状数组维护每个位置的贡献有多少。
这个怎么做呢?
可以树剖,就是比较麻烦,不想写。
还可以LCT,注意到每次access之后的所有 Splay 内都只有一个标记,所以每次access的时候将对应标记位置 \(-siz_t\) 即可。
T3
惨死于卡特兰数没学好。
将三角剖分转化为卡特兰数,即每次为边(1,n)选择一个点划分成三角形,对应一对括号,包括 \(1\) 的一个多边形放在括号里面,另一个多边形放在括号之后。
观察 \(m\) 有什么意义,结合上面的转化,发现其限制了每个时刻未匹配的左括号 \(\le m\) 个。
这个没怎么见过呀。。。那就换成熟悉的格路计数!
相当于求从 \((0,0)\) 到 \((n,n)\) ,不经过直线 \(y=x+1\) 和 \(y=x-m\) 的方案数。
这就是有两条线的限制嘛~ 上周刚做过,容斥一下就行,每条线都对称几次,按照奇偶性分容斥系数。这样答案就是
嗯。。。直接求还是不行,这种形式就单位根反演吧!
观察到 \((m+1) | (p-1)\) ,那么模 \(p\) 意义下的 \(m+1\) 次单位根是存在的,直接做就行。
20220325省选组总结
今日份总结:退一步海阔天空。
首先存在一个 \(d\) 使得 \(m\) 每次必定经过 \(0\) ~ (d-1) 层
20220328省选组总结
原来睡觉对做比赛有奇效
T1
先是转成边的覆盖,然后。。。第一眼想到的居然是莫队?绝对是被根号算法搞疯了。
推了一会儿之后意识到莫队是没有前途的还不如 \(n^2\) ,弃掉。
DP可以做到 \(n^2\) ,打挂了就是另一个故事。
正解完全没有听懂的就是说,改完T2再去看。
T2
这是个可悲的故事……
第一步看出答案是 \([x^n] \left( \frac 1 {1 - x - x^2} \right)^k\) 。
联想 \(k=1\) 时的做法(也属于齐次常系数线性递推吧,不过这里只是用生成函数算通项),考虑裂项,设原式等于
同时有
有结论是 \(R_1\) , \(R_2\) 都一定是 \(k-1\) 次多项式。
现在要求 \(R_1(x)\) 和 \(R_2(x)\) ,先求 \(R_1(x)\) , \(R_2(x)\) 同理。
对 \((1-\alpha x)^k\) 取模,做到去除 \(R_2(x)\) ,得到
模数比较奇怪不好求,换元,
设 \(t=1- \alpha x\) ,则
令
此时常数项易求,一种常见的 \(O(n)\) 求法是利用 ODE ,即常微分方程。
简单来说就是对原式求导,有
取 \([t^{i-1}]\) 可以得到 \(f\) 的递推式。
为了把同余的等号变成正常的等号,我们有需求将自 \([t^k]\) 开始的项全部变成 \(0\),那么给常微分方程多一项 \(C \cdot t^{k-1}\) 。这样做是为了消去 \([t^{k-1}]\) 给 \([t^k]\) 的贡献。
事实上,求出 \(f(t)\) 的系数并不重要,我们要求的是 \(R_1(x)\) ,即 \(f(1-\alpha x)\) 。
但是这两个方程中 \(C\) 显然是一样的,只有 \(t \rightarrow 1-\alpha x\) 。
那么有关于 \(R\) 的ODE,
这样就能求出 \(R_1(x)\) 了。
有一个疑问点在 \(R\) 的 ODE 处,就是那个 \(-\alpha\)。
这个算法的思路是用 \(f\) 的 ODE 算出 \(C\) ,套用到求 \(R\) 里,所以应该用 \(f\) 的 ODE 转成 \(R\) 而非直接用 \(R\) 求 ODE,以此保证 \(C\) 的不变。
我们知道 \([R(x)]'=[f(1- \alpha x)]' = - \alpha \cdot f'(1-\alpha x)\) ,而原式中的 \(f'\) 实际上是 \(f'(1-\alpha x)\) ,所以这里需要把 \(-\alpha\) 除掉。
T3
容易想到 \(\varphi (ij) = \varphi(i) \varphi(j) \gcd(i,j) / \varphi(\gcd(i,j))\) ,这东西跟 \(\gcd\) 有关发挥不出什么作用。
根据 \(\varphi\) 的转移你会发现,如果把 \(\gcd\) 变成其因子,得到的数只会更小。
那么可以枚举 \(d\) ,处理其所有倍数之间的贡献。
如果直接做还是有 \(O(n^2)\) 对数 有贡献,考虑简化,对于 \(d\) 的一个倍数 \(p_i\) ,只用找到其左侧和右侧的第一个大于它的即可,可以证明这样能包括所有 \(d\) 倍数的贡献,证明简单这里就不写了。
这样能使贡献的数对个数达到 \(O(n \log n)\) 级别,扫描线一样离线询问,树状数组维护后缀最大值即可。
20220330省选组总结
啊啊啊啊啊AK场怎么打成这个样子
T1
赛时猜出结论了,也想到可以枚举 \(a+b\) 了,但是过不了样例的时候觉得一定是结论错了就没有调。。。
先对 \((a+b)\) 取模,分成 \(x <a\) , \(a \le x < b\) , \(b \le x\) ,其中第一种是无效点,第二种的 \(a\) 的专用点,第三种需要考虑是否 \(\ge 2a\) 。若有第二种则 \(a\) 必胜,其他情况简单分讨。
计数突破点是 \(a+b\) 的取模,这个不能直接算,那就枚举,用上面的策略计算确定第三种数个数时的 \(a,b\) 范围,根据奇偶性加到先手必胜和后手必胜中。
A 必胜和 B 必胜一样多,通过另外两个减一下就能得到。
T2
注意题意的贡献是点贡献而非点对贡献。
建出反链的 SAM ,每个点的子树中,没贡献的位置是那些只有一个点的深度,用栈简单维护一下就行。
T3
type=2
的子任务给了一个非常明显的提示,特别是给出了 \(p^k\) 条件的情况下。
显然不同质因子之间互不影响,可以对每个 \(m\) 内的质因子 \(p\) 求出 \(p^k\) 结尾的答案,这也是子任务的做法,不会多项式那就直接矩阵乘法吧!矩阵大小显然很小可以直接做。
现在我们对所有的质数幂的位置,都有了以其为结尾的答案,那么线筛把不同的质数幂结尾组合起来就可以了。
这样做还是非常慢的。。。优化一下常数,发现有很多 \(p^k\) 中的 \(k=1\) ,这时候答案其实是等比数列求和的形式,可以普通快速幂直接算,能省去 \(8\)(?) 的常数,还是非常快的。
20220401省选组总结
高分秘诀:晚上早点睡,早餐要吃好,QQ别打开。
(话说rp暴涨是不是因为早上吃了八宝粥 /jk )
呜呜呜讨论时还被cue了。
T1
题意相当于用一条链将 dfs 树切成大小相同的两半。
嗯。。直接想找中位数一样往下就好了。
想到之后大约比赛开始1.5h,周围的人还在这题的数据范围游荡,心里有点小慌是不是看错题了,
不然不可能就我会做呀?
反复确认后才敲了。
T2
???奇怪的题目增加了。
一开始真的以为随机函数会有什么特别的性质,
转念一想,这样子的随机函数见过好多好多了吧,可能真的没有什么性质。
好,既然它随机,那我也随机,跳吧。
于是第一次看时盯了一小会儿就跳过了,最后半个钟左右回来写了个随机。
(真应该好好看时限的没准能水多几分)
正解是把 \(G_1\) , \(G_2\) 前 \(N/3\) 位相同的弄出来,\(G_3\) 和 \(G_4\) 同理,这样就不用理前面的了。
然后把这些拼到一起,就是找相同的合并。
T3
一开始的担心是正确的,
只不过是 T3 看错了而非 T1。
一开始以为是“左侧”同一高度的所有积木,中间可以有空,想了好久硬是连样例都想不明白,一度怀疑样例给错,
然后看了眼 QQ 群,发现没有修改题面?那就回来再好好读题。
嗯。。。这时候才知道只会推动相邻积木,离结束不足 1h。
迅速 rush 50pts 的部分分,寻思着也没多长时间了就去看 T2 ,没有死磕在这题上。
结果是悲哀的,不开 long long 见祖宗。\(50pts \rightarrow 22pts\)
正解把每个积木换成点,做成图论题了,分别考虑每块空地能填的积木个数,连向最近的那些点,边权是移到该处的代价。
埋在当地的情况每次是花费 \(2\) 的。
考虑到实际上很多点是没有用的,只会整块被移动或者埋到当地,这些点可以缩在一起。
这样边数和点数都是 \(O(n)\) 的,跑一下最短路可以得到答案。
20220405省选组总结
《关于AK场疯狂挂题这档子事》
T1
拆一下式子可以得到一个除 \(k\) 上取整相关的式子,数论分块分别处理每个 \(h_i\) 。
这里分块完是要排序的,一开始直接 sort 觉得非常不稳,于是用上堆归并排序。
最后还是挂分了(裂),一个是答案上界设小了,一个是算答案时没用排序后的数组,而是用了原本没排序的(别问我为啥这还有 70pts )。
T2
?只有我是在算体积并的吗?
容斥一下,每个三元组的贡献就是三个长方体的并,要求全部并起来。
那就先拆成 \(3n\) 个长方体,然后计算体积。用扫描线变成二维问题,然后就是一个 前缀最值修改-全局求和 的问题。
一开始没有注意到是前缀修改所以写了吉司机线段树,后面调不出来注意到是前缀,改成了直接 set 硬刚?
T3
假爆啦!
赛时想歪了觉得是道SB题,赛后才知道做法有大锅。
如果没有两行的情况,其实就是一个贪心,上下行独立。
那一个自然的想法就是在 \(O(n^2)\) DP 的基础上进行优化,将一些单行的贡献一次性计算。
由此可以发现很多状态是没有作用的。
对于第一行用了 \(i\) 格时,只用记录第二行不长于它时的最大贡献和最早位置,第二行同理。
转移比较简单。
20220407省选组总结
可以预见到这套题被喷爆……
两个板子一个暴力……
T1
先转化成每次从一堆取一些数扔到下一堆,最后面是一个垃圾桶,不能扔的输。
那么发现距离垃圾桶长度是偶数的都是垃圾桶,因为一个人将其取出来,另一个人一定可以把它扔回去,
剩下的奇数格就是 Nim 游戏,异或和经典结论。
T2
暴力碾标算(雾
一个比较优秀的 \(O(q \log n)\) 做法,但是很多状态都会被剪掉。
把树按照DFS序压到序列上,直接线段树维护区间最小值最大值,已经没有被删的数个数。
每次之间删去一段区间中深度不大于 \(dep_x + y\) 的点,跑得还是比较优秀的(
T3
这种题啊……真的板子……模拟赛出什么根号数据结构呀……
树上莫队,询问放到括号序上做,将颜色分块做到 \(O(1)-O(\sqrt n)\) 。
要特殊处理 \(lca\) ,不过那是细节问题了。
20220409省选组总结
明早晨跑(flag
T1
不难?
直接算不好算,考虑用总方案数减去有两个重心的方案数,此时深度较低的一个重心子树大小必定为 \(\frac n 2\) ,
那么要算的其实就是将一个子树接到另一个地方后,使某个点的子树大小变为 \(\frac n 2\) 的方案数。
我想的是枚举这个子树大小为 \(\frac n 2\) 的点,计算将其他子树接过来的方案数,
需求/提供 大小不同的节点显然是不会相互影响的,那么把相同的点放在一起做,树状数组直接搞一下就行。
特殊的点在于原图有两个重心,这里推一推也很好做。
这是 \(O(n \log n)\) 的,稍微剪剪枝可以碾过去,跑得比 \(O(n)\) 要快。
T2
确定了数集后,排序方式是全序的,对其排序即可。
排序方式为 \(cmp(A,B) = [A+B>B+A]\) ,其传递性可以考虑该比较的实质为字符串的自循环的比较。
然后考虑每个数的贡献,
按 \(cmp(A,B)=0\) 排序后在 \(x\) 前面的数都有可能给 \(x\) 贡献,
那么记 \(f_{i,j}\) 为当前时刻第 \(i\) 个集合,长度为 \(j\) 的数的个数,注意这里记录的只有在 \(x\) 前的数,
特别地, \(f_{i,0}\) 为第 \(i\) 个集合中在 \(x\) 后的数的个数。
令 \(F_i(x)\) 为 \(f_{i,j}\) 的生成函数。
这样其 \(x\) 的贡献就是 \(x \sum_{j \ge 0} 10^j \left( [x^j] \prod_{t!=i} F_t(x) \right)\) ,
仔细观察式子,发现 \(10^j\) 可以带到 \(x^j\) 里,只需 \(x \leftarrow j\) 即可。
那么直接维护乘积即可,由于可能构造出 \(0\) ,需要另外处理一下。
T3
简单题,就是难写。
简单LCT,简单维护,码量约 7-8k 。
20220410省选组总结
下午打球好累好累……虽然没有上场……
考场写的 ? + 30 + 52
结果 T1 结论假了真没分,T2 不知道为啥暴毙了,T3 直接 MLE ,算的时候没感觉会 M ,说明计算空间需要再多加仔细观察数组?
但是其实这个不能改 Path 又没有虚拟机就很淦。
T1
考场的结论真的假,但觉得这道题不会有什么进度,就直接写了跳过。
其实下次可以打个暴力先。
首先答案一定是 \(n\) 或 \(m\) 的约数,其次每次优先填向右的。
可以保证这样是最优的,
若全部字符相同显然可以拼成,
考虑如果可以向右但选择了向下的话,右侧的点就必有一个与开头不同的位置无法被覆盖。
T2
就很淦!
想到了后半的一部分但是不会用长剖求……
同时那个公式连通块个数=点数-边数
确实印象不够深刻。
应当正确认识这一公式的实用性。
(是不是应该开一个文档记一下这些常用的公式?)
T3
M了……
赛时打了前三档,不会在线维护答案。
但是把前几个部分分加起来空间直接爆掉了。
好吧我是傻子不知道可以离线呜呜呜。
实边:new;虚边:copy
当求一个点的度数时,考虑与其相连的点有哪些:
- 该点和该点的一些(虚边)祖先实边连出的点及其子树,要求连出的点时间小于当前点时间。
- 虚边上的最浅祖先(根)连向的子树。
如何做到 \(O(n \log n)\) 维护。
离线只是为了方便建树,确保 DFS 序的性质,这里我们还是按照时间顺序维护。
- 这种贡献一定是 \(\text{点} \rightarrow \text{根} \rightarrow \text{根的父亲} \rightarrow \text{子树}\) 的。
- 每次的贡献只记成某个点存在的形式,区间查询子树内已出现的点个数。
这个树状数组可以很方便地维护。
20220413省选组总结
暴力党大获全胜!
讲真我没怎么努力写暴力。
这 T1 能优化的但是最后不够时间了。
T2 第一档暴力分觉得复杂度不太对就根本没写。
T1
T2
特殊情况下证明四色定理?
比较有意思的构造。
考虑 \(k=5\) 时怎么做,每次往一个已经染好色的图中加入一个点,
令这个点是 \(x\) 坐标最大中 \(y\) 坐标最大的一个。
那么它连出去的点至多只有 \(4\) 个,直接染色即可。
然后由此思考 \(k=4\) 的情况。
我们希望把其中一个相邻点变色,让当前点得到一个可用的颜色。
一种有效的做法是,设相邻的四个点颜色为 \(c_1\) , \(c_2\) , \(c_3\) , \(c_4\) (顺序是以当前点为原点的极角排序?),如果改变一个点的颜色,则它相邻的的颜色也会需要修改,
那么尝试修改 \(c_1\) ,如果它会导致 \(c_3\) 也改变就不是我们想要的,此时一定可以修改 \(c_2\)。
每次修改我们让 \(c_1 \rightarrow c_3\) , \(c_3 \rightarrow c_1\) ,改色的必要条件是相邻点中有改色后与当前点相同的。
这样相当于找颜色为 \(c_1\) , \(c_3\) 交替的从 \(c_1\) 开始的增广路。
由平面图的性质可知,不存在 \(c_1\) 影响 \(c_3\) 同时 \(c_2\) 影响 \(c_4\) 的情况,
因为其颜色保证两条增广路不交,
但起点终点的位置决定了一定会有交。
T3
树剖板子