7.5
QZEZTEST2021.7.5
A 竞赛 (HDU 1052) | 思维+贪心
B Miku的要求 | 双层BFS
C Alien 的粉刷 (P4170 [CQOI2007]涂色) | 区间DP
D 糖果峡谷 | 贪心+线段树维护(区间加操作+区间最值查询)
POJ 1094 Sorting It All Out | 正解 Floyd传递闭包+离线二分 | 我 Floyd思想+在线玄学check
7.6
qzezoj 树的重心 | 一次dfs
POJ 2631 Roads in the North | 树的直径 一次或两次DFS
P3629 [APIO2010] 巡逻 | 两次树的直径 中间按贡献刷新边权
P2491 [SDOI2011]消防(P1099 [NOIP2007 提高组] 树网的核 强化版) | 2次DFS求树的直径的长度和路径 直径上尺取求最小偏心距
7.7
P1318 积水面积 | 简单遍历
P1379 八数码难题 | 双向BFS
qzezoj 1887 狐狸的谜语 | 正解 迭代加深搜索 | 我 两层DP
衢州===>义乌
7.8
义乌集训开始了,lxl来给我们出题+上课!
TEST1
A 单纯膜你
B
操作:将序列中的所有 x {x} x 变为 y {y} y
查询:值相等的点对的最小距离
正解 前驱标记+启发式合并 (这是什么?) | 我 前驱标记 把前驱标记当链表合并(貌似也过了,常数小)
C
一串01串,求字典序最小的未出现过的01串
DP f [ x ] = f [ x ] ∣ f [ 2 x ] ∣ f [ 2 x + 1 ] {f[x]=f[x]|f[2x]|f[2x+1]} f[x]=f[x]∣f[2x]∣f[2x+1]
D
分治 乱搞 还没A
7.9
TEST2
A
给定正整数 n , m {n,m} n,m, x m < = n {x^m<=n} xm<=n,求整数 x {x} x 的最大值
二分+快速幂 | fxtdalao 用pow()就A了!
B
染色,使距离 ( i − j ) {( i - j )} (i−j)为质数的两点的值不同,求最小颜色数和其对应的任一种染色方案
这是一道结论题, n > = 8 {n>=8} n>=8时, a n s {ans} ans恒为 4 {4} 4,所以答案只要四个一循环就行,如12341234…
C
给出两个字符串,分别长 n {n} n 和 m {m} m ,要删除或插入一个字符最少多少次,若最少次数大于 k {k} k ,输出 − 1 {-1} −1
DP,若无 n {n} n, m {m} m限制, f [ i ] [ j ] = m i n ( f [ i − 1 ] [ j − 1 ] ( s 1 [ i ] = = s 2 [ j ] ) , f [ i − 1 ] [ j ] + 1 , f [ i ] [ j − 1 ] + 1 ) {f[i][j]=min(f[i-1][j-1](s1[i]==s2[j]),f[i-1][j]+1,f[i][j-1]+1)} f[i][j]=min(f[i−1][j−1](s1[i]==s2[j]),f[i−1][j]+1,f[i][j−1]+1)
由于 1 < = n , m < = 5 e 5 & & k < = 100 {1<=n,m<=5e5\ \&\&\ k<=100} 1<=n,m<=5e5 && k<=100,考虑 O ( n k ) {O(nk)} O(nk)的DP。 ∣ i − j ∣ > k {|i-j|>k} ∣i−j∣>k的情况可以直接舍去,因为即使是最理想的情况 f [ i ] [ j ] {f[i][j]} f[i][j]都大于 k {k} k了。于是有 m i n ( n , m ) ∗ 2 k {min(n,m)*2k} min(n,m)∗2k的DP数组,第二维改改就行了。
D
给出一棵树,每次查询,链 l {l} l 到 r {r} r 上有多少个点 i {i} i,满足 i {i} i 的编号 = l {l} l 到 i {i} i 的距离
1 < = n , m < = 3 e 5 {1<=n,m<=3e5} 1<=n,m<=3e5
由于是在树上的链上,我们先给 i {i} i 分个类,以 l c a ( l , r ) {lca(l,r)} lca(l,r) 为界
若 i {i} i 在 l {l} l 侧,有 i = d e p [ l ] − d e p [ i ] {i=dep[l]-dep[i]} i=dep[l]−dep[i],即 d e p [ l ] = i + d e p [ i ] {dep[l]=i+dep[i]} dep[l]=i+dep[i]
若 i {i} i 在 r 侧,有 i = d e p [ l ] − 2 ∗ d e p [ l c a ( l , r ) ] + d e p [ i ] {i=dep[l]-2*dep[lca(l,r)]+dep[i]} i=dep[l]−2∗dep[lca(l,r)]+dep[i],即 d e p [ l ] − 2 ∗ d e p [ l c a ( l , r ) ] = i − d e p [ i ] {dep[l]-2*dep[lca(l,r)]=i-dep[i]} dep[l]−2∗dep[lca(l,r)]=i−dep[i]
分类后 a n s = s u m ( l c a ( l , r ) − > r ) + s u m ( l c a ( l , r ) − > l ) {ans=sum(lca(l,r)->r)+sum(lca(l,r)->l)} ans=sum(lca(l,r)−>r)+sum(lca(l,r)−>l)
要求的是点权的出现次数,可以差分,差分后, a n s = ( s u m ( 1 − > r ) − s u m ( 1 − > l c a ( l , r ) ) ) + ( s u m ( 1 − > l ) − s u m ( 1 − > l c a ( l , r ) ) ) {ans=(sum(1->r)-sum(1->lca(l,r)))+(sum(1->l)-sum(1->lca(l,r)))} ans=(sum(1−>r)−sum(1−>lca(l,r)))+(sum(1−>l)−sum(1−>lca(l,r)))
问题转化为 查询在从根出发到某点的链中某个点权出现的次数
查询可以离线,就可以标记我要查哪些点,在哪些点上查哪些点权,然后开个桶,一遍DFS,记录所有点权在链上出现的次数,在有查询的点上记录答案就行了
7.10
TEST3
A
循环模拟,要注意记录的信息要可以向后延伸
B
有 t {t} t 次询问,每次给你一个数 n {n} n ,求在 [ 1 , n ] {[1,n]} [1,n] 内约数个数最多的数的约数个数
易证,一个数的约数个数 等于 其每个质因子的指数+1的乘积
易证,将在 [ 1 , n ] {[1,n]} [1,n]内约数个数最多的数的质因子从升序排列,其质因子的指数不升(这个结论打表也能打出来)
易证,数据范围内的约数个数最多的数的最大质因子小于等于47
所以正解就是一个加优化的搜索
为了进一步减少递归层数,可以从大质数开始递归,层数增加,指数不变或增加,省掉指数无用时的计算 | zj dalao 打表拿到最速!
C
后继标记+倍增
写的时候没调出来,明明昨天还在写LCA
D
给定一棵 n {n} n个节点的树,第 i {i} i个点的编号为 i {i} i,第 j {j} j条边的编号为 j {j} j。 有 m {m} m次查询,每次给出 l , r {l,r} l,r,查询如果只保留树上点编号在 [ l , r ] {[l,r]} [l,r]内的点,边编号在 [ l , r ] {[l,r]} [l,r]内的边,有多少点连通块, 此时点 a {a} a与 b {b} b连通等价于 l ≤ a , b ≤ r {l\le a,b\le r} l≤a,b≤r且 a , b {a,b} a,b在树上的简单路径中所有点与边编号都在 [ l , r ] {[l,r]} [l,r]之间。
1 < = n , m < = 1 e 6 {1<=n,m<=1e6} 1<=n,m<=1e6
看起来很复杂,但难点就是把给出的信息用有用的信息转化
1.如何判断是否保留某条边?点的编号为 i {i} i和 j {j} j,边的编号为 k {k} k
答:须满足 l ≤ min ( i , j , k ) ≤ max ( i , j , k ) ≤ r {l\le\min(i,j,k)\le\max(i,j,k)\le r} l≤min(i,j,k)≤max(i,j,k)≤r.
2.如何计算连通块数量?
答:连通块数量=区间内点数-保留的边数
由判断边保留的条件和要求查询保留的边数,可以看出,
这就是一个二维空间里的计数问题,是二维偏序问题,
用树状数组就能解决
(调一晚上才发现树状数组打挂了…)
7.11
今天lxl就要离开了,我拿到了合照!
TEST4 (因为记起来不方便,就开始自己给题目起名了)
A 青蛙叫
二分
要自己推 r {r} r的初始值,如果不够小会爆 long long(我wa了一个点)
B 脚本(坦克)世界
数学题
最坑的是数据范围
t ≤ 1 0 6 , 0 ≤ n , m ≤ 1 0 18 , 1 ≤ a , b ≤ 1 0 18 {t\le 10^6,0\le n,m\le 10^{18},1\le a,b\le10^{18}} t≤106,0≤n,m≤1018,1≤a,b≤1018
n {n} n和 m {m} m可以等于0!
最后一个数据点40分,倒数第二个构造数据被卡了,lxl还说那个点卡不到人,原来我不是人。
C 眼镜图形
tarjan缩点+树形DP
DP状态转移方程我是推出来了,
但我已经忘了缩点咋做了,之前从来没打过
所以今天还打了个tarjan缩点的模板
P3387 【模板】缩点 | 这里面还加了 在拓扑序上DP的操作
D 子区间 极差的乘积 的和
???
我还不会
7.12
这几天是施韩原来出题和讲课,感觉他声音很低沉,很平淡,但有意思,比较在意我们究竟听懂没
TEST5 爆0了
T1 平方
数学+简单分类讨论+欧拉筛+快速幂
T2 翻转
有一个 n×m 的棋盘。初始每个格子都是好的,之后每一秒会坏一个之前没坏的格子。nm 秒过后所有格子都会坏完。我们想知道,每一秒过后,有多少子矩形满足其中的所有格子都是好的。
考的时候感觉不可做,实际离线在线都能做
离线: O ( n 2 ) {O(n^2)} O(n2)枚举子矩形的上下界,记录上界到下界里每个j坐标位置加入顺序的最小值,因为要让当前子矩形合法,只能在最早变坏的格子变坏前。从左到右O(m)记录每个点加入时最左边的坏点位置,右边同理。对于每一个位置j, ( j − L [ j ] ) ∗ ( R [ j ] − j ) {(j-L[j])*(R[j]-j)} (j−L[j])∗(R[j]−j) 即为当前上下界,加入某个坏格子减少的好格子数。
T3 冲锋
假设当前位置为 (x,y),
向南走一步( x 加1)的代价为 2 x y 2 + 2 y 2 + x 2 {2xy^2+2y^2+x^2} 2xy2+2y2+x2;
向北走一步( x 减1)的代价为 − 2 x y 2 + 2 y 2 + x 2 {-2xy^2+2y^2+x^2} −2xy2+2y2+x2;
向东走一步( y 加1)的代价为 2 x 2 y + 2 x 2 + y 2 {2x^2 y+2x^2+y^2} 2x2y+2x2+y2;
向西走一步( y 减1)的代价为 − 2 x 2 y + 2 x 2 + y 2 { -2x^2 y+2x^2+y^2} −2x2y+2x2+y2;
请问从 (x_1,y_1 ) 走到 (x_2,y_2 ) 的最小代价是多少?
奇怪的代价,根据暴力输出路径,可以发现移动规律,
这之后要求O(1),分类讨论,数学题,式子推不出来,直接劝退
T4 蛋糕
在蛋糕里切巧克力。。。
先离散化(废话)
然后把三维问题转化为带修改的二维问题(妙啊)
若除去当前x平面切过的长方体,剩余长方体在x平面上的投影的四角的并的补(即为剩余所有长方形的交)为空,换下一个x平面,否则输出x,y,z
问题就是怎么判断那一大串为空,以及如何维护那一大串
对于每个y,维护…(正在尝试读懂四百多行的标程)
7.13
Day 6
A 吃
送分题
两遍 sort 搞定
B 子序列
给定串 s ,问其中有多少 namomo 子序列。 定义一个子序列 t 是 namomo 子序列,当且仅当
分治思想+DP
以 t[3] 为分界,右边DP,左边组合、容斥一下,两边乘积的和就是答案
DP我推了三个状态转移方程出来,对是对了,就是MLE了,写在下面
d p 1 [ i ] [ j ] = d p 1 [ i + 1 ] [ j ] + [ a [ i ] = = j ] dp1[i][j]=dp1[i+1][j]+[a[i]==j] dp1[i][j]=dp1[i+1][j]+[a[i]==j]
d p 2 [ i ] [ j ] = d p 2 [ p r e [ a [ i ] ] ] [ j ] + ( d p 1 [ i ] [ j ] − d p 1 [ p r e [ a [ i ] ] ] [ j ] ) ∗ d p 1 [ p r e [ a [ i ] ] ] [ a [ i ] ] dp2[i][j]=dp2[pre[a[i]]][j]+(dp1[i][j]-dp1[pre[a[i]]][j])*dp1[pre[a[i]]][a[i]] dp2[i][j]=dp2[pre[a[i]]][j]+(dp1[i][j]−dp1[pre[a[i]]][j])∗dp1[pre[a[i]]][a[i]]
d p 3 [ i ] [ j ] = d p 3 [ p r e [ a [ i ] ] ] [ j ] + ( d p 1 [ i ] [ j ] − d p 1 [ p r e [ a [ i ] ] ] [ j ] ) ∗ d p 2 [ p r e [ j ] ] [ a [ i ] ] dp3[i][j]=dp3[pre[a[i]]][j]+(dp1[i][j]-dp1[pre[a[i]]][j])*dp2[pre[j]][a[i]] dp3[i][j]=dp3[pre[a[i]]][j]+(dp1[i][j]−dp1[pre[a[i]]][j])∗dp2[pre[j]][a[i]]
集训结束之后什么时候想练一下卡空间再调吧
C 树
给定一棵大小为 n 的有根树。每个节点有个非负权值,对于每个节点 x,我们找到包含 x 的节点的平均值最大的连通块,定义 f(x) 为这个平均值。请求出 min f ( i ) │ i ∈ 1 , 2 , … , n \min{f(i)│i∈{1,2,…,n}} minf(i)│i∈1,2,…,n
二分+换根DP
二分出平均值,在树上相当于把每个点的点权都减mid
然后换根DP,式子如下:
d p [ u ] = ∑ v ∈ V max ( d p [ v ] , 0 ) dp[u]=\sum\limits_{v\in V}\max(dp[v],0) dp[u]=v∈V∑max(dp[v],0)
d p [ u ] = d p [ u ] + d p [ f a ] − max ( d p [ u ] , 0 ) dp[u]=dp[u]+dp[fa]-\max(dp[u],0) dp[u]=dp[u]+dp[fa]−max(dp[u],0)
D 序列
给定序列 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1,a2,…,an和 m m m 组询问。
对于每组询问,给定区间 [ l , r ] ( 1 ≤ l ≤ r ≤ n ) [l,r](1≤l≤r≤n) [l,r](1≤l≤r≤n) ,请问有多少子区间 [ i , j ] [i,j] [i,j] 满足 l ≤ i ≤ j ≤ r l≤i≤j≤r l≤i≤j≤r 并且子序列 a i , … , a j a_i,…,a_j ai,…,aj 中不同的整数的数目是奇数
还做不来
7.14
Day 7
200pts A了A和B
A 数学
给定整数 n,将 1 - n 分成两组,每一组至少有一个数,并且使得两组数字的和的最大公约数最大,请输出最大的最大公约数。
从区间[1,n]中可以选出从0到n(n-1)/2的所有数,设两组数的和分别为a,b
有 a + b = n ( n − 1 ) / 2 , a = x g c d ( a , b ) , b = y g c d ( a , b ) , ( x , y > = 1 ) a+b=n(n-1)/2 , a=xgcd(a,b) , b=ygcd(a,b) , (x,y>=1) a+b=n(n−1)/2,a=xgcd(a,b),b=ygcd(a,b),(x,y>=1)
于是 g c d ( a , b ) ( x + y ) = n ( n − 1 ) / 2 gcd(a,b)(x+y)=n(n-1)/2 gcd(a,b)(x+y)=n(n−1)/2
所以 最大gcd 就是 n(n-1)/2 的最大非原数的因数
考虑到一个数的因数较集中分布在 1~sqrt(n) 的范围内,所以从2开始枚举次小约数(因为除掉了1)
[优化]
原因:n(n-1)/2为个int范围内的数相乘,直接枚举对于特殊数据会超时
操作:把/2运算先丢到n和n-1其中的偶数上,命名为n1和n2,对n1和n2分别找次小约数,两个次小因数的最小值即为n(n-1)/2的次小因数
B 分数
题面懒得解释了
DP
我用复杂度不对的DP就A掉了…,我的源代码里sb一样地加了一重没用的循环
nex[i]指 ∣ a [ j ] − a [ i ] ∣ ≤ m |a[j]-a[i]|\le m ∣a[j]−a[i]∣≤m 所能到达的最大的j
f第一维就是位置,第二维指上一次蜗蜗告诉佳佳的位置,状态转移方程:
f [ j ] [ i ] = min ( f [ j ] [ i ] , f [ i ] [ i ] ) ( i < j ≤ n e x [ i ] ) f [ j ] [ j ] = min ( f [ j ] [ j ] , f [ i ] [ i ] + 1 ) ( i < j ≤ n e x [ i ] + 1 ) f[j][i]=\min(f[j][i],f[i][i])\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i \lt j \le nex[i])\\ f[j][j]=\min(f[j][j],f[i][i]+1)\ \ \ \ (i\lt j \le nex[i]+1) f[j][i]=min(f[j][i],f[i][i]) (i<j≤nex[i])f[j][j]=min(f[j][j],f[i][i]+1) (i<j≤nex[i]+1)
C 集合
对于 [1,n] 的子集 A,它的分数 s 为
1. 初始分数为0;
2. 对于所有的 i ∈ A , s + = a i i\in A,s+=a_i i∈A,s+=ai;
3. 对于所有满足 i , j ∈ { x ∈ A ∣ x ≥ 2 } , i k = j ( k ∈ { x ∈ Z ∣ x ≥ 2 } i,j \in \{x \in A|x \ge 2 \},i^k=j(k \in \{x \in Z|x \ge 2\} i,j∈{x∈A∣x≥2},ik=j(k∈{x∈Z∣x≥2}的二元组 ( i , j ) (i,j) (i,j), s − = b j s-=b_j s−=bj。
请求出分数最高的子集的分数是多少。
我一开始看成1到n的序列,后来又看成子串了
再想到 i 和 i 的 k 次方可以建边,只后就不会做了,交了个不知道什么东西,结果
正解:暴力!
看数据范围 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1≤n≤105 ,次数最多的 i = 2 i=2 i=2 时,k 都只有17,直接暴搜照样过
D 城市大脑
ZYQ 骗分骗到了满分
由于缺少可靠的结论(老师都不知道),只能暴力 n 2 n^2 n2 枚举两条路径相交的两点
(虽然这基于的两人的路径只可能交于一条链这一结论,我推出来了,也想到了暴力枚举,但我没时间没信心打出来 qwq )
对于每个n,只取m最小的方案,对于每个m,只取n最小的方案,进一步优化下一个步骤的时间复杂度
然后用k,n,m求ans的方法没听懂,老师的方法好像是二分导数(?)//k是剩余钱数,n是相交的边数,m是不相交的边数
7.15
今天开始是 陈江伦
Day 8
217pts 9th 还就A了T1…
拆式子
以差分数组为基础 带修
Q1 差分后的最大子序列和 80pts //我因为爆了int少了8分
直接把所有正数加起来
Q2 求上一问选的最小序列数量 20pts
老师说可以用set,可是我想不出这种做法,改天看标程
我看懂了同学的线段树
线段树上每个点记录5个值,分别是:
1 ap 这一段是否整段都为非负数
2 sum 即Q1的答案
3 cnt 不包括左右两个端点的完整序列个数
4 L 左边到头的序列的最大和
5 R 右边到头的序列的最大和
更新函数如下:
void update(int p) {
sum[p] = sum[lc] + sum[rc];//差分后取区间和,就是原来左右的差
cnt[p] = cnt[lc] + cnt[rc];//段数合并
ap[p] = ap[lc] && ap[rc];//两边都是连续一段,整段就是连续的
if(!ap[lc] && !ap[rc] && R[lc] + L[rc] > 0) cnt[p] ++ ;//左边的右到头和右边的左到头合并 ,这里认为合起来才算一段,最后的左右两段另外算
L[p] = ap[lc] ? sum[lc] + L[rc] : L[lc];//左到头 区间的和
R[p] = ap[rc] ? sum[rc] + R[lc] : R[rc];//右到头 区间的和
}
白云有一颗 nn 个节点的树,每个点有一个点权
白兔需要找到两条点不相交的路径,要求最大化这两条路径覆盖点的点权和
这道题有结论,很不巧,我又一次推出来了(***)
然后我 tm 又一次没写。
下次要大胆一些,说不准就A了
结论:
两条路径的四个端点中一定有两条个在树的直径的两个端点上
然后就有两类情况
1 有一条路径就是直径
答案加上现在的直径,再在剩下的森林里加上最大直径
2 两条路径都从直径的端点出发
记录每个直径上的点到直径两端点相隔的“距离”(其实是点权和),L[i] 和 R[i]
(两次DFS记路径就可以在求直径时得到)
每个在直径上的点在非直径的边的集合里跑一遍DP,每个直径上的点的dp值要加上L[i]或R[i],于是就有了两个值,al表示从L到当前点的最大值,ar表示从R到当前点的最大值
在直径上枚举i,取ans=max(ans,al[i]+ar[fa[i]]);
真正的ans求两种情况的最大值就行了
二合一
还不确定自己的想法对不对,先放着
END.