暑期集训题目小记

7.10
Luogu2216 单调队列对每一行扫一遍可以求出每行中每一段固定长度的 min,然后每列对这玩意求个 min 即可
CF1195E 同上,只需要求 min 再求和
CF979D 显然 gcd 条件可以转化成 \(k|v\),为了让异或值最大可以对于每个二进制位从高到低考虑,需要符合上界且当前位 \(i\) 确定之后,剩下的可能性中有 \(k\) 的倍数(即 \([s,s+2^i-1]\))细节略多
CF1468C POJ1442 堆 & 对顶堆简单题
CF1585F 这里

7.11
CF1656B 模拟一下发现就是 \(a_i-a_j\)
CF1198A 二分/双指针
CF1731D 二分之后二维前缀和,由于是用一维数组代替的,0 的情况要特殊考虑
CF1781D 分别考虑一下 \(b_i=0/1\),分别对应 \(S\leq a_i-1,S\geq a_i+1\),那么必然是从小到大填 1 的。
CF1790F 对每个当前变成黑色的点,考虑往上走 ans 次,每次更新一下这些祖先的 \(dis\)。然后用原来的 \(dis\) 加上当前往上跳的步数来更新 \(ans\),由于 \(i+1\) 个黑点时 \(ans\) 一定 \(<\frac{n}{i}\),因此复杂度是调和级数。(由于每个黑色点对都能在 lca 处更新到答案,因此是正确的。)
Luogu4926
题意可以转化成 \(x_A\geq (k-T)\times x_B\),或者 \((k+T)\times x_A\geq x_B\),要求最大的 \(T\) 使得无解。考虑取 log 之后变成三角形不等式,如第一个式子可以变成 \(\log x_B\leq \log x_A-\log(k-T)\),也就是连一条 \(A\rightarrow B\) 的权为 \(-\log(k-T)\) 的边。
如何处理已知的 \(x=d\) 呢?可以 \(S{ \rightarrow} x\) 连一条 \(d\) ,再反过来一条 \(-d\),其中 \(S\) 为源点。这是由于 \(x=d\leftrightarrow x\leq d \and x\geq d\)
然后二分 \(T\) 跑 spfa,如果出现负环就无解。

7.12
gym104369
A 签到题
B 设 \(dp_i\) 表示强制选了 \(i\) 且之前都满足条件的答案,\(g_i\) 表示 \(i\) 之前都满足条件的答案。转移可以用线段树优化,注意线段树起始位置
C 二分。注意不要爆 int
D 考虑往 \(n\) 个人中插空,显然是从 \(b-a\) 最大的开始插空,注意特判 \(n=1\)
E 考虑第 \(k\) 个字符串的第一个位置 \(ch\) 是什么,显然是比 \(ch\) 小的所有字符串加上第一位比 \(ch\) 大的位置都置成 1 的和,判一下和 \(k\) 的大小关系。同理往下每一位。注意判一下已经结尾的字符串的贡献
I 考虑 \(0\) 选了之后哪些位置不能选了(即可以作为 mex 的备选),显然是右上部分和左下部分。就是二维“右上角”-缀 min 和“左下角”-缀 min,可以 \(O(n^2)\) 维护,然后第一个遇到的已经被 ban 的位置就是 mex
K 暴力 bfs

7.13
CF1737D 显然最后将 \((1,n)\) 连起来最优,连边有 2 种情况,一种是 \((u,v,w)\) 直接连到 \((1,n)\),一种是 \((u,v,w)\) 中的 \(u\) 借助一个中介点 \(x\) 连到 \((1,n)\)
LOJ2436 将 0 环缩点之后 dp
Luogu4208 一个结论:最小生成树中权值相同的边个数是一样的,而本题中小于 10,因此直接对于每个权值,暴力枚举选了哪些边判一下是否连通即可
BZOJ1977 对于非树边 \((x,y)\) 求一下树上这条链的 max,换成 \((x,y)\) (需要保证 \(max\) 小于 \((x,y)\) 的权值),因此维护一下树上的最大值和次大值即可,链上倍增即可
Luogu4768 kruskal 重构树

