太简单的题,但是又要记录下来做过哪些东西,就写在这里啦~
早搞不搞,等到快退役了才来搞
标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么
组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”
A:若有解,则 l c m ( n , m ) lcm(n,m) lcm(n,m) 就是最小解
B:对每个 i i i 考虑删 a j a_j aj 时 a i a_i ai 造成的贡献,即 n ! ∣ i − j ∣ + 1 a i \frac{n!}{|i-j|+1}a_i ∣i−j∣+1n!ai
*C:每条边拆成 a i a_i ai、 b j b_j bj 两条边,还是找最小圈。那么有三种情况:每个点只贡献 a i a_i ai、每个点只贡献 b i b_i bi、其他。对于第三种情况,枚举一个 i i i 表示它贡献了 a i + b i a_i+b_i ai+bi,那么剩下的就是选 a 1 , ⋯ , a n , b 1 , ⋯ , b n a_1,\cdots,a_n,b_1,\cdots,b_n a1,⋯,an,b1,⋯,bn 里去掉 a i a_i ai 和 b i b_i bi 的最小的 n − 2 n-2 n−2 个
*D:设 f i , j f_{i,j} fi,j 表示最小元素为 i i i、最大元素为 j j j 的连通块数,通过容斥转移
**E:贪心按位考虑,根据题目性质可以化为一个类似于 LIS 的 dp
看大题解
A:略
B:lowbit 相同的分一组,每组从大到小贪心
C:二分,当 a i < a i − 1 a_i < a_{i-1} ai<ai−1 的时候就把 a i a_i ai 抬升一位, a i a_i ai 抬满了就抬 a i − 1 a_i-1 ai−1,注意一些细节
A: b + min ( a + b + 1 , c ) b+\min(a+b+1,c) b+min(a+b+1,c)
A:必定是 a 1 a 2 a 3 a 1 a 2 a 3 ⋯ a_1~a_2~a_3~a_1~a_2~a_3 \cdots a1 a2 a3 a1 a2 a3⋯ 这样循环,分类讨论共 3 种情况
*B:做一棵 dfs 树,非树边随便定向,树边从下往上定向,判断根是否合法
*C:如图: n n n 为奇数就大风车, n n n 为偶数就另外加上 n n n, n n n 为 2 2 2 的幂无解
**D:考虑每张牌的贡献次数,设 f l , r , x , y f_{l,r,x,y} fl,r,x,y 表示 [ l , r ] [l,r] [l,r] 这个区间, l l l 贡献 x x x 次, r r r 贡献 y y y 次,的最小代价和。枚举最后吃的那张,发现它的贡献是 x + y x+y x+y,就 dp 下去了
看大题解
^A:考虑 ( 0 , 0 ) , ( 1 0 9 , 1 ) , ( x , y ) (0,0),(10^9,1),(x,y) (0,0),(109,1),(x,y),则 1 0 9 y − x = S 10^9y-x=S 109y−x=S,令 y = ⌈ S 1 0 9 ⌉ y=\lceil \frac{S}{10^9} \rceil y=⌈109S⌉
B:考场做法:每个元素向它走到的下一个元素连边,找循环节,暴力跑最后一层
题解做法:连边,然后倍增求每个点走 2 k 2^k 2k 层到哪
看大题解
*C:符合条件的序列满足和为 3 M 3M 3M、单个元素不超过 2 M 2M 2M、奇数个数不超过 M M M,用组合数和容斥算方案数
*D:设 p i p_i pi 为 0 0 0 到各点的最短路,dp p p p 序列的负差分
E:大讨论
A:若为 C < D C
B:相当于 BC 是障碍物,A 要跳过障碍物到最远的地方去
C:二分,然后推式子发现最多只有一科不是满分,枚举那一科然后剩下的贪心选
A:略
B:显然贪心可得最优答案。然后计数,每个第三色有多少种第二色选择,每个第二色有多少种第一色选择,全部乘起来,再乘个 n ! n! n!
*C:倒过来做,如果 b i > a i b_i>a_i bi>ai 且 b i > b i − 1 + b i + 1 b_i>b_{i-1}+b_{i+1} bi>bi−1+bi+1 那么这个 b i b_i bi 必然要被操作,用一个堆找最大的 b i b_i bi 来做
A:略
B:枚举分界点,答案是左右两边的差的绝对值
C:同一行的草莓先把这行划分掉,然后如果有一行没草莓就复制它上面或下面的分法
*D:解法一:暴力。每个数字是有循环节的(即使用多少个这个数字可以得到它自己),把循环节消掉了就是暴力
解法二:顺序是不影响的,那么考虑把每个数字全部拆成 1,因此进位的影响就是 ⌊ 数 位 和 − 1 9 ⌋ \lfloor \frac{数位和-1}{9} \rfloor ⌊9数位和−1⌋
*E:先二分一个位置 i i i 使得 [ i , i + n − 1 ] [i,i+n-1] [i,i+n−1] 和 [ i + 1 , i + n ] [i+1,i+n] [i+1,i+n] 的回答是不同的,那么 i i i 和 i + n i+n i+n 的颜色就确定了,并且 [ i + 1 , i + n − 1 ] [i+1,i+n-1] [i+1,i+n−1] 这段区间是两种颜色相同的。剩下的都可以利用 [ i + 1 , i + n − 1 ] [i+1,i+n-1] [i+1,i+n−1] 来完成
我为什么要交题
A:答案等于从 ( 1 , 1 ) (1,1) (1,1) 走到 ( n , m ) (n,m) (n,m) 所经过的最少的连续 1 1 1 的段数, O ( n 2 ) O(n^2) O(n2) dp
*B:先判断答案是奇数还是偶数(看成异或,Lucas 定理算每个数被贡献了多少次),若为奇数则答案为 1 1 1,否则若原序列有 1 1 1 则答案为 0 0 0,否则把 2 2 2 当成 1 1 1 再判奇偶
AB:略
C:从顶层到底层,逐层确定每层能选多少个点, O ( n ) O(n) O(n)
DEF:
A:首先让全部数字都是每行的 min \min min 值,然后找 m − 1 m-1 m−1 个最大值和 1 1 1 个次大值替换成列的 max \max max 值。
*C:考场解法:想办法做出拓扑图就能得到最终序列了,于是线段树优化连边得到拓扑图,时间 O ( n log n ) O(n \log n) O(nlogn)。
题解解法:先判掉 i < j < n e x t i < n e x t j i
**E:先用 4 log 4\log 4log 的时间确定每个点的层(类似于整体二分,同一二分层的奇数段一起做,偶数段一起做),再用 3 log 3\log 3log 的时间为每个点找父亲(逐二进制位确定每个点父亲,模 3 3 3 相同的层一起做)。
没 AK,丢人~
AB:略
C:要单调不降的区间就全都平着,其他都下降
D:区间排序等价于不断交换相邻两个,因此 a a a 数组必须包含 b b b 数组的所有逆序对。随便维护
E:dp,换根
*F:考场解法:设 f i , j , k f_{i,j,k} fi,j,k 表示到了第 i i i 个元素,结尾为 j j j,共 k k k 段,的方案数。 k k k 用 AGC019E 的思想优化成 0 ∼ 2 0\sim 2 0∼2, j j j 扔线段树上,那么转移就是区间乘和加(矩阵)。代码过长,常数过大,请勿模仿
G:费用流直接上。因为最大流只有 50,因此相当于跑 50 次最短路,这是不会 T 的。但还是把你吓得半死甚至丢了一血
ABC:略
D1:判是否存在度数为 2 的点,因为度数为 2 的点两边一定是一样的
*D2:选一个叶子为根,从下往上一条边一条边确定
^E:史上最大诈胡题 两边同乘 ( a i − a j ) (a_i-a_j) (ai−aj),平方差公式
^*F:设 f i , j , x f_{i,j,x} fi,j,x 表示到了第 i i i 个数,选了 j j j 个,最小间隔为 x x x 的方案数。后两维的有用状态总和为 O ( k ⋅ a k ) = O ( a ) O(k \cdot \frac ak)=O(a) O(k⋅ka)=O(a)
A:全买 1$ 和 5€,暴力枚举买了多少个 1$
B: n + 1 − max ( 0 , n − b ) − max ( 0 , n − g ) n+1-\max(0,n-b)-\max(0,n-g) n+1−max(0,n−b)−max(0,n−g)
C:要么原串合法,要么把最后一个左括号放到开头,要么把第一个右括号放到结尾
D:答案最多为 2 2 2(封住左上角),因此判断是否存在割点或者左上右下不连通
E: d i d_i di 从大到小做,最长的作为主链,然后贪心填满主链,其他随便挂在主链上
*F:一定能从某个地方割开成链然后从左到右贪心匹配。因此先假设是 1 1 1 到 m m m 的链,每个点的坐标要么是正贡献要么是负贡献,看它前面的 a a a 和 b b b 的数量。然后每次把开头的人丢到结尾,可以快速计算对答案的影响。
*G:每行开一个 bitset,若某两行的 bitset 不是包含关系则有解。判断是否存在两行不互相包含只需按 size 从小到大排序然后依次检查相邻两个,用 set 维护
看大题解
H:若直径小于 k k k 则任意染;若 k = 2 k=2 k=2 则黑白染色;否则直径按 1 1 1 到 k k k 循环染,剩下的枝都有长度限制,在长度限制以内方案是唯一的,超过长度限制则无解
A:贪心
B:模拟 1 0 5 10^5 105 次
C:枚举分界的数字,小于它的染 1 色,大于它的染 2 色,这个数字单独判断
D:看成连边,然后答案为 n n n 减生成森林的边数
E1E2:只有 min ( n , m ) \min(n,m) min(n,m) 列是有用的,随便状压一下
F:做出最短路图,按拓扑序处理每一个点,这个点相当于选择一条入边然后更新 trie。选择哪条入边更优秀那就看谁是 lca 的小的儿子
G1:设一个数字最左出现在 l l l,最右出现在 r r r,那么 [ l , r ] [l,r] [l,r] 要全部同色。栈+并查集维护一下就好了
**G2:维护这个区间并。给 [ l , r − 1 ] [l,r-1] [l,r−1] 全体加 1 1 1,那么 0 0 0 就是区间并的分界点。用线段树维护这个,然后求区间众数的话再开一棵线段树,每个数的出现次数赋值到最早出现的位置,那么就是个区间最大值
看大题解
A:若第一行存在相邻同色格子,那么后面的行的方案是唯一的;否则等价于第一列的方案数。都是一个递推过去
*B:先把原串循环移位成一个合法括号序(若不存在则答案为 0),然后只有最外层和次外层的匹配括号对才能交换,贡献可以用栈来算
C:大模拟
D:有向图 tarjan 缩环,找到一个没有出度的强连通分量即可作为 jury,其余作为猫
E:一定是第一行从小到大,第二行从大到小,于是最大路径只能是走边界的两条之一。因此问题变成,从小到大排序,前两个数放左上和右下,后 2 n − 2 2n-2 2n−2 个数平分成两个集合,使得最大和最小。 O ( n 3 max a ) O(n^3\max a) O(n3maxa) dp
*A:任意括号序都是可以被构造的,当前这位不合你意就在后面找一个换
B1B2:询问离线,把元素以大小为第一关键字、位置为第二关键字排序,依次激活,线段树二分查询第 p o s pos pos 个。
C:二分,用二维前缀和判断
*D1D2:题分为 h i = h i + 1 h_i=h_{i+1} hi=hi+1(无论如何选都贡献 0)和 h i ≠ h i + 1 h_i\not=h_{i+1} hi=hi+1(可贡献 1、-1、0)两种,由对称性,正贡献的方案数等于负贡献的方案数,所以非零贡献的方案数除以 2 就是答案
AB:略
C:只有经过 0 0 0 的路径是有用的,且必然是在一条路径上放 0 0 0 ~ l e n − 1 len-1 len−1。类似于区间 dp,设 f u , v f_{u,v} fu,v 表示 u u u 到 v v v 这条路径的答案。
D:集合点一定在某个关键点上,预处理一些东西后任意两个关键点之间的距离可以 O ( 1 ) O(1) O(1) 算。那么就枚举集合点,然后暴力算距离, O ( k 2 ) O(k^2) O(k2)。注意 k = 0 k=0 k=0。
AB:略
C:算每个连续段的贡献
D:按一边的区间排序,set 维护另一边的开始结束时间,判断这边相交的是否有另一边没交,再反过来做一次
E:枚举中心点,剩下的三点只要不在该点的同一侧即可,于是极角排序+two pointers
FG:
A:移项得到 i − b i i-b_i i−bi 相同的组一队
B:终点出发求最短路图,每个 p i p_i pi 依照最短路图的出边进行讨论递推
C:二维偏序随便搞搞
D:一个串的最小表示是:(开头可能有奇数个 1)+(若干个0)+(奇数个1)+(若干个0)+(奇数个1)+…+(结尾一堆1),把这个形状 hash 起来,线段树维护区间 hash
EF:
A:贪心
B:若有步长等于 x x x,则可以一步到位;否则等于 ⌈ x 最 长 步 长 ⌉ \lceil \frac {x}{最长步长} \rceil ⌈最长步长x⌉
C:长度只能为 1 或 2
D:从起点跑一次 bfs,从终点跑一次 bfs,再找 bfs 序相邻的两个关键点连边
*E:枚举分界线(即枚举左集合的最右牛),每种 f f f 的牛独立算贡献
FG:
A:前缀和为 0 0 0 的位置作为分界点,把序列分成若干段,有问题的段重排
B:按位考虑,每一位相当于要求两个数的和在两个区间内,two pointers
*C:右边的点按照邻集分类,同类求和,不同类求 gcd \gcd gcd
*D:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示倒着枚举到了第 i i i 个数,数字大小为 j j j,有 k k k 个数字,的最优答案。复杂度分析同那种看起来是 O ( n 3 ) O(n^3) O(n3) 实际是 O ( n 2 ) O(n^2) O(n2) 的树形 dp
EF:
A:从左往右放,每个 l i l_i li 放在 max ( i , ∑ j = i n l j ) \max(i,\sum_{j=i}^n l_j) max(i,∑j=inlj)
B: a i a_i ai 的二进制最高位必须是递增的,因此最多 30 来个,随便 dp
C:每次贪心找最大的可删除的结点
DE:
A:填平 max i < j , a i > a j a i − a j \max_{i
B:最小:若所有叶子的深度的奇偶性相同就是 1,否则是 3;最大:初值为 n − 1 n-1 n−1,每当有 x x x 个叶子父亲相同就减去 x − 1 x-1 x−1
C:打表找规律
D:树形 dp,设 f i , 0 / 1 f_{i,0/1} fi,0/1 表示以 i i i 为根的子树, i i i 选或不选,的最优答案。 f i , 0 = 儿 子 数 量 − 1 + max { f s o n , 0 , f s o n , 1 } f_{i,0}=儿子数量-1+\max\{f_{son,0},f_{son,1}\} fi,0=儿子数量−1+max{fson,0,fson,1}, f i , 1 = max { f s o n , 0 } + 1 f_{i,1}=\max\{f_{son,0}\}+1 fi,1=max{fson,0}+1,旋根 dp
E:
AI:略
C:cdq 模板题
^D:若存在 0 0 0 权或所有结点权值均 ≥ 2 \ge 2 ≥2 则直接找一个最小权点即可;否则先找到最长的 1 1 1 构成的直径,然后再考虑是否有两条最长的 1 1 1 直径用一个 2 2 2 连起来,后者用旋根 dp 预处理每个 1 1 1 最长能延伸到多少。
F:SA 搞一搞,注意坑点,比如 / 和 . 互换
BEGH:
BC:略
A:设两种原材料分别有 a , b a,b a,b 个,最终合成了 x x x 个物品,则有 a − x + b − x ≥ x a-x+b-x\ge x a−x+b−x≥x,即 a + b ≥ 3 x a+b \ge 3x a+b≥3x,因此输出 min { a , b , ⌊ a + b 3 ⌋ } \min\{a,b,\lfloor \frac{a+b}{3} \rfloor\} min{a,b,⌊3a+b⌋}
D:找到 a i a_i ai 最小的质因子 p p p,则 d 1 = p d_1=p d1=p, d 2 = a i d_2=a_i d2=ai 除以 p p p 除到不能除为止,若 d 2 = 1 d_2=1 d2=1 表示无解
E:相邻两段的分界线是造成方案不唯一的原因,预处理后缀最小值然后随便搞搞
*G:类似于 LCS 一样 dp,预处理第一个串 l e n i len_i leni 表示从 s i s_i si 出发第一次到达空串需要多长。
F:
ABCDEFG:略
H:设 M = p 1 c 1 p 2 c 2 ⋯ p k c k M=p_1^{c_1}p_2^{c_2}\cdots p_k^{c_k} M=p1c1p2c2⋯pkck, N = p 1 d 1 p 2 d 2 ⋯ p k d k N=p_1^{d_1}p_2^{d_2}\cdots p_k^{d_k} N=p1d1p2d2⋯pkdk,那么会有 d i ∏ j = 1 k ( 1 + d j ) = 2 c i d_i\prod_{j=1}^k(1+d_j)=2c_i di∏j=1k(1+dj)=2ci,枚举 gcd ( c 1 , c 2 , ⋯ , c k ) \gcd(c_1,c_2,\cdots,c_k) gcd(c1,c2,⋯,ck) 的约数作为 ∏ ( 1 + d j ) \prod (1+d_j) ∏(1+dj) 判断一下合不合法就行了
I:问题转化为问每一个三角形内部包含了多少点。预处理出每条线段下方有多少点即可,注意线段垂直的情况
A:略
*BCD:莫比乌斯反演优化 dp
看大题解
A:用线段树求每个数往左的最长下降序列长度及方案数,以及往右的最长上升序列长度及方案数。
B:暴力模拟,当然太暴力是不能过的。
**C:观察得出 S G ( x ) SG(x) SG(x) 等于 x x x 二进制下末尾 0 0 0 的个数。于是先求出 c n t [ i ] cnt[i] cnt[i] 表示 S G SG SG 值为 i i i 的 x x x 有多少个,然后像快速幂一样自己 FWT 自己,共 log \log log 次 FWT。
D:贪心。由于每次要求最大值的区间是往右滑窗的,所以可以用单调队列。
E:贪心。
t1:递推
*t2:化成 x m ≡ x ( m o d n ) x^m \equiv x~(\mod n) xm≡x (modn),每个质因子下暴力解,再把解数乘起来
*t3:解法一:LCT
解法二:用两个倍增数组,一个存链上最小值(忽略方向,启发式合并),一个存方向
*t1:NOI2015寿司晚宴(每个数最多含有 8 个小质因子和 1 个大质因子(以 n \sqrt n n 分大小),按大质因子分类,状压小质因子 dp)
t2:边双缩起来得到一棵树,把直径连起来
t3:保留初始 mst 的 O ( n ) O(n) O(n) 条边,以后每次 add 直接重建 mst
4703:物品做背包,钱袋子 meet in the middle,注意折成 20 + 10 20+10 20+10 复杂度最优
4829:蚂蚁问题,每次询问二分
*4847:若 x x x 到 y y y 的路上经过奇环,则一定可以,否则看路径长度的奇偶性。用广义圆方树
*4939:左端点从左往右移,线段树维护右端点。每次左端点右移就相当于结算一些段
看大题解
5001:状压 dp,设 f s f_s fs 表示 s s s 这个集合的字符串的 trie 大小,肯定先把这个集合的公共字母全部提取出来,然后枚举一个分割来转移
100003:树边从深度小的连向深度大的,返祖边从深度大的连向深度小的,最大费用循环流
^3083:换根是吓人的,实际上根据 i d id id 和 r o o t root root 的关系可以把询问拆成至多两个 dfs 序区间,用链剖+线段树维护区间最小值
*5016:每个询问 ( l 1 , r 1 , l 2 , r 2 ) (l_1,r_1,l_2,r_2) (l1,r1,l2,r2) 可以拆成 4 个前缀询问 ( r 1 , r 2 ) − ( l 1 − 1 , r 2 ) − ( l 2 − 1 , r 1 ) + ( l 1 − 1 , l 2 − 1 ) (r_1,r_2)-(l_1-1,r_2)-(l_2-1,r_1)+(l_1-1,l_2-1) (r1,r2)−(l1−1,r2)−(l2−1,r1)+(l1−1,l2−1),然后莫队
4810:莫队,加法和减法用 bitset 解决,乘法暴力枚举 x x x 的因数判断
*4811:链剖,线段树维护每个区间从左到右、从右到左、全 0 进入、全 1 进入得到的结果,询问按位贪心
*4939:莫队求每个区间的 bitset,需要一些技巧
看大题解
4940:bzoj3083+bzoj5016
t1:按价格排序,那肯定是买便宜的然后白嫖贵的,所以前面做背包,枚举最后一个买的之后后面的按质量贪心选
**t3:最优一定是从一个点出发左右扩展,且一个点往一边扩最多有 log \log log 段,因此有用的区间最多 O ( n log n ) O(n \log n) O(nlogn) 个,在这些上面做区间 dp
看大题解
*2978:“每个数包含奇数个哪些质数”可以看成 01 向量,做成线性基。区间太长时每个小质数都是基
看大题解
*2980:每个位置是一个向量 [ A i , B i , C i , 1 ] [A_i,B_i,C_i,1] [Ai,Bi,Ci,1],操作都是矩阵乘法,用线段树维护。
看大题解
A:略
B: O ( n 3 ) O(n^3) O(n3) 暴力 dp。
C:考场解法:扫描右端点,用线段树维护左端点的答案。其实就是要维护左端点到当前右端点之间,一共有多少个度数不为 0 0 0 的点。时间 O ( n log n ) O(n \log n) O(nlogn)。
O ( n ) O(n) O(n) 做法:求所有区间的连通块数和,转化成计算每个点的贡献。让一个连通块在它的 LCA 处被统计,那么就是说:一个点,它的父亲边被砍掉了,它的儿子边至少有一条。
AB:略
C:不管什么顺序都是 ∑ i = 1 n − 1 b i a i + 1 \sum_{i=1}^{n-1} b_ia_{i+1} ∑i=1n−1biai+1,再枚举一个区间乘 k k k
D:枚举右端点,线段树维护左端点答案
E:枚举 f f f 的值为 i i i,那就是求 ⌊ n i 2 ⌋ \lfloor \frac{n}{i^2} \rfloor ⌊i2n⌋ 以内有多少个数没有平方因子,容斥反演一套打下去
AB:略
C:维护一个 1 1 1 的并查集,每行再用一个并查集维护每个元素最右边的 0 0 0 在哪里
D:递推(设 f i , 0 / 1 f_{i,0/1} fi,0/1 表示到了第 i i i 个元素, a \sqrt a a 选了奇数个还是偶数个,的贡献),矩阵乘法加速
E:枚举一条边经过的一个点,然后得到其余每个点在什么斜率下会被覆盖
*F:大力分块
ABC:队友说是沙雕题
^D:一条边 ( x , y ) (x,y) (x,y) 的权值等价于 m a k e _ p a i r ( max ( x , y ) , min ( x , y ) ) make\_pair(\max(x,y),\min(x,y)) make_pair(max(x,y),min(x,y)),因此 MST 也是唯一的
E:Dijkstra 求出排列 [ 1 , 2 , ⋯ , 8 ] [1,2,\cdots,8] [1,2,⋯,8] 到其他排列的最短路,然后对于原序列,枚举一种置换,算答案
*F:构造 k = 1 k=1 k=1 的时候 ( 2 , 2 × 3 , 5 , 3 × 5 ) (2,2\times3,5,3\times 5) (2,2×3,5,3×5), k > 1 k>1 k>1 的时候把这个东西复制 k k k 份,然后修正,即每组的 2 × 3 2\times3 2×3 不能抢后面的 5 5 5、每组的 3 × 5 3\times5 3×5 不能抢后面的 2 2 2。
G:单调栈
H:每个格子的贡献取决于最后一次修剪
*I:prufer 序 dp,初始连通块缩起来当一个点考虑
看大题解
*J:询问所有的 2 × 2 2\times2 2×2、 2 × 3 2\times3 2×3、 3 × 2 3\times2 3×2 即可知道任意一对相邻格子是否相等
*K: k = 2 k=2 k=2 时,维护奇数位一棵 treap 和偶数位一棵 treap,操作一个区间相当于两棵 treap 互换子树; k = 3 k=3 k=3 时同理,维护 6 棵 treap 即可
L:只需最后两位是 4 的倍数即可。注意 corner case
M:插头 dp,一个格子有 4 种状态(石头、水、没水的甘蔗、有水的甘蔗)
ABC:略
D:PreFinals 2020 Day3 F 从小到大一段一段地合并,行就行,不行就不行
F:最后结论是,若存在一个串里面 1 的个数是奇数,则先手必胜,否则先手必败
G:dp,设 f i f_i fi 表示考虑了前 i i i 个数的最优答案。转移只需考虑最后一个 0 0 0 和最后一个 − 1 -1 −1
H:建主席树,表示每个点到根路径上的值域线段树,每次询问二分。强行卡常不可取
K:暴力(先 bfs 求出所有的 country,然后每个 country 边界点暴力往四周遍历,碰到别的 country 点就 break)复杂度是对的(隐约感觉,交了能过,还不会证
EIJ:
一吨 paper 题加一两个用脚造数据的题
F:队友说是沙雕题
A:考场解法:(队友搞的)令 a i = s i ⊕ s i + 1 a_i=s_i \oplus s_{i+1} ai=si⊕si+1,对 a a a 数组求 SA,然后再怎么排个序
题解解法:令 c i = min { j − i ∣ j > i , s i = s j } c_i=\min\{j-i~|~j>i,~s_i=s_j\} ci=min{j−i ∣ j>i, si=sj},对 c c c 数组求 SA 就是答案
*B:CF Round 614 Div1 D 评论区粉兔 先求出第一步往哪棵子树走,走过去之后,这棵子树就只有素数间隔那么多个元素了,建虚树找重心
D:KKT 条件
H:先假设容量为 1 1 1,不断 SPFA 单路增广求出从源点到汇点的第 i i i 个流量所需的费用。每次询问等比例放大,相当于每 u i u_i ui 个流量为一种费用,问前 v i v_i vi 个流量总共需要多少费用, O ( 1 ) O(1) O(1) 回答
*I:带花树,每个点拆成 d i d_i di 个点,每条边也多拆两个点出来,答案等于 最 大 匹 配 − 边 数 最大匹配-边数 最大匹配−边数
J:β 函数
CEG:
1001:显然每个节点要么选 l i l_i li,要么选 r i r_i ri
1002:假设 c ≤ a ≤ b ≤ d c \leq a \leq b \leq d c≤a≤b≤d,那么 a − c b − a \frac{a-c}{b-a} b−aa−c、 d − b b − a \frac{d-b}{b-a} b−ad−b 必须是整数,且两者二进制下的 1 1 1 恰好错开
1003:中序遍历,若根最小且左右 s i z e size size 不同,则谁 s i z e size size 小谁先走,否则谁含有标号最小的点谁就先走
*1004:设 f i , q f_{i,q} fi,q 表示第 i i i 个数,值选在 q ( [ l , r ] ) q([l,r]) q([l,r]) 这个区间时,每一种选法的方案数。区间数量总共是 O ( n ) O(n) O(n) 的
A:
B:方法一:点分
方法二:直接每个点找一个离它最远的点(在直径上)算答案即可
*C:区间 dp,先用完全背包算出 d x d_x dx 表示走 x x x 距离的最小花费,然后 dp 时一个区间的转移必然要转移到这个区间被划分开,因此有用的区间一定是一个段的前缀或后缀,因此有用的区间是 O ( n ) O(n) O(n) 的
D: h m = h_m= hm=最大的 2 k 2^k 2k 使得 2 k ∣ m 2^k|m 2k∣m。枚举 2 k 2^k 2k 算贡献,转化成求 [ 1 , n ] [1,n] [1,n] 每个数的约数个数和,分块+卡常