【长更】一句话题解(ICPC/CCPC及相关camp)

  原来的太长了,更新和使用都不方便,就分裂一下。又水一篇blog

  标 * 的为有价值的题,标 ^ 的为欺诈题,标 - 的为知识点待填坑,标 ? 的表示看别人是这样做的但是没懂为什么
  组队训练的题,如果是队友过的板刷题,题面又很长,就会标个“队友说是沙雕题”

2019 ICPC Asia / CCPC

2019ccpc网络赛

  1001 1007:略
  1002:建一棵值域线段树,维护区间最大值
  1003:建 SA,用主席树找第 k k k
  1004:用堆找第 k k k 小,更新堆时,对于一条路径,要么加入末端点连出去最短的边,要么把最后一条边变大
  1005: a a a b b b 互质的话就变成 ∑ i = 1 n ∑ j = 1 i ( i − j ) [ gcd ⁡ ( i , j ) = 1 ] \sum_{i=1}^n \sum_{j=1}^i (i-j)[\gcd(i,j)=1] i=1nj=1i(ij)[gcd(i,j)=1] 了,再化成 ∑ i ϕ ( i ) \sum i\phi(i) iϕ(i) 然后杜教筛
  1006:倒着做
  1008:按 t i t_i ti 从大到小排序,前面每煮一条鱼会剩下 t i m o d    k t_i \mod k timodk 的时间,存到堆里,到后面没鱼可煮了要钓一条煮一条的时候,就拿这个堆来优化
  1009:分层递推(设 f i , x , y , n o w f_{i,x,y,now} fi,x,y,now 表示当前到了第 i i i 层,黑点放了 x x x 个,白点放了 y y y 个,当前层共有 n o w now now 个点,的答案, i i i 这一维可以优化掉)

2019 ICPC 银川 网络赛

  当年他 tourist 用 4 小时 AK WF,我 *** 今天用 5 分钟 AK 网络赛,不是问题
  ABC:队友说是沙雕题
  D:第一问是 1 2 \frac 12 21,第二问递推一下
  *E:数据结构课练习题
  F:动态 Floyd
  G:暴力 dp 是 O ( n k ) O(nk) O(nk)
  H:按 局 数 A T K \frac{局数}{ATK} ATK 从小到大打
  K:
  *L:像析合树的预处理部分那样,扫描右端点,线段树维护左端点是否可行
    方法一:维护 区 间 最 大 值 − 区 间 最 小 值 − 不 同 的 数 的 个 数 区间最大值-区间最小值-不同的数的个数
    方法二:维护 区 间 长 度 − [ 有 多 少 个 x 满 足 x 和 x + 1 都 在 区 间 内 ] − 最 大 值 的 个 数 区间长度-[有多少个 x满足x和x+1都在区间内]-最大值的个数 [xxx+1]
    方法二的代码长度是方法一的两倍

2019 ICPC 南京 网络赛

  A:剥洋葱那样从外到里一圈一圈地确定给定坐标的权值,然后线段树维护一下
  *B:暴力递归,欧拉降幂,指数很快就 0 0 0 的了
  **C:解法一:打表,每 n \sqrt n n 打一次表,每组询问 O ( n n ) O(n \sqrt n) O(nn )
    解法二: 2 i j = 2 i 2 + j 2 − ( i − j ) 2 2^{ij}=\sqrt 2^{i^2+j^2-(i-j)^2} 2ij=2 i2+j2(ij)2,推式子 NTT
  D:求的是 E ( d 2 ) + E ( d ) 2 \frac{E(d^2)+E(d)}{2} 2E(d2)+E(d) E ( d ) E(d) E(d) E ( d 2 ) E(d^2) E(d2) 都是简单的拓扑递推
  E:莫比乌斯反演一套打下去,前面 ∑ i = 2 k x i \sum_{i=2}^k x^i i=2kxi 是等比数列求和,后面 μ ∗ i d 2 \mu * id^2 μid2 用杜教筛
  F:对于每个 i i i [ p o s i − k , p o s i + k ] [pos_i-k,pos_i+k] [posik,posi+k] 找最大的转移过来
  H:暴力 Floyd
  *I:按照 t i t_i ti 从大到小排序,假设前 k k k 个人机洗,那么随着 x x x 递减, k k k 是递增的,维护一个凸壳

2019 ICPC 徐州 网络赛

  CJM:略
  BEI:随便维护
  *A:斐波那契博弈
  D:SAM
  *F:通过容斥转化为求某个点子树内距离它不超过 x x x 的点的点权和,这是个二维数点
  G:回文树
  H:要求的是 ∑ i = 1 n f ( i ) \sum_{i=1}^n f(i) i=1nf(i) ∑ i = 1 n f ( i ) i \sum_{i=1}^n f(i)i i=1nf(i)i,考虑每个质数的贡献,前 O ( n ) O(\sqrt n) O(n ) 个质数暴力做,后面的质数用 min25
  K: O ( n 2 ) O(n^2) O(n2) 枚举对称中心, O ( n ) O(n) O(n) 计算答案
  L:状压 dp,求两点距离打个表观察一下有惊喜(

2019 ICPC 南昌 网络赛

  BG:略
  *A:方法一:每 100 个数取一次样,看下在不在给定的数组里,在的话就暴力判一下
    方法二:
  C:矩阵乘法优化递推
  *D:要求 [ k ] x : ∏ i = 1 n ( 1 + a s i x ) [k]x:\prod_{i=1}^n(1+a^{s_i}x) [k]x:i=1n(1+asix),分治模任意模数 FFT,敢写敢过
  E:约瑟夫,递推
  F:考虑 S S S 每个本质不同的子串的贡献,因此用 SAM 维护
  H:求个通项,然后大步小步预处理
  *I:设 b i = [ a i ≠ a i − 1 ] a i b_i=[a_i\not= a_{i-1}]a_i bi=[ai=ai1]ai,那么每次就是问一个矩形中( [ l , r ] [l,r] [l,r] [ x , y ] [x,y] [x,y])有多少个点,树套树或者 cdq

2019 ICPC 沈阳 网络赛

  FH:略
  BCD:队友说是沙雕题
  *E: n ≤ p n \leq p np 预处理, n > p n>p n>p 利用 Touchard 同余记忆化搜索
  G:大力推式子,发现是递推
  J: f i = ∑ j = 1 min ⁡ ( X , i ) ( i − 1 j − 1 ) ⋅ ( j − 1 ) ! ⋅ f i − j f_i=\sum_{j=1}^{\min(X,i)} \binom{i-1}{j-1}\cdot (j-1)! \cdot f_{i-j} fi=j=1min(X,i)(j1i1)(j1)!fij,移项就是 O ( n ) O(n) O(n) 递推,然后该递推的前 X X X 项都是 1 1 1(卡常)
  K:高斯消元解出 p p p 然后矩阵乘法递推

2019 ICPC 上海 网络赛

  BJL:略
  *A:方法一:线段树维护树的直径,修改时只用修改子树 dfs 序区间的两个端点,然后维护一下每个点到根的距离以便询问两点距离,共 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)
    方法二:动态点分
  C:每个 C C C 的贡献是有多少对 A , B A,B A,B 满足 A + B ≥ C ≥ ∣ A − B ∣ A+B \geq C \geq |A-B| A+BCAB,用 A A A B B B FFT 一下就好
  D:大于 1 1 1 的数不会很多,暴力搜索就好
  E:
  G:
  *H:每个元素维护从队尾乘到它是多少,路径压缩,bitset 加速矩阵乘法
  F:贪心逐位确定,用 dp 算方案数
  K:分别画半径为 a a a b b b 的圆,然后分别求圆上整点,然后 two pointers 找答案