7.14
CF1774E 每个 1 号集合中的点 \(x\),显然应该往 2 号集合插一个 \(x\) 往上跳 \(d\) 步的点,反之亦然。然后分别跑 dfs 即可
CF1740E \(dp_i\) 表示考虑到根为 \(i\) 的答案。由于答案一定是每个子树中链的 max,\(dp_i\) 应该和 \(dep_i\) 的 max,而且还可以是每个子树答案的分开求和(且不包含 \(i\) 点因为 \(i\) 只有子树的 min,不贡献答案)因此 \(dp_i \leftarrow dp_j\)
CF1830C 发现如果两个区间有交,那可以拆成三个不重叠区间,一个区间的合法的括号序列数量就是 Catalan 数,如果两个区间包含,那可以拆成两个部分,一个是小区间,另一个是另外的两个部分并起来。判断区间可以用异或 hash
CF1785C 首先注意到 2 操作之前肯定要变成不严格上升的阶梯形状(如:1 1 2 3 4 4 5 ..),首先如果最后的结果出现相同的数,那么这些相同的数一定没有改变。如果只保留一个“没有改变的数”,此时步数就是 \([a_1,...,a_m] - [1,...,m]\)。考虑如何判定最终这个阶梯形状到了哪个数。设 \(k_x\) 表示 \(\leq x\) 的数出现了多少个。那么如果 \(k_x>x\),显然这个 \(x\) 就应该删除了,而且 \(x\) 应该是最早出现的那个数。由于每次只会增加一个数,因此出现了 \(k_x>x\) 则必然为 \(k_x=x+1\),线段树上二分即可。

7.15
gym104460K 显然到 \(k\) 个 exit 可以转化为先将 \(k\) 个 exit 入队。然后 \(d\) 的限制可以转化为对于当前点松弛 \(d\) 次(即:当堆首弹 \(d\) 次,第 \(d+1\) 次更新答案),\(dis_1\) 就是答案
CF229D \(dp_i\) 记两个值,分别是答案、最后一部分的和。显然答案是第一关键字优先更新,再在这基础上更新和

7.17
CF467D 建图 缩点 在 DAG 上 dp,注意哈希要用 map,手写哈希被卡爆了
Luogu5058 tarjan(s) 在边 \((u,v)\) 判割点的时候如果出现 \(t\)\(dfn[t]\geq low[v]\) 说明 \(s,t\) 能被 \(u\) 割开
Luogu3225 如果没有割点,最小值肯定是 2。否则:最小值是 只与一个割点相连的极大连通块个数,方案就是 这些极大连通块 sz 之积
Luogu2860 求边双连通分量
Luogu4171 2-sat 板子题
CF1239D 如果 \(a_i\) 人认识 \(b_i\) 猫,那么答案 \(a_i\) 人和 \(b_i\) 猫不能同时出现,也就是说 \(a_i\) 人和 \(b_i\) 人可以同时出现,建出有向图之后跑 tarjan 即可

7.18
Luogu3311 数位 dp + AC 自动机,AC 自动机的结点记到状态里面
SPOJ MYQ10 如果位数不同直接公式,否则数位 dp,一个记左边部分和上界的关系(</=),一个记右边部分和上界的关系(</=/>)
Luogu3195 斜率优化 dp
gym104128B 先求出 \(f_i\) 表示第 \(i\) 个位置强制选,\([1,i]\) 的答案,\(g_i\) 表示 \([i,n]\) 的答案。然后对于一次修改 \((p,v)\),对于 \([p,p+k]\) 重新更新一下 \(f_i\),答案就是 \(f_i+g_i-a_i\),注意考虑一下强制选的情况

7.19
gym103366A 暴力dp + 滚动数组优化
gym103366B 模拟即可
gym103366C 曼哈顿距离显然可以转化成 x 坐标的距离,然后设 \(dp_{i,j}\) 表示考虑到第 \(i\) 个区间,在左端点选了 \(j\) 个的最优解,如何考虑贡献?假如选了左端点,考虑左端点到 \(x=0\) 的贡献。\(1..i\) 的左端点到 0 的距离和 - \(i+1..n\) 中选了左端点的距离和(因为下面的左端点和 \(i\) 的距离等于下面左端点到 0 的距离减去 \(i\) 左端点到 0 的距离) + \(i+1..n\) 中选了右端点的个数(因为 \(i\) 和右端点也可以相连产生贡献)
gym103366F 设 \(g_i\) 表示传统汉诺塔的方案(显然是 \(g_i=2^i-1\)),\(f_i\) 表示答案,则 \(f_i = \max{f_j+2\times g_{i-j}}\),打表发现有决策单调性
gym103366H 如果第一下无法把后手杀死,那么后手可以一直回血,先手只能同步回血,后手总是更优的
gym103366J 题意题 二分即可
gym103366KL 签到

