WD的OI日记

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 )} (ij)为质数的两点的值不同,求最小颜色数和其对应的任一种染色方案

这是一道结论题, 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[i1][j1](s1[i]==s2[j]),f[i1][j]+1,f[i][j1]+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} ij>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<=nm<=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]2dep[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]2dep[lca(l,r)]=idep[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} la,br a , b {a,b} a,b在树上的简单路径中所有点与边编号都在 [ l , r ] {[l,r]} [l,r]之间。
1 < = n , m < = 1 e 6 {1<=n,m<=1e6} 1<=nm<=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} lmin(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}} t106,0n,m1018,1a,b1018
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)} (jL[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 子序列,当且仅当

  1. t[3]=t[5];
  2. t[4]=t[6];
  3. t[1],t[2],t[3],t[4] 两两不同。

分治思想+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)i1,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]=vVmax(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](1lrn) ,请问有多少子区间 [ i , j ] [i,j] [i,j] 满足 l ≤ i ≤ j ≤ r l≤i≤j≤r lijr 并且子序列 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(n1)/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(n1)/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<jnex[i])f[j][j]=min(f[j][j],f[i][i]+1)    (i<jnex[i]+1)

C 集合
对于 [1,n] 的子集 A,它的分数 s 为
1. 初始分数为0;
2. 对于所有的 i ∈ A , s + = a i i\in A,s+=a_i iA,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{xAx2},ik=j(k{xZx2}的二元组 ( 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 1n105 ,次数最多的 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…

T1

拆式子

[T2](T186338 2021.7.15B - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

以差分数组为基础 带修

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];//右到头 区间的和 
}

T3

白云有一颗 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求两种情况的最大值就行了

[T4](T186340 2021.7.15D - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

二合一

还不确定自己的想法对不对,先放着

END.

你可能感兴趣的:(笔记)