2019ccpc 秦皇岛

  EI:队友说是沙雕题
  A:作为直角点时极角排序扫一遍,作为非直角点时离线枚举直角点,然后把其余点极角排序扫一遍
  D:判断 n n n 是否只含 2 2 2 5 5 5
  F:tarjan 求边双
  J:倒过来 kmp
  *L:二分,然后中间每个人按照到达左出口的距离从大到小排序,贪心往右出口塞

2019ccpc 哈尔滨

  F:略
  *A:解法一:二分,然后差分约束,判负环
  B: O ( 2 m m 2 ) O(2^mm^2) O(2mm2) dp(设 f i , j , k f_{i,j,k} fi,j,k 表示第 i i i 个数,与 r r r 的 lca 深度为 j j j,与 r + 1 r+1 r+1 的 lca 深度为 k k k,的贡献)
  E:根只有一个,直接算每个叶子要给根贡献多少次
  **H:首先只有开始和结束两个时刻是有用的。图可以看作是一棵树加 50 条边。全局按照 d i s x + c o s t x dis_x+cost_x disx+costx 进行 Dijkstra,每个点只会被松弛一次。每个点分中心维护距离队列,每个点在他点分树祖先以及 50 个关键点的队列里进行松弛。
  I:递推, h i > h i − 1 h_i>h_{i-1} hi>hi1 就乘 2 2 2 h i = h i − 1 h_i=h_{i-1} hi=hi1 就相当于插空
  J: n n n 为奇数则 3 + ( n − 3 ) 3+(n-3) 3+(n3),为偶数则 2 + ( n − 2 ) 2+(n-2) 2+(n2) 5 5 5 以内无解
  K: w i + k ⋅ w i s u m w_i+k\cdot\frac{w_i}{sum} wi+ksumwi
  L: O ( n 2 ) O(n^2) O(n2) 预处理所有可能的状态,然后 O ( n q ) O(nq) O(nq) 回答询问。

2019 ICPC Regional 南京

  A:取后一半
  *B:最后一定是在四个角落结束,且是沿着矩形的边界从一个角落走到另一个角落这样的,因此就是推个组合数式子
  D:DAG 计数
  H:最坏情况是 b + c b+c b+c 个假人一起演真人,因此真人至少要 b + c + 1 b+c+1 b+c+1 个,特判 1   0   0 1~0~0 1 0 0
  *I:暴力 dp,整数拆分压状态
  J:算出每个 b b b 匹配每个 c c c 的收益,跑 KM
  K:若给定点在三角形顶点上,则连到对边中点;否则按比例算一下连到对边去

2019 ICPC Regional 沈阳

  AH:略
  D:把 e min ⁡ { a i } e^{\min\{a_i\}} emin{ai} 提取出来
  -E:圆的反演
  G:区间 dp,设 f i , j f_{i,j} fi,j 表示 i i i j j j 这段点加上 ( i , j ) (i,j) (i,j) 这条边形成的多边形的划分数, i i i j j j 必然同时连向 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j1] 中的一个 k k k
  *J:每条边算出一个存活时间。按时间分治,每条边有 log ⁡ \log log 个小区间是完全存活的,用并查集维护当前连通情况,边在完全存活时加入并查集,退出时撤销,分治到底就询问
  -K:答案为 n − 1 n-1 n1 的整数拆分,五边形数
  L:贪心

2019 ICPC Regional 南昌

  L:略
  A:解法一:可持久化并查集
    解法二:按时间树 dfs,维护一个可撤销并查集,删点或者更换集合的时候不用真删,开一个数组用于记录每个点的实际指向即可
  *B:状压 dp,左边前 i i i 个点和右边后 n − i n-i ni 个点合起来形成一个状态
    看大题解
  C:枚举 i i i 最高位的 1 1 1 在哪,对于 n n n 1 1 1 的位,有 3 3 3 种选择,对于 n n n 0 0 0 的位,有 2 2 2 种选择
  *D:每个 d d d 单独做,设 f i , 0 / 1 f_{i,0/1} fi,0/1 表示以全 0 0 0 或者全 1 1 1 进入这棵子树所得到的答案,这可以 O ( n ) O(n) O(n) 递推
  E:队友说是沙雕题
  ^G:那个模数不是质数,最大的质因子为 2803 2803 2803,因此等价于 n < 2803 n<2803 n<2803
  *J:burnside+矩阵快速幂