7.20
博弈论
如果遇到多个独立游戏,可以先计算每个游戏的(初始状态)sg 值,然后对这些 sg 值异或
如何求状态的 sg 值?将状态写成 DAG 的形式,然后一个点的 sg 值就是他所有后继的 sg 值的 MEX。出度为 0 的点的 sg 值即为 0
A 伪博弈题,注意到假设当前取得的答案序列的末尾值是 \(mx\),剩下的序列是 \(a[l..r]\),如果 \(a_l>a_r\),那么如果选了 \(a_l\) 之后 \(a_r\) 那一段都不能选了,因此需要判一下 \(a_l\) 往后严格单调递增的数的个数的奇偶性,同理 \(a_r\) 往前严格递增的数也要预处理出来
C 伪博弈题,先把原来的未出现的数的集合求出来,显然 Alice 最多能删 \(k\) 个奇数,Bob 删 \(k\) 个偶数,判一下删完之后奇数小还是偶数小即可
D 原题
E 显然是多个独立游戏,先求 sg 函数再异或即可,设 \(sg_{i,j}\) 表示在 \((i,j)\) 位置的 sg 函数,如何更新呢?注意到 \(i+j\) 每次必然转移到更小的位置,因此可以先枚举 \(i+j\),再枚举 \(i\),求出 \(j\)
F 判一下两边的问号个数和两边的差,如果问号数相同,则两边差相同时后者赢,如果问号数不同,则差为 \(q\),两边差为 \(q/2\times 9\) 时后者赢,可以归纳得到
G 对每个数量暴力预处理出 sg 函数即可
H 直接模拟转移的 DAG,1~p 必败,\(p+1..p+q\) 必胜,\(p+q+1..2\times p+q\) 必败,\(2\times p+q+1..2\times p+2\times q\) 必胜,以此类推
I 打出 sg 函数的表找规律即可

7.21
Luogu2485 bsgs 裸题,注意 \(a^X=b(\mod p)\) 中的 \(a\)\(b\) 可以为矩阵
Luogu3306 首先将递推式写成通项,发现是一个 \(X_i=(a^{i-1}+C) \mod p\) 的形式,看是否有某个数,就是求 bsgs,注意特判 \(a=1\) 的情况
HDU5446 题意就是求 \(C(n,m) \mod p\),其中 \(p\) 可以写成若干个质因数(1e5)之积,\(n\)\(m\) 很大。可以对 \(p\) 的每一个质因数都求一个组合数(lucas定理),然后再用 CRT 合并即可
Luogu2480 对于指数考虑,相当于需要 \(\mod p-1\),对 \(p-1\) 分解质因数,为 \(2,3,4679,35617\),然后 lucas 定理求一下组合数,crt 合并即可,特判一下指数为 0 的情况

7.22
周测 三道原题+一道傻逼题 服了

