每周开一篇,这安排不错
上个星期还是没有达到想要的状态,还是有很多遗漏的没有处理。
可是人确实是会累的,不能否认这一点,我们应当保证效率地学习,而不是用无效的努力麻痹自己,让自己沉浸在一种自我感动的错觉中。
继续上周未完成的任务:
1.图论的总结
2.区间dp和树形dp
3.Cat transportation
4.二次元冒险的最短路做法+复杂度分析
5.华容道的dfs写法
6.二维数点问题
(虽然Lzg老师总告诉我,不要把任务留到明天。每一天开始的时候都应当是全新的,去迎接新的挑战。之前我也觉得当周未完成的放在周天来完成,结果周天效率太低,完全达不到要求。还是先把任务记下来吧,总会找到时间去查漏补缺)
2019/10/28
数据结构专题练习(以前总以为数据结构就是线段树,主席树,平衡树,虚树……没想到还有很基础但很重要的栈、队列、堆、并查集……)
1.BZOJ#1050 旅行
并查集的简单运用,维护连通性
2.HDU#2473 Junk mail filter
并查集的删减点。虚拟父节点+虚拟新节点
3.BZOJ#1370 Gang团伙
并查集的简单运用
4.Codevs2492 上帝造题的七分钟2
并查集的巧妙运用。维护右边第一个不为1的位置。
具体实现也就是若当前位置为1,则
f
a
[
i
]
=
i
+
1
fa[i]=i+1
fa[i]=i+1,依次找过去即可
5.SCOI2016 萌萌哒
倍增+并查集。对题目本质的理解+转化
将区间拆为
l
o
g
(
n
)
log(n)
log(n)个,降低时间复杂度
6.NOI2015 荷马史诗
k叉哈夫曼树的模板,注意
(
n
−
1
)
%
(
k
−
1
)
?
=
0
(n-1)\%(k-1)?=0
(n−1)%(k−1)?=0,如果不等则要补0
哈夫曼编码的目的使得所有串编码后的总长最小
7.BZOJ#2151 种树
贪心好题
去掉限制后思考
然后再加上限制考虑
由简到繁
8.HDU#1512 monkey king
可并堆模板(左偏树的写法:注意斜深度为根到右儿子的距离)
9.WOJ#2155 派遣(复杂度+自己的做法)
可并堆的妙用
枚举每个点作为管理者,其子树的信息可以有儿子合并得到。
注意到一个性质,如果一个点在其儿子时未被选入决策空间,那么在父亲这个位置肯定也不会用到
那我们就维护每个节点其子树中的可选择空间
用可并堆快速合并儿子信息
然后对于当前的大根堆,如果sum不满足条件就一直弹掉堆顶元素
这样每个点最多进出堆一次,复杂度有保障
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
但是按照之前我自己yy的做法,每次都从决策空间中取最小的元素。复杂度大概是
n
m
l
o
g
n
nmlogn
nmlogn
小结:
虽然看着很多都是模板,但是菜鸡选手都不会来着。。
今天算是学了蛮多知识的吧
晚上:
1.2019/03/30
难道是dp专场的考试?
T1 状压dp(还比较薄弱,没有想到做法)
看了题解后,好像还是很简单的样子。状压后BFS
T2 树形dp(能自己想出来)
T3 数位dp (能想到一半,但没有考虑到重复计算的情况【记得对拍】)
2.2019/03/02
T1 锁
疯狂猜结论,猜对了也证不来
猜错了。。也没办法
T2 正方形
推出来了半个式子,后面的化简卷积……一脸懵逼o((⊙﹏⊙))o
弃了弃了
T3层流(quence)
树上差分好题
和相遇(豪哥)那道题的不同在于,对于一个路径完全包含另一个路径的情况,这里并不能算作相交
因而也不能简单的将情况统计为
1.路径上lca的个数 2.自己的lca被经过的次数
考虑更优秀的做法:
将所有路径按长度从大到小排序,依次加入
如果两条路径有相交(这道题的相交),则其路径上的颜色种类不止一个(如果每条路径都用一种颜色表示)
那么怎么快速判断路径上颜色个数是否为1呢?
树链剖分维护一个区间最大值和最小值即可
小结:
这都是些什么神仙题。。。。
2019/10/29
【考前睡觉( ̄o ̄) . z Z】
今天考试
T1 70pts
T2 10pts
T3 15pts
Total: 95pts
最高:170pts
T1 扩欧
其实蛮简单,但若是没有想到怎么快速求最优值,还是有一定难度
正解是发现一个性质
a
x
+
b
y
=
c
ax+by=c
ax+by=c
当
a
>
b
a>b
a>b的时候,
∣
x
∣
+
∣
y
∣
|x|+|y|
∣x∣+∣y∣的最小值要么在y的最小正值时取得,要么在y的最大负值处取得
我呢?由于没有想到可以将a,b的大小关系确定
就直接暴力计算
∣
x
+
k
∗
b
∣
+
∣
y
−
k
∗
a
∣
|x+k*b|+|y-k*a|
∣x+k∗b∣+∣y−k∗a∣的最值
但由于整数和实数的问题WA了三个点
还有一个细节需要注意,gcd最好一开始就除掉
不然要爆 long long
T2 贪心排序+dp+线段树优化转移
考虑限制
i
<
j
&
&
a
i
<
=
b
j
i<j\&\&a_i<=b_j
i<j&&ai<=bj
我们该如何确定排列顺序,使得按照这样的顺序dp一定可以满足要求
分类讨论相邻两项之间的关系:
a
i
<
=
b
j
&
&
b
i
<
a
j
a_i<=b_j\&\&b_i<a_j
ai<=bj&&bi<aj 那么
i
i
i 必须在
j
j
j 前面
同理
a
i
>
b
j
&
&
b
i
>
=
a
j
a_i>b_j\&\&b_i>=a_j
ai>bj&&bi>=aj
j
j
j 必须在
i
i
i前面
对于
a
i
<
=
b
j
&
&
a
j
<
=
b
i
a_i<=b_j\&\&a_j<=b_i
ai<=bj&&aj<=bi 两者无论以怎样的顺序都可以
同理
a
i
>
b
j
&
&
a
j
>
b
i
a_i>b_j\&\&a_j>b_i
ai>bj&&aj>bi这两个一定不会同时选
也就是说对于后两种情况随便排列都可以
那么只用考虑前两种限制
容易发现
a
i
+
b
i
<
a
j
+
b
j
a_i+b_i<a_j+b_j
ai+bi<aj+bj时把
i
i
i排在
j
j
j前面
直接这样排序即可
但是……
为什么不可以直接在比较函数中写
r
e
t
u
r
n
a
i
<
=
b
j
&
&
b
i
<
a
j
return\ a_i<=b_j\&\&b_i<a_j
return ai<=bj&&bi<aj
因为这个不满足严格弱序
可以理解为如果
i
<
j
&
&
j
<
k
!
−
>
i
<
k
i<j\&\&j<k\ !-> i<k
i<j&&j<k !−>i<k
不具有传递性
现在考虑如何在新序列上dp得到最值
显然,我们想O(1)或者O(log)地得到之前的最优决策然后进行转移
由于这道题的转移和
a
i
,
b
i
a_i,b_i
ai,bi的值相关
我们很容易联想到
a
i
,
b
i
a_i,b_i
ai,bi的值做下标建立权值线段树
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示当前处理到第i个点,选择出的点中a的最大值为j的最优情况(将数对处理为点)
如果当前的点不选,则
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
−
1
]
dp[i][j]=dp[i][j-1]
dp[i][j]=dp[i][j−1]
如果要选,则
j
<
=
b
[
i
]
j<=b[i]
j<=b[i]
在此基础上再分类讨论
a
i
<
j
∣
∣
a
i
>
=
j
a_i<j||a_i>=j
ai<j∣∣ai>=j
因为这两种情况对应转移后的
j
′
j'
j′是不一样的
考虑优化转移
很明显,第一维可以不用
然后对于
a
i
<
j
<
=
b
j
a_i<j<=b_j
ai<j<=bj的情况,相当于对区间
[
a
i
,
b
j
]
[a_i,b_j]
[ai,bj]进行区间加的操作
j
<
=
a
i
j<=a_i
j<=ai则相当于在
[
1
,
a
i
]
[1,a_i]
[1,ai]中找最大值,然后单点修改
a
i
a_i
ai
这样处理后,整道题就结束啦~~
好题,赞一个
当然代码实现上还有一些细节:
- 权值线段树是建立在离散化过后的值上,所以整个大的区间不再是 [ 1 , n ] [1,n] [1,n]
- 由于要排序又要离散化。先处理排序,否则,离散化后的关系与原关系不一定一致
T3 多源最短路
相较于T2的防AK,T3显得友好了许多。其实考场上也有想过多源最短路,但并没有与这道题结合起来。要明白,任意两个特殊点的最短路径上的所有点一定不会都是由同一个源点更新。根据这一点,我们就枚举所有边 ( u , v ) (u,v) (u,v)更新u的源点到v的源点的最短距离
小结:
T2看了题解后还是能够理清楚,考场就不知道了……还需要多训练。T3应该是能想出来的。T1也应该想出来
但考场没做出来就是菜!
由今天的T2联系到上一次同类型的考试题:
对比:【20191017CSP-S测试】删数字–>二维偏序问题,权值线段树
先将题目转化为三维偏序问题,然后通过观察,再化简为二维偏序问题
然后通过一维的排序,再次降到一维偏序
渐渐发现,二维偏序的问题,往往都是通过一维的排序,对另一维进行权值线段树/权值树状数组
POJ2482 Stars in Your Window–>扫描线
【超级浪漫的题面❤】
但是一点都不好理解……一开始理解在边界上的星星不能算,就是整个矩形的外框上的星星都不能算。结果网上题解说是左右只能算一边??(亏我还拉着dxjj扯了好久的边界问题)
一开始想的是二维前缀和,然后看了一眼数据范围。。不可做。正解:每个星星的覆盖面积有限,我们可以预处理出来。然后就是找矩形重合部分的最大值了
比较常见
二维问题:通过一维的扫描,只处理另一维
WOJ #1817 开车旅行
倍增好啊。
先考虑70pts的做法:
n
2
n^2
n2预处理,然后模拟即可
然后就想到O(n)预处理
然后模拟的时候不按一步一步地走
利用倍增的思想,每次跨
2
j
2^j
2j步
2019/10/30
今天又双叒考试
我凉了
T1 30pts
T2 10pts
T3 0
Total:40pts
最高:170pts
(我怀疑我是睡过去的)
T1 二维偏序问题
没有将
a
l
+
…
+
a
r
>
=
0
a_l+…+a_r>=0
al+…+ar>=0转化为前缀和作差的形式
一直死磕在了尝试用线段树做到
n
l
o
g
n
nlogn
nlogn
明明一直在告诉自己要跳出来换一个思路
但是脑袋就是没转过弯(这两天都过得昏昏沉沉。好好调整)
【被隔壁hou神怼,你之前做过的二维偏序问题怕不是白做了】
T2 区间dp
大家的区间dp都是n3(40pts),我呢。。。n4(10pts)
没有想到那个显然的性质:每次深度加一,其实就是
[
l
,
r
]
[l,r]
[l,r]区间内的每一个值都加一遍(大脑反应迟钝)
正解其实也是区间dp
只是运用了一个决策单调性(打表是个好东西)
用到了四边形不等式来证明
大概意识流了一下
就是说如果满足
a
<
b
<
c
<
d
a<b<c<d
a<b<c<d
则有
f
a
,
d
+
f
b
,
c
>
=
f
a
,
c
+
f
b
,
d
f_{a,d}+f_{b,c}>=f_{a,c}+f_{b,d}
fa,d+fb,c>=fa,c+fb,d
T3 分治+高斯消元
首先我的暴力15pts,因为快速幂打挂而痛失
正解:
首先得发现,虽然终点不一样,但我们推出来的式子是双胞胎形。然后就可以高斯消元了
。。。(此处口胡省略)
2019/10/31
又是莫名其妙的一天,不知道自己在干些什么
推了一早上的线段树。。但是最后发现我的入手点就是错误的
不应该从线段树的维护来考虑怎么做
而是先想好怎么做,再考虑怎么维护
因果关系颠倒后就凉了
从需要入手,而不是直接考虑线段树(数据结构只是辅助)
WOJ#1973 [HAOI2012]高速公路
考虑每一段路对答案的贡献
v
i
∗
(
i
−
l
+
1
)
∗
(
r
−
i
+
1
)
v_i*(i-l+1)*(r-i+1)
vi∗(i−l+1)∗(r−i+1)
将式子拆开(通常都以i作为主元)
Hdu5828 Rikka with Sequence 区间开方+区间加+区间求和
考虑只有区间开方,我们维护一个区间最大值即可。
现在还需要区间加,显然不行了
考虑维护极差,区间加对极差是没有影响的,但每次区间开方
极差都是单调不增的。在常数次开方后就会<1了
然后转化为区间加,区间覆盖即可
Hdu1394 Minimum Inversion Number
感觉是个很显然的性质。一旦发现就很简单了。
每次平移,相当于从队首将一个数移到队尾。计算其改变量即可
cogs2632. [HZOI 2016] 数列操作d 区间加等差数列+区间求和
记录下首项和公差即可。注意到标记的可合并性
cogs2633. [HZOI 2016]数列操作e
推式子,分开维护即可
Hdu6183 Color it
有多种颜色,颜色数目又很少。直接分开维护,各开一个线段树(需要动态开点)
发现有很多题都是这样的。信息较多,不方便一次性维护的时候,将其中一类信息确定下来(或排序或枚举)
bzoj3531: [Sdoi2014]旅行
比如说这道题
可以离线将同种颜色的信息放在一起处理
也可以动态开点
WOJ郁闷的小J
就是上面一道题的简化版。放在序列上
洛谷 哈希冲突
只预处理
n
n
n\sqrt n
nn 信息
预处理和操作时间上折中处理一下【很常见】
洛谷 阅读理解
未完成
2019/11/01
今天考试
T1 100pts
T2 70pts
T3 40pts
Total:210pts
最高:240pts
T1 防爆0
T2
其实按照我的思路稍微优化一下也是可以的。
每次不用重新统计,动态的来思考
减少一个数,加入一个数
T3
应该是可以想到的。。。。关键是要想到排序!
因为gi是所有fj值比fi小的,且不在以i为根的子树中的fj的和。我们立马就会想到可以按照fi排序,那样我们按照fi由小到大处理,统计到fi的时候就可以统计出所有比fi小的f,
WOJ#1820 疫情控制
二分啊,哥们儿
贪心会不会??
WOJ#3963 [LNOI2014]LCA
妙啊。
求
x
,
y
x,y
x,y的LCA的深度
就是
x
x
x到根的路径上每个节点加1
对
y
y
y查询其到根节点的路径和
WOJ#4491 「GXOI / GZOI2019」旧词
更妙啊。
考虑上一道题为什么每个节点加1,其实加的是差分数组(最后求的是前缀和嘛)
那么这道题也是一个道理,我们维护一个差分数组即可
2019/11/02
今天考试,,,暴力全挂
T1 100pts
T2 0pts
T3 0pts
T1
看脸没被卡啊。。。【评测机是爱我的】
T2 贪心+dp
将背包从大到小(从小到大不行哦,感性理解一下)
- 以后考试,如果感觉某种做法有问题,可以先写出来看看嘛(说不定改一改就正解了)
- 加了一维背包的限制就不会做了??将背包带在状态里不就好了嘛,然后贪心乱搞都有70pts(血亏)
T3 计数类dp
暴力:
- 枚举每个节点的父亲节点(确定树的形态),然后再check嘛
- 对于R==3的情况,dp嘛(dp也可以暴力的)
学hash表
2019/11/03
WOJ#2210 上升序列
数据够水没被卡,暴力处理0的情况都可以A
当然正解还是要学一下的:
如果不要求严格上升,求出lis再加上0的个数即可,但是要求严格上升所以我们可以把每个数减去在它前面的0的个数,再来求最长上升子序列,再加上0的数量即可。相当于强制所有0都有贡献,由于强制一个0出现最多导致一个可以出现在lis里的数不出现,所以并不会影响lis的长度。