2019 ICPC Regional 银川

  GILN:略
  A:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示前 i i i 张卡,选了 j j j 张,加成为 k k k,的最大获利。
  B:设 a x , y = − 1 a_{x,y}=-1 ax,y=1,找另一行另一列的一个点 ( x ′ , y ′ ) (x',y') (x,y),则 a x , y = a x ′ , y + a x , y ′ − a x ′ , y ′ a_{x,y}=a_{x',y}+a_{x,y'}-a_{x',y'} ax,y=ax,y+ax,yax,y
  *C:dp,枚举 i i i,每个点到 i i i 的极差可以用单调栈和树状数组维护出来,极差从左往右是下降的。考虑每次询问二分,然后发现有类似于决策单调的性质,就不用二分了。注意卡常!
  D:简单莫比乌斯反演(可能直接叫容斥比较好),注意欧拉降幂
  *E:按位考虑,考虑第 i i i 位和第 j j j 位,那么所有的 a a a 分为 4 类(00、01、10、11),其中 00 和 11、01 和 10 配对能产生 2 i + j 2^{i+j} 2i+j 的贡献,这个 O ( n ) O(n) O(n) 遍历一遍即可。
  F:队友说是沙雕题
  H:按有向边的拓扑序,对每个无向连通块跑最短路
  *J:老套路,如果最后在 1 1 1 结束则是环边计一次树边计两次,如果不在 1 1 1 结束则把树边边权取负跑最短路,类似于退流
  K:注意到左右矩阵的元素是一一对应的,就可以精细地写出 O ( n 2 ) O(n^2) O(n2) 的枚举

2019 EC Final

  A:队友说是沙雕题
  C:方法一:dp,设 d p i , j dp_{i,j} dpi,j 表示把 i i i 分配成 j j j 个元素的贡献。幸好厦门的 F 比你早出
    方法二(未验证): f = g k − 1 f=g^{k^{-1}} f=gk1
  E: 最 大 流 = 总 容 量 路 径 长 最大流=\frac{总容量}{路径长} =,每条路径都可以有若干个阶梯状的 ( x , y ) (x,y) (x,y) 表示增加一个单位的流量需要花费 x x x,最多 y y y 次。然后用堆取 ( x , y ) (x,y) (x,y) 取到最大流为止。
  G: 10 ! 10! 10! 枚举
  H:把所有的 a i + 2 a i \frac{a_{i+2}}{a_i} aiai+2 a i + 1 a i \frac{a_{i+1}}{a_i} aiai+1 统计出来,取出现最多的 12 个。若有长度 ≥ n 2 \geq \frac n2 2n 的等比子序列,则公比必在其中
  M:把每一类 a , a 2 , ⋯   , a k a,a^2,\cdots,a^k a,a2,,ak 抽出来暴力

其他 ICPC/CCPC

The 13th Chinese Northeast Collegiate Programming Contest (2019CNCPC)

  BCJ:略
  ^*D:数据结构诈胡大师:关键点只有 O ( m ) O(m) O(m) 个,建棵虚树跑暴力,时间 O ( m 2 ) O(m^2) O(m2)
  E:非叶子节点把它相关的所有边连向其中最小的那个
  *F:拆点,从出度为 0 的开始倒着拓扑求 S G SG SG,注意演员不能当作对面的人
  G:横纵坐标独立,聪明一点就取中位数,不聪明就三分
  H:noip2018 铺设道路

2010 ICPC Regional Dhaka

  ABC:略
  D:状态数很少,暴力
  E: O ( n 3 ) O(n^3) O(n3) 的 dp 能过(设 f i , j f_{i,j} fi,j 表示区间 [ i , j ] [i,j] [i,j] 的答案)
  F:可以先让某对对称位置不一样,然后把别的换完,最后换这对位置。要讨论一下
  G:合法的场数是连续的一段数,调和级数求和
  *H:方法一:短边所对应的顶点一定是距离最远的,直接三分套三分
    方法二:分别假定每个点是最远的,然后跑局部搜索(阉割的模拟退火),得到三个答案,可证取最小即为最后答案
  *J:最大点权独立集(网络流)+字典序最小方案(贪心让每个点归属于 S S S 集或 T T T 集)

2013 Southwestern Europe Regional Contest (SWERC 13)

  CEI:略
  A:给了 20s,直接 O ( n 4 ) O(n^4) O(n4) dp
  B:费用流 或 最小流 或 最大权匹配
  *D:套路题。暴力生成前几个串 A i A_i Ai,直到 ∣ A i ∣ ≥ ∣ S ∣ |A_i| \geq |S| AiS。然后先判断 A i A_i Ai 是否包含 S S S,再判断 A i L A i − 1 A_i L A_i^{-1} AiLAi1 之类的是否包含 S S S
  F:数位 dp
  G:暴力搜索
  H:dp f i f_i fi 表示 T T T 串从 i i i 开始往后的不同的方案数

2018 ICPC Regional Seoul

  BDF:略
  A:扫描线,扫描 y 轴枚举第一条线,用线段树查找覆盖最多的位置作为第二条线
  *C:先放 a n 2 a_{\frac n2} a2n,然后 a n 2 − 1 a_{\frac n2-1} a2n1,然后 a n 2 + 1 a_{\frac n2+1} a2n+1,然后 a n 2 − 2 a_{\frac n2-2} a2n2,然后 a n 2 + 2 a_{\frac n2+2} a2n+2……
  E:
  *I:计蒜之道2016复赛 青云的网络设计方案。基本思想就是,分层确定,最后讨论第二第三层怎么搞
    看大题解
  K:2-SAT
  L:算出每天需要新开多少个人,然后每天贪心地选人,优先选工作狂