7.24
BZOJ1001 我直接跑网格图上最小割,什么对偶图最短路,真不熟
POJ2112 每个挤奶器往汇点连一个容量为 \(M\) 的边,然后奶牛往挤奶器连一条容量为 1,费用为 \(dis_{i,j}\) 的边,跑费用流即可
Luogu2053 将一个车拆成 \(k\) 个点,第 \(i\) 个表示这辆车倒数第 \(i\) 次洗的,此时的贡献就是 \(T_{i,j}\times i\),这是费用,容量为 1.其它容量为 1,费用为 0.跑 mcmf 即可。
Luogu1251 将一天拆分成白天和晚上,那么每个白天需要向汇点输送干净的纸巾,源点向每个晚上输送脏纸巾。如果用 \((x,y,c,p)\) 代表 \(x\)\(y\) 连一条容量为 \(c\),价值为 \(p\) 的边。那么有 \((s,i+n,a[i],0), (i,t,a[i],0), (i+n,i+m1,inf,c1), (i+n,i+m2,inf,c2), (s,i,inf,p)\),跑 mcmf 即可
Luogu2774(略有不同)注意到实际上是一个二分图,考虑转化。一个点 \(A\) 连向他相邻的边 \(B\),连的方式就是 \((s,A,v_A), (A,B,inf), (B,t,v_B)\),其中删一条边表示不选这个点,由于最小割,因此 \(S\rightarrow A\rightarrow B\rightarrow t\) 至少割掉一个,也就是不能都选。求的是最小割,用总的和减去即可
Luogu1646 考虑每个点 \(i\)\(s\rightarrow i\) 表示选文,\(i\rightarrow t\) 表示选理,如何表示 \(i,j\) 都选文?新开一个点 \(u\)\(s\rightarrow u, u\rightarrow i, u\rightarrow j\) 其中 \((s,u)\) 有权值,\((u,i),(u,j)\) 连 inf,选理的同理,不过要改成向 \(t\) 连边,求一下最小割即可。为什么是对的?考虑两个都选文,那么肯定源点直接连的边是要割掉的,但是这里还有一个点 \(s\rightarrow cnt\)\(cnt\rightarrow t_1,t_2\),其中后者的边是不能删的,只能删前者否则就连通了,就完美实现了都选文的额外加分。一文一理呢?s 向文的连边删了,t 向理的连边删了,而且文和理没有额外连边,因此是对的

7.25
Luogu2607 基环树 dp 模板题
Luogu2831 状压 dp,注意每次从 lowbit 开始枚举
CF1009F dsu on tree
GYM102992M 树形背包即可
CF1852A 二分

7.26
GYM103855D 开个 multiset 记一下前缀后缀的怪物,写吐了
GYM103855E 从前往后扫,如果当前位置不能干掉下一个位置,那么这之前的位置都不会再变了。如果一样,就记一下连续多少个。如果能干掉,就将这个位置移到这一段最前面
CF103855F 傻逼题,首先缩成 WBWB.. ,可以构造出方案使得可以任选两种颜色。
CF103855H 傻逼题
CF103855M \(\min(a,b)=a+b-\max(a,b)\)\(\max(|x_i-x_j|,|y_i-y_j|)\) 是切比雪夫距离,有一个结论可以转化成曼哈顿距离 \(x'=(x_i+y_i)/2, y'=(x_i-y_i)/2\),那么 \((x_i,y_i),(x_j,y_j)\) 的切比雪夫距离就是 \((x'_i,y'_i),(x'_j,y'_j)\) 的曼哈顿距离,排个序即可

7.27
LOJ10121 首先求出一个点 \(i\) 右边第一个和他一样的点 \(nxt_i\),那么这段就是以这个点开头的长度。考虑一次询问 \([L,R]\),显然是由一段完全包含在这段内部加上 \([x,R]\),其中 \(x\)\(nxt\) 是要大于等于 \(R\) 的,显然 \(nxt\) 具有单调性,因此可以二分。完全包含那段可以用 st 表解决
Luogu5490 扫描线模板 考虑一条平行于 y 轴的直线沿 x 方向从左向右移动,用一棵线段树记录一下当前这条直线上有哪些位置覆盖了(因此 x,y 都要提前离散化),一种维护技巧是用线段树的下标代表离散化之前的线段,用值代表实际的区间覆盖长度。然后每次移动的时候的面积就是 \(x\) 轴实际移动的距离乘以 y 方向的实际距离
Luogu2048 考虑将信息压缩,维护一个五元组 \({l,r,i,bk,val}\) 代表当前信息是以 \(i\) 开头,可以连续取的个数在 \([l,r]\) 间,这段的最大值在 \(bk\) 处取到,最大值为 \(val\),将这个信息压到堆中,显然堆按照 \(val\) 从大到小排。每次取的时候先将 \(val\) 取出来,然后将信息分裂成 \({l,bk-1,i,new_bk,new_val}, {bk+1,r,i,new_bk2,new_val2}\),继续操作即可
CF1208D 考虑从后往前还原,最后一个位置的 \(s\) 显然等于 \(p_n\times (p_n+1)/2\),因此可以得到 \(p_n\),倒数第二个位置呢?本来应该也是 \(p\times (p+1)/2\) 的形式的,但是 \(p_n\) 可以取到 \([1,p]\) 之间导致问题。考虑二分哪个位置 \(i\),如果 \(i\times (i+1)/2\) 减去之前已经选过的在 \(i\) 之内的和等于 \(s\) 就 ok。可以用树状数组维护这个过程
Luogu3508 首先将询问的条件转化一下,就是将序列和 \(s\) 取个 \(\min\) 之后询问区间和。建个权值线段树维护一下 \(\geq s\) 的个数即可

7.28
公式太多了,干脆手写了
image
HDU4639 打表发现就是 \(2^{质因子个数}\),注意空间限制不能线性筛,埃氏筛解决

7.29
Luogu2045 网络流,相邻格子 \(a,b\) 如何连边?可以给 \(a\) 开一个虚点 \(A\),然后 \(a\rightarrow A\) 连一条 \(cap=1,v=a_{i,j}\) 的边,再连一条 \(cap=inf,v=0\) 的边,然后 \(A\rightarrow b\) 连一条 \(cap=inf,v=0\) 的边,跑最小费用最大流即可
Luogu3768 推推式子得到 $$ans=\sum_{k=1}^n k^2 \mathit{sum}^2(n/k) \varphi(k)$$,数论分块,\(k^2\varphi(k)\) 的前缀和可以用杜教筛解决
Luogu2949 倒着贪即可
CF242E 线段树傻逼题
HDU7304 前缀和优化 dp

7.31
HDU6231 主席树裸题
Luogu4137 离线之后维护权值的位置,线段树解决
spoj10628 在树上建主席树即可,每次 \(rt_x\)\(rt_f\) 更新来,求路径类比树上差分
spoj TTM 标记永久化 溜了溜了
然后一堆树剖经典题,不放了
CF840D 注意到满足题意要求的数很密集,可以用主席树:对区间内的元素建权值线段树,每次查询第 \(1,1+k,1+2\times k..\) 大的元素,满足要求的点必备包含,然后暴力判断这些点即可

8.1
Luogu3435 要找一下最小的 border \(mxt_i\),可以每次求 nxt 的时候暴力跳 nxt(再判掉 border=1 的情况),然后 \(i-mxt_i\) 就是 \(i\) 对应的答案
BZOJ3670 先考虑求一个没有限制时的答案 \(num_i\),这就每次求 nxt 的时候转移即可。然后考虑限制:每次求 \(i\) 的 nxt 的时候不能超过一半,然后此时满足要求的 border \(j\)\(num_j\) 就是答案,由 border 的性质和 nxt 的定义,此时 \(num_j\) 完全包含且仅包含满足条件的方案
CF514C 每次暴力枚举位置和改变的字符,hash 一下即可
CF432D 首先满足要求的前后缀一定是 \(nxt_n\) 不断跳 \(nxt\) 的结果,考虑中间什么时候能加入答案。如:\(6\rightarrow 3\rightarrow 1\)(跳 nxt 的过程)那么中间如果出现了某个位置 \(nxt_i=3\),那么显然 \(nxt_i=1\) 也是可以加入答案的,因此启示我们可以对跳 \(nxt\) 的这段序列做后缀和,然后统计答案即可
HDU7279 hash 傻逼题,也可以最小表示法
CF1828E 首先一个很厉害的性质是 \(dp_i\) 一定可以由最右边的回文序列转移过来,用 manacher 求出转移点即可

8.3
BZOJ4503 构造函数 \(f(i)=\sum_{i=1}^na_i\times b_i\times (a_i-b_i)^2\),如果是问号就是 0,拆开成三项,将 \(b\) 倒过来就是一个卷积的形式,是加法卷积。
BZOJ4589 将质数取 1,非质数取 0,然后做 \(n\) 次和自己的 fwt,注意直接做会 T,可以用快速幂,将原数组做一次正变换,然后快速幂,最后再逆回来

8.4
带修莫队,实际上就是三维的莫队,每次查询 \((l,r)\) 实际上是查询 $(l,r,t) $,那每次如果 \(t\) 大了的话就回退
Luogu4168 分块预处理,每块考虑维护这一段出现的最大次数元素以及每个元素在每个块中出现的次数的前缀和。对于每次查询,因为块外的元素最多 \(O(\sqrt{n})\) 个,因此可以直接暴力判断
Luogu4135 同上题,每次查询的时候看一下块外的元素是由奇数变成偶数还是反过来,利用这个更新答案