2015 ICPC Regional 沈阳

  *B: i i i j j j 以 two pointers 的形式往前枚举(若 s j s_j sj s i s_i si 的子串则 j j j 往前走,否则 i i i 往前走)
  D:队友说是沙雕题
  F:把 a i a_i ai 变成 gcd ⁡ ( a i , m ) \gcd(a_i,m) gcd(ai,m),最多只有 m m m 的约数个不同的 a i a_i ai。在由 m m m 的约数构成的整除关系图上模拟容斥
  G:讨论三种情况:A 直接在 2-3 这条边上蹲 B;A 直接在 3-4 这条边上蹲 B;A 先摸了 2 然后去 3-4 这条边上蹲 B。注意 corner case 和精度
  ^H:大家一起走,每一条指令最多会产生 2000 次合并,记录偏移量,暴力并查集
  I:三维偏序,有两维在 1000 以内这个可以写得暴力一点
  K:首先发现它是个卷积,然后写个模任意质数 NTT
  M:每个集合新建一个方点,跑最短路

2015 ICPC Regional 上海

  F:略
  A:队友说是沙雕题
  B:用 2 2 2 的幂来构造, n n n 为偶数时先构造 n − 1 n-1 n1 再给 2 k − 1 2^{k-1} 2k1 1 1 1
  *D:把挡板建出笛卡尔树,然后分治
  E:记忆化搜索 f a , b , c , k f_{a,b,c,k} fa,b,c,k 表示枚举三位,第一位数字为 a a a,第二位数字为 b b b(乘号视为 10 10 10),第三位数字为 c c c,进行了 k k k 次交换,的贡献和
  K:预处理前后缀的答案,枚举换哪一位
  L:模拟往回走,路径是一条链来的

2014 ICPC Regional 西安

  A:队友说是沙雕题
  B:大模拟
  *C:二分,然后二元关系网络流
  E:平移可以看作是一个平行四边形加上端点的两个扇形;旋转就是一个大扇形
  F:推式子,是个容斥
  G:两个串拼起来建个回文树
  H:总共 O ( n 2 ) O(n^2) O(n2) 个游戏状态形成一幅 DAG,递推一下就好了
  I:建个 trie 乱搞
  K:相当于更相减损术中所有元素都会出现一次

2011 ICPC Regional 成都

  A:无脑递推(设 f i , j f_{i,j} fi,j 表示有 i i i 1 1 1、其他和为 j j j,是必胜还是必败)
  B:手掰是点数减一,刀切是 log ⁡ \log log
  D:状压 dp(设 f i , s f_{i,s} fi,s 表示到了第 i i i 个点,状态为 s s s 的最小代价,状态是三进制的)
  E:每一局 Alice 只有两种选择,是个 2-sat
  *H:考虑每条边的贡献,就是两棵子树的 size 的 min ⁡ \min min 的两倍
  I:大模拟
  *J:根据二阶差分可以算出腿数 ≤ k − 1 \leq k-1 k1 的动物,剩下的大讨论

2019 ICPC Regional Southern and Volga Russian (NERC)

  AH:略
  BCFLN:队友说是沙雕题
  E:对于两个点,若他们必须相同或相反,则连一条边,那么一个连通块只有两种染色方案
  G:枚举最后一次 Reset 在哪,前面的只要贪心让自己不爆牌就行了,后面的就找到最远的位置使自己恰好不爆牌,看对面爆不爆牌。后面的部分可以 two pointers
  J:二分
  *M:对于边长为 n n n 的矩阵,取掉左下的最大矩形、右上的最大矩形,还剩下的左上矩形和右下矩形是可以并行操作的,因此操作数大约是 f ( n ) = f ( n 2 ) + 4 f(n)=f(\frac n2)+4 f(n)=f(2n)+4

2019 ICPC Regional Jakarta

  ACGH:队友说是沙雕题
  B:dp,设 f i , j f_{i,j} fi,j 表示 i i i 这棵子树, i i i 状态为 j j j 的方案数,一个点有 3 种状态:作为终止端点、作为非终止端点、不是端点
  E:贪心然后调整
  F:枚举根,然后 hash
  J:dp,设 f i , j f_{i,j} fi,j 表示到了第 i i i 块石头,选了 j j j G 3 G_3 G3,所能达到的最少的奇数段数量是多少
  K:线段树维护矩阵
  L:网络流

2014 ICPC Regional 鞍山

  EI:队友说是沙雕题
  B: n n n 只有 5000 5000 5000,暴力
  *C:不合法的三元组是,有两对互质一对不互质,或者有一对互质两对不互质。对于每个数算出 ( 跟 它 互 质 的 数 × 跟 它 不 互 质 的 数 ) (跟它互质的数\times跟它不互质的数) (×),那么不合法的三元组每个被算了两次
  D:距离平方和最小是取平均数,用 n − k n-k nk 的滑窗算一遍
  G:每个 byte 只有两种取值(阈值以上和以下分别取 w w w 最大的),然后二元关系
  H:打表,暴力写得优美可以 10s 出解
  K:暴力旋转(枚举一条边,再枚举另一条边套上去)套 Burnside
  L:题意转化成:点集的子树并全体 +1、点集的祖先链并求和,线段树维护

2014 ICPC Regional 北京

  A:队友说是沙雕题
  B:搜索剪枝冲过去了
  C:x 轴 y 轴独立,解同余方程
  D:区间 dp(设 f i , j f_{i,j} fi,j 表示 [ i + 1 , j − 1 ] [i+1,j-1] [i+1,j1] 全部删掉的最小代价)
  E:总的减去不合法的,不合法的就枚举交点算一算
  *F: X 3 X^3 X3 转化成,枚举 i , j , k i,j,k i,j,k,问有多少种方案使得这三盏灯全亮。状压 dp
  **G:解法一:暴力找出前 1e8 个解,剪枝冲过去了???
    -解法二:DAG 轻重链剖分,在重链上二分跳出去的位置,每个询问两个 log ⁡ \log log
  H:折半搜索,FWT
  I:圆环交板子
  *J:dp,设 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1 表示考虑 i i i 的子树, i i i 这个点在它的子树里排第 j j j,它是否被选,的答案。
  K:如果一个数后面有比它小的,它就一定要操作一次