8.5
周测,打吐了

8.7
GYM104090K 对串建出字典树,对于当前的串,在字典树上走,考虑如果当前要走到的儿子之外的所有子树,子树的大小显然就是在这个串之前的串第一个和这个串不一样的位置。这是可以根据字符大小求出逆序对的。注意一下一个串是另一个串的子串的情况
Luogu2536 暴力 dp,设 \(dp_{i,j}\) 表示第一个串匹配到 \(i\),第二个串匹配到 \(j\) 是否可行。转移显然
Luogu3797 考虑维护线段树,每个节点记一下最左和最右的左右括号位置,以及当前线段的答案,合并也显然,注意一下细节
Luogu4735 显然询问可以转化成对一个前缀询问。考虑建一下 01 trie,然后发现要求的是某一个前缀异或上 \(X\) 的最大值。由于询问的 \(p\) 也有限制,因此需要将 trie 可持久化。

8.8
SAM 难难难
还有最小表示法模板题若干

8.9
GYM104417
ADGI 签到题
L 其实也是签到,每次放一个最大的 L 就可以把 \(n\) 减小 1
E 显然先除再乘,考虑每一次乘的下界和上界,如果包含了一个 \(m\) 的倍数那就合法了,由于 \(m\) 只有 1e9 因此复杂度是 log 的
B 用类似拓扑排序,对每个职业可以先把人数 sort 一下再扫。每个点的 “入度” 就是对应所需职业的个数
J 对于某个 \(i\),如果边权 \(w\and i=i\),那么这条边是加上的,否则删去,跑连通性。如果 \(i\) check 过了,那么 \([i,i+lowbit(i)-1]\) 一定不会再 check 了。为什么?如果 \(i\) 使得某个点对成功相连了,那么已经没有再 check 的必要了,否则,连 \(i\) 都不行,那比 \(i\) 更严格的 \(i\) 的超集一定也不可能。时间复杂度 \(O(m\log n)\)
M 考虑答案分成两部分:\(k+1\) 边形 + 上面的三角形。这个 \(k+1\) 边形的面积可以线性求出。发现上面三角形面积最大时的顶点位置一定是单调的(因为多边形是凸的)

8.10
Luogu2473 设 \(dp_{i,S}\) 表示第 \(i\) 轮,宝物状态为 \(S\) 在之后最优策略下的期望分数。\(dp_{i,S} \leftarrow \dfrac{1}{m}\times \max(dp_{i+1,S}, dp_{i,S|2^j}+p_j)\)(后一个式子有条件,\(p_j\) 所要求的宝物必须全都在 \(S\) 中出现过),最后答案就是 \(dp_{1,0}\)
Luogu3232 边期望次数转成点期望次数,然后发现转移有环,高斯消元解决
HDU7315 设 \(f_i\) 表示某一个位置第 \(i\) 轮在原位置的概率,\(g_i\) 表示不在的概率,那答案就是 \(n\times f_m\)(因为显然每个位置都是对称的),转移有 \(f_i=f_{i-1}\times \dfrac{n^2-2n+2}{n^2}+g_{i-1}\times \dfrac{2}{n}\)\(g_i\) 同理。矩阵快速幂即可
HDU7330 考虑 \(1^m+..+k^m\) 的概率,实际上就是一个组合数,推一推就行
HDU7348 归纳一下可得全 1 看 1 的个数,否则一定是 1/2
Luogu3830 待填
Luogu4284 换根 dp,待填

8.11
Luogu8210 对于每个环来说,发现 2 个寄存器恰好能满足条件。于是做完了

8.12~8.13
第一场爆推莫反式子,想了半个多小时发现可以调和级数求差分
第二场先打表找规律然后第二类斯特林数爆推式子,发现瓶颈在求斯特林数,NTT 优化。
然后由于这题花时间太多导致有个枚举子集的傻逼题差了一点调出来,残念。
image

然后就进校队了~
image
A new beginning.

posted @ 2023-07-11 15:33  SkyRainWind  阅读(40)  评论(0编辑  收藏  举报