2019 ICPC Regional North-Western Russia

  A:队友说是沙雕题
  B:第 i i i 个数为 11 + 710 i 11+710i 11+710i
  *C:每个叉的左右两条竖线都加上,跑欧拉回路
  *E:以一个关键点为根,在其他关键点的深度为 d e e p i 2 \frac{deep_i}{2} 2deepi 的祖先处打标记,标记可以下传到他其他儿子上。最后 dfs 一遍看谁的标记数量是关键点减 1
  H:每种 t t t 只算一次,暴力复杂度是 O ( ∑ a ln ⁡ ∑ a log ⁡ n ) O(\sum a \ln \sum a \log n) O(alnalogn) 跑不满
  I:先求出一个矩形边框作为金字塔底边的必要条件,再取矩形的较长的边长作为金字塔底边长
  J:倒着逐位确定
  K:使 A 极大,然后每个字母默认是一行,某一行空了就沿用它上一行或下一行
  *L:SAM 上枚举每个结点作为 border,那么最小的 period 就是这个结点的出现位置集合的最小差分
  M: O ( n 2 ) O(n^2) O(n2) 写优美一点

2019 ICPC Regional Taipei-Hsinchu

  CDHJK:略
  A:暴力
  *B:树形 dp 疯狂讨论
  *E:考场解法: − i n f , − i n f , 0 , 0 , ⋯   , 0 , − 1 , a -inf,-inf,0,0,\cdots,0,-1,a inf,inf,0,0,,0,1,a,则 std 是 1997 ( a − 1 ) 1997(a-1) 1997(a1),他是 a a a,理想情况下 1996 ( a − 1 ) = k + 1 1996(a-1)=k+1 1996(a1)=k+1。若 1996 1996 1996 不整除 k + 1 k+1 k+1,则把 k + 1 k+1 k+1 变大,并且修改第一位。
    别人解法: − 1 , a 2 , a 3 , ⋯   , a 1999 -1,a_2,a_3,\cdots,a_{1999} 1,a2,a3,,a1999,其中 ∑ i = 2 1999 a i = k + 1999 \sum_{i=2}^{1999} a_i=k+1999 i=21999ai=k+1999,则 std 是 1999 ( k + 1998 ) 1999(k+1998) 1999(k+1998),他是 1998 ( k + 1999 ) 1998(k+1999) 1998(k+1999)妙啊
  I:暴力
  L:四边形的四个点一定都在凸包上,旋转卡壳
  *M:魔改的组合数取模,主要目标是修正组合数中 D D D 各质因子的数量,使其成为正常的组合数取模。

2019 ICPC Subregional Brazil

  ABDGHJM:队友说是沙雕题
  *E:找到♀最少(有多个时♂最多)的缸,称为♂缸,如果♂缸里有♂则需要再找一个♂最少的缸作为♀缸。剩下的每个缸有一个扔♂的代价和扔♀的代价,一个空缸可以减少一点扔♂的代价,于是 dp 确定最小值。注意一堆特殊情况!!
  F:
  I:
  *K:大力推式子(枚举开头所在列和结尾所在列),最后是个斐波那契数列求和
  L:出烂掉的广州一模题, a n s = 2 n 的 二 进 制 的 1 的 位 数 ans=2^{n的二进制的1的位数} ans=2n1

2019 ICPC Regional North American Southeast (Div 1)

  H:略
  A:暴力
  B:预处理每个询问是哪个数组的哪个版本,然后每个数组单独处理
  D:二分图最大独立集
  E:预处理 f i , j , k f_{i,j,k} fi,j,k 表示长度为 i i i 的序列、前 j j j 个位置不算 fixed point、共放了 k k k 个 fixed point 的方案数(全错排+组合数),然后贪心放
  F:
  G:树上 LIS,正常地用线段树做 LIS,每个点临走时把自己造成的影响还原回去
  I:字符串处理题,每个封闭的区域都需要破一道墙
  J:把每个数字的最后出现位置集合记为 s s s,那么就是在 [ 1 , s . b e g i n ( ) − 1 ] [1,s.begin()-1] [1,s.begin()1] 里选最小的,这样一直贪心下去

2019 ICPC Regional Northwestern European (NWERC 2019)

  FI:略
  AEG:队友说是沙雕题
  *B:贪心 check 每一个点,判断依据是会不会跟已选结点冲突、必需结点数量是否超过 k k k
    看大题解
  C:贪心,先放交点
  H:二分,转化成求最长的区间使得 h r − m i d ⋅ r ≥ h l − m i d ⋅ l h_r-mid \cdot r \ge h_l-mid \cdot l hrmidrhlmidl,区间必有一端点在整点上,枚举整点,预处理前后缀最值
  *J:从大到小枚举最大改变量,相当于每次有一个元素从自由符号变成固定符号,只需判断每相邻两个固定符号是否会贡献一个删除操作
  K:dp
  D:

2019 ICPC Regional Southwestern European (SWERC 2019-20)

  ABCFGI:队友说是沙雕题
  D:模拟
  H:打表找循环节(大概几亿),然后分段打表
  J:设当前处理 [ l , r ] [l,r] [l,r],把这个区间的最小值全部提取出来,贡献是个卡特兰数,剩下分成的区间递归处理
  K:边拆点无脑 dominator tree
  EL:

2019 ICPC Regional Latin American

  KLM:略
  EFGI:队友说是沙雕题
  A: 1 0 5 10^5 105 个点的 DAG 求最长反链,Dinic 跑最小链覆盖
  *H:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示先手 i i i 分,后手 j j j 分,先手手上握着 k k k 点,的获胜概率。发现存在循环转移:
    解决方法一:无视循环迭代 100 次
    解决方法二:对 f i , j , 0 f_{i,j,0} fi,j,0 进行二分,就会破掉这个环
  *J:从一个点出发肯定先到左右最大值较小的那个,然后再往对面跳一步,随便维护一下
  BCD:

2018 ICPC Regional Southwestern European (SWERC 2018)

  ADE:队友说是沙雕题
  B:二分,判断长度为 m i d mid mid 的连续段是否合法
  C:暴力
  F:枚举一个点,极角排序 two pointers
  *G:每个串如果是 APP 则可以直接得到 ascii 码的和,如果是 SUB 则递归求 ascii 码和,转化成前缀询问,每次只走一个方向
  H:三次最短路以后三维数点
  I:先把边框和噪音去掉,然后对每一个连通块做模式识别
  *J:先对前两个数、后两个数分别生成足够的后 n 3 \frac n3 3n 位相同的数对,然后暴力枚举两边的数对
  K:区间 dp

2018 ICPC NEERC Northern Eurasia Finals

  EG:略
  A:枚举比分情况,判断是否合法
  B:一般图最大匹配,带花树
  *C:每步暴力找重心
  F:若 n n n 为质数的幂则二进制分组;否则找两个互质的因子就可以解了
  **I:析合树计数 dp
    看大题解
  K: a n s = max ⁡ i : t i ≤ T { t i + d i + ∑ j : t i < t j ≤ T t j } ans=\max_{i:t_i \leq T}\{t_i+d_i+\sum_{j:t_ians=maxi:tiT{ti+di+j:ti<tjTtj},线段树随便维护一下
  L:贪心
  M:队友说是沙雕题
  DHJ:

2019 ICPC NERC Northern Eurasia Finals

  BEK:队友说是沙雕题
  A:带很多细节的贪心
  *F:考场解法:先把第二个序列补全到总长为 n + m − 1 n+m-1 n+m1,然后 prufer 还原,途中若第一个序列不够长则把第二个序列的补全位让给第一个序列
    正常解法:把第一个序列任意补全到长度为 n − 1 n-1 n1,把第二个序列任意补全到长度为 m − 1 m-1 m1,一定有解
  J:暴力枚举 s s s,复杂度是 O ( n ) O(n) O(n)
  *L:先贪心前 k k k 个一位一位地放
  CDGHI:

2017 ICPC Regional Latin American

  BCEH:略
  A:(队友做了不想看了)
  *D:用 set 维护连续段。势能分析,每次操作最多增加 2 个连续段,所以连续段的总量是 O ( n ) O(n) O(n)
  F:二维数点
  G:dp,设 f i , s , t f_{i,s,t} fi,s,t 表示以 i i i 为根的子树,原本应该是 s s s 但现在却是 t t t 的方案数
  I:MST 上找最大边
  J: n n n 的约数都 O ( n ) O(n) O(n) 判断一下
  *K:黑白染色,网络流,源点连向黑格子,黑格子连向白格子,白格子连向汇点,o 的位置流量为 1 1 1,其余位置流量为 2 2 2,这样一种流的方案就对应原图一种画法。
  *L:假设从左下走到右上,竖直距离大于水平距离,那么就是找一列宽度为 1 1 1 的来游走补回多出的竖直距离,其他情况同理,稍微推推式子
  M:把一个栈看成一个字符串,每次贪心找字典序最小的那个

ICPC Egyptian Collegiate Programming Contest (ECPC 2018)

  BFLM:队友说是沙雕题
  A:折半搜索
  *C:dp,设 f i , j f_{i,j} fi,j 表示 A A A 数组前 i i i 个位置匹配了 j j j 个,的最小代价。转移条件是转移点到 i i i 之间不能有正在匹配的数字。单调队列转移
  D:简单莫比乌斯反演
  E:dp,设 f i , j , k f_{i,j,k} fi,j,k 表示用了 i i i 个数、最后一段长度为 j j j、最后一个数相对大小为 k k k 的方案数。转移就考虑是新开一段还是接在最后一段末尾
  H:等价于 u u u 往外走 L − k L-k Lk 步能走到的最小边
  I:枚举直角点,极角排序+two pointers
  *J:GDKOI2015 青蛙跳环 x x x x + n 2 x+\frac n2 x+2n 的连边情况是一样的,把它们缩为一个点,去除重边,就成了欧拉回路
  K:分为 P P P 在左边、 P P P 在右边、 P P P 在中间被劈开分别计数
  G:

2019 多校

2019 Multi-University Training Contest 1

  *A:最小表示 dp(设 f i , j , k , l f_{i,j,k,l} fi,j,k,l 表示到了第 i i i 位,最小表示后第一个 2 2 2 在第 j j j 位,第一个 3 3 3 在第 k k k 位,第一个 4 4 4 在第 l l l 位的方案数)
  *B:每个点更新维护一个线性基,使得基元都是最新的
    看大题解
  D:逃生模型( f i = max ⁡ ( f i + 1 , d i s i v i ) f_i=\max(f_{i+1},\frac{dis_{i}}{v_i}) fi=max(fi+1,vidisi)
  E:最短路图最小割
  I:贪心
  *K:枚举三次根,然后正常 g c d gcd gcd 反演套路
  **L:三种前缀和分别对应三次组合数卷积
    看大题解
  *M:判断 1 1 1 的凸包和 − 1 -1 1 的凸包是否有交

2019 Multi-University Training Contest 2

  hdu多校怎么出成介个亚子啊
  B:合唱队形,字典序方案符合贪心性质
  E:考虑每一对的贡献,因此是 ∑ i = 1 n C i 2 × 1 2 × [ ∑ j = 0 ∞ ( 1 4 ) j ] n = ∑ i = 1 n i ( i − 1 ) 3 n \frac{\sum_{i=1}^n C_i^2 \times \frac12 \times [\sum_{j=0}^{\infty} (\frac14)^j]}{n}=\frac{\sum_{i=1}^n i(i-1)}{3n} ni=1nCi2×21×[j=0(41)j]=3ni=1ni(i1)
  *F:每两点都会产生贡献,因此用 FWT 算 c n t i cnt_i cnti 表示有多少个点的 x ⊕ y ⊕ z = i x \oplus y \oplus z=i xyz=i
  -G:超现实数不平等博弈,详见 WC2018 杜老师课件
  H:二元关系
  I:回文树瞎搞
  J:每个二进制位都问一下,所以是 n ! n! n!
  K:每个区间找最大的 50 个左右暴力判断
  L:枚举右端点,线段树维护左端点是否可行,那么是区间 ± 1 \pm1 ±1 的操作

2019 Multi-University Training Contest 3

  B:dominator tree,写 DAG 版就好了
  D:二分,然后 dp 判断
  *E:式子最后化出来,前面是质数幂和(洲阁筛或 min25),后面是 i 2 ϕ ( i ) i^2\phi(i) i2ϕ(i)(杜教筛或 min25)
    看大题解
  F:素数分布很密集的, n n n 往前暴力找,Miller_Rabin 判一下,求阶乘用 Willson 定理
  G:线段树二分
  H:前缀异或和,询问区间有多少对数是不同的,带修莫队
  I:暴力连边费用流卡常加乱水
  K:dp,换根

2019 Multi-University Training Contest 4

  A: n = 2 k − 1 n=2^k-1 n=2k1 时答案为 1 1 1,否则答案为 0 0 0
  C:分奇偶大讨论
  F:吃树和休息的贡献是独立的,贪心吃树的贡献,dp(斜率优化)休息的贡献
  *G:用逆序对来判断华容道是否有解,有解必有 120 步以内的解
  H:二分+主席树
  **I: a n s ans ans 初值为 ∑ a i \sum a_i ai,每次默认加上 ∑ b i \sum b_i bi,预处理 − p i -p_i pi 标记。用一个巧妙的分块优化
    看大题解
  J:先把 100 以内的质数判掉,那么剩下的质数指数都 < 10 <10 <10,最小指数 c n t cnt cnt 满足 ( ⌊ n c n t ⌋ ) c n t = n (\lfloor \sqrt[cnt] n \rfloor)^{cnt}=n (cntn )cnt=n

2019 Multi-University Training Contest 5

  *A:化成 p x ≤ b k ≤ p x − 1 \frac px \leq \frac bk \leq \frac p{x-1} xpkbx1p,套法雷序列
  B:两个数组放一起建棵 trie,然后 n n n 次贪心
  *C:分别设 S S S T T T 划分线段比例为 x x x y y y,根据面积相等列出两个等式,大讨论解方程
  D: n n n 个关键点把函数划分成 n + 1 n+1 n+1 段,每段分别求解
  E:打个表观察一下就知道如何 next_permutation 了
  F:扩展 kmp
  G: [ x , y ] [x,y] [x,y] 外面的走法是唯一的,因此问题化成 1 1 1 走到 y − x + 1 y-x+1 yx+1,递推一下
  H:枚举对称轴暴力判,会有恶心的情况

2019 Multi-University Training Contest 6

  *A:最大获利,贪心模拟网络流,合并用长链剖分
    看大题解
  B:随机下 LIS 长度只有 O ( n ) O(\sqrt n) O(n ),按这个分层来跑 LIS 的 dp
  D:队友说是沙雕题
  E:枚举上下边界,线段树维护区间最大值
  F:划分成 n 2 n^2 n2 个小区域,每个区域分别算答案
  H: gcd ⁡ ( f ( n , m ) − n , n ) = 1 \gcd(f(n,m)-n,n)=1 gcd(f(n,m)n,n)=1,因此 f ( n , m ) − n f(n,m)-n f(n,m)n 非常小,大概前 160 个质数那么大
  -I:杨氏图表
  *J:枚举根,dfs 序 dp,有用的 m m m 只有 O ( m ) O(\sqrt m) O(m )
  *K:解法一:有用的问号不会太多,大概最后几十个,所以逐位确定就好了
    解法二:倍增式的逐位确定,详见题解
  L:贪心取叶子中的最大值,可证最优

2019 Multi-University Training Contest 7

  A:队友说是沙雕题
  *B:选 1 作根,对于每个点 i i i,它的儿子根据子树的形态(用 hash 来判)分为若干个类,那么这个点的贡献 a n s i = ( 儿 子 数 量 ) ! ∏ ( 每 个 类 的 个 数 ) ! ans_i=\frac{(儿子数量)!}{\prod (每个类的个数)!} ansi=()!()!,这棵树的答案为 ∏ a n s i \prod ans_i ansi,然后换根
  *F:让复习最少的 n − k + 1 n-k+1 nk+1 题时间和大于 m m m,即前 n − k + 1 n-k+1 nk+1 题不能全被卡,那么至少能做 k k k
  G:本质上是每次带权二分,用 dp 实现,设 f i f_i fi 表示区间长度为 i i i 时的答案,由于 f i f_i fi 单调递增,因此决策点也是单调的,可以 O ( n ) O(n) O(n)
  *H:四个象限都可以归约为第一象限,然后 a = min ⁡ ( a , 2 b ) a=\min(a,2b) a=min(a,2b) b = min ⁡ ( a , b ) b=\min(a,b) b=min(a,b),那么所有情况都可以归约为先 右左右左…… 地蛇形扭,再直走
  J:按 a i − b i a_i-b_i aibi 排序(这是先手的收益),先手和后手分别从两端开始取,注意判断 a i = 0 a_i=0 ai=0 b i = 0 b_i=0 bi=0 的情况
  ^k:设 f i f_i fi 表示从 i i i 走到 i + 1 i+1 i+1 的期望花费

2019 Multi-University Training Contest 9

  *A:一顿乱推得到 g m ( n ) g_m(n) gm(n) 是两个调和级数相加(再加一些杂项),那么每 n \sqrt n n 打一次表,要用的时候再 O ( n ) O(\sqrt n) O(n ) 去递推
  B: a n s = 1 + ans=1+ ans=1+交点数
  C:先折半搜索得到两个集合,然后对于每一位单独统计,枚举这一位是 x + y + ( x+y+( x+y+(是否进位 ) = 4 )=4 )=4(或 14 14 14),然后提取出这一位是 x x x y y y 的数,双指针扫一遍统计符合进位规定的数对
  E:开头一段 y 是不动的,然后看这段 y 后面是不是跟一个 z,如果是就会翻成 b,否则不动
  F:枚举 10、20、50 分别用多少
  *G:一条边分成两棵树,总共得到 n − 1 n-1 n1 个直径对,双指针扫一遍统计贡献
  H: n n n 次贪心,每次取异或和最大的一对
  *K:设 g i g_i gi 表示 i i i 个叶子的线段树的 叶子深度乘叶子 id 的和, G i G_i Gi 表示 g i g_i gi 的前缀和,当然还要有一些辅助函数。记忆化搜索,每次只会到 ⌊ n 2 ⌋ \lfloor \frac n2 \rfloor 2n ⌊ n 2 ⌋ ± 1 \lfloor \frac n2 \rfloor \pm1 2n±1 两个数,再往下走会交的,因此总量是 O ( log ⁡ 2 n ) O(\log^2 n) O(log2n)
    看大题解

2019 Multi-University Training Contest 10

  C:从大到小排序,答案一定是一个前缀
  E:按 x x x 从小到大排序,枚举最后一个选 x x x 的,那么它后面的全选 y y y,前面的用 set 维护与当前 x x x 最接近的 x x x,其余选 y y y
  H: a i ≥ b i a_i \geq b_i aibi 的可拆成独立的两个物品,这些散装的肯定是从大到小排序取前缀; a i < b i a_iai<bi 的最多只有一个人是只选 a a a 的,因此枚举 a i < b i a_iai<bi 的这些里面选了多少个 a i + b i a_i+b_i ai+bi 就行了,这个有单调性
  I:模拟
  *K:解法一:枚举长度 l e n len len,会激活 a i ≤ l e n a_i \leq len ailen 的点,然后对于每个被激活的区间算它的贡献(即假设这个区间就是这么长了,然后计算每个点作为左端点时的贡献)。然后再处理那些以它为左端点长度为 l e n len len 时会遇到重复值的点
    解法二:分治,每次考虑跨过中线的区间,枚举左边的端点快速计算右边有多少个端点,枚举右边的端点快速计算左边有多少个端点

CCPC Wannafly Camp 2020

Day1 - Rikka Contest

  BF:队友说是沙雕题
  A:按 l i + r i 2 \frac{l_i+r_i}{2} 2li+ri 从小到大放
  C:每种颜色平均分是最优的,答案等于总边数减去每种颜色的团。式子写出来可以分块
  **D:带 x x x 的基尔霍夫矩阵,求导
    看大题解
  *E:dp旋根。若根把一条链分成 a a a b b b 两部分,那么往 a a a 处移动产生的贡献是 ( a − 1 ) ( b + 1 ) − a b = a − b − 1 (a-1)(b+1)-ab=a-b-1 (a1)(b+1)ab=ab1,因此记录每个子树的一直到根的链数及链长和即可
  *G:去掉被包含的圆,两两求公切线,得到所有切点,做凸包,对于凸包上的每条线段,若它被一个圆完全覆盖,则它的贡献是一段圆弧,否则是它本身
  H: k k k 乘上 ⌊ n k ⌋ \lfloor \frac nk \rfloor kn 以内的质数,高精度
  *I:分块,每个块维护一个值域前缀和(用树状数组),查询时二分。
  J:大模拟,卡常

Day2 - Legilimens Contest

  A:略
  B:每个 m i m_i mi 拆成 log ⁡ \log log 个小区间(这个区间表示 x i x_i xi 的后若干位是任选的),分组背包, k k k 只决定有无解,有解的话每一位的解的数量由覆盖该位的 x x x 的数量决定。
  C:每个前缀假设异或和为 s s s,其最高位是第 w w w 位,那么第 w w w 位为 1 1 1 a i a_i ai 有唯一操作方法。
  *D:mex 实际上是最大 LCP 加 1,而最大 LCP 随着字符的插入是递增的,因此建 SAM 时每次分裂出来的结点的 m a x l e n maxlen maxlen 就可以更新答案。注意特判 mex=0
  E:启发式合并
  *F:维护子树的 x x x 的和,询问时每个点枚举往父亲的边和往链剖重儿子的边,轻儿子的答案在修改时维护
  H:实质上是个欧拉回路
  I:黑白染色,则实际上是求最小顶标和,等于最大权匹配
  J:如图
【长更】一句话题解(ICPC/CCPC及相关camp)_第1张图片
  *K:dp,设 f i f_i fi 表示前 i i i 个字符的答案,找合法后缀可以 AC 自动机(fail 链最长为 n \sqrt n n ),也可以把模板串按大于或小于 n \sqrt n n 分类然后 hash。

Day 6

  CLM:略
  *A:2019 南京网络赛 C
  *D:分成了 O ( n ) O(n) O(n) 个段,dp,设 f i , j f_{i,j} fi,j 表示前 i i i 个段放了 j j j 个数的方案数
  F:正难则反,总数减去异色三角形
  G:贪心,第 i i i 轮记当前最左边的空位为 w w w,先倒序把 f f f i i i 的位置全部放数字,然后如果 w w w 还空着就放它
  H:先转化成前缀询问。考虑 [ 0 , 2 30 ) [0,2^{30}) [0,230) 有多少数字异或 x x x 之后落在 [ 0 , r ] [0,r] [0,r] 内,会发现实际上是有 log ⁡ \log log 个区间
  I:dp,设 f i , j f_{i,j} fi,j 表示前 i i i 个数用了 j j j 次操作的最大和。转移就是枚举一个后缀,然后这个后缀全部变成最大值。
  J:整数拆分枚举环长,判断是否合法,合法就算方案数
  K:大数放中间,小数放两边
  ^N:两两乘起来

Day 7

  H:略
  A:正难则反,算不得分的数对
  G:该矩阵一定存在哈密顿回路,因此 k ≥ n m k \geq nm knm 时一定可以遍历完整个地图, k < 12 k<12 k<12 时暴力
  J:相邻两项之间会对 j j j 产生一个上界和下界的限制。于是枚举开头,二分最远的结尾

你可能感兴趣的:(【长更】一句话题解(ICPC/CCPC及相关camp))