文章目录
2018.10.20 Day 1
T1 Array
题目大意: 给定一个长为
n
(
≤
5
×
1
0
7
)
n(\le 5\times 10^7)
n(≤5×107)的数列,有两个操作:一个给定
p
,
q
p,q
p,q,将所有元素
A
i
A_i
Ai修改为
p
⋅
i
+
q
p\cdot i+q
p⋅i+q;一个给定
x
,
y
x,y
x,y,将
A
x
A_x
Ax修改为
y
y
y。每次操作后询问整个序列元素的和。
我的思路: 挺水的题…
记录每个点上次被第二种操作时,最近的被第一种操作的时刻,再记录每个点上次被第二种操作改成几,如果某次第二种操作时这个点所记录的时刻和上一次第一种操作的时刻不同,就以那次第一种操作为基准进行修改,否则就以上次第二种操作为基准修改,这样就是空间
O
(
n
)
O(n)
O(n),时间
O
(
m
)
O(m)
O(m)了。然而空间只允许开两个
5
×
1
0
7
5\times 10^7
5×107的int,我因为开多了被卡爆了20分(居然没有爆零,还是给面子的)…
T2 Computer
题目大意: 一个
n
n
n个点的无向图,每个点有一个权值
a
i
a_i
ai,一开始
a
1
=
0
a_1=0
a1=0而其他
a
i
=
1
0
9
a_i=10^9
ai=109,随机进行以下操作:选一条边,编号为
i
i
i,选其中一个端点
x
x
x,另一个端点为
y
y
y,执行
a
y
=
min
(
a
y
,
max
(
a
x
,
i
)
)
a_y=\min(a_y,\max(a_x,i))
ay=min(ay,max(ax,i))。问这个无向图稳定之后(无论怎么进行上述操作都无法产生改变点权就称为稳定)各点的最终点权。
我的思路: 挺好的题,可惜没能卡掉最短路…
上面很明显是一种松弛操作,因此直接SPFA可A,但我的做法是这样的:从上面的操作中可以看出最终每个点的点权等于从
1
1
1到
i
i
i的路径上边编号最大值的最小值,因此Kruskal把最小生成树求出来,然后在最小生成树上DFS即可达到
O
(
n
+
m
)
O(n+m)
O(n+m)的复杂度。
T3 Eval
暴力模拟题…不细说了…
最后我的分数是 80 + 100 + 100 = 280 80+100+100=280 80+100+100=280,可是由于大佬们太强了, 300 , 290 300,290 300,290分层出不穷把我爆踩,让我在掉rating的边缘疯狂试探…我还是太菜了…
2018.10.21 Day2
T1 Ball
题目大意:
n
n
n个直径为
1
1
1的小球在一个数轴上,每个小球占据数轴上
[
l
i
,
l
i
+
1
]
[l_i,l_i+1]
[li,li+1]的区间,在
P
P
P的位置有一堵墙,有两个操作,一个是往某一位置插入小球(如果该位置原来有小球就不管),一个是将最左边的小球往右推,它撞到另一个小球后停下来,那一个小球继续走,持续下去直到撞到墙停住为止。求最后每个球的位置。
做法: 容易发现第二个操作就是将所有球位置
−
1
-1
−1,然后把最左边的球放到
[
P
−
1
,
P
]
[P-1,P]
[P−1,P],开一个变量表示位置减过的次数,其余用set维护即可。
T2 Sequence
题目大意: 给定一个长为
n
n
n的序列,问最多交换
k
(
≤
10
)
k(\le 10)
k(≤10)对元素的情况下能取到的最大子段和,需要输出这个段的位置以及交换的具体步骤。
做法: 神仙DP,题解就一句话,并没看懂,有待进一步理解。
T3 Color
题目大意: 一个
n
n
n个点的有根树,每个叶子节点有一个颜色(黑/白),非叶子节点的颜色由下面的方法决定:如果它所有的儿子节点颜色相同,这个节点的颜色就是儿子节点的颜色,否则就是灰色。
m
m
m次修改,每次修改一个叶子节点的颜色,每次修改后询问树中三种颜色的点的数目。
做法: 挺好的题,不过数据太水了暴力都能碾标算,所以我常数爆大的
O
(
n
log
2
n
)
O(n\log^2n)
O(nlog2n)玄学树剖能过估计没什么说服力…还是直接看正解吧。
注意到每次修改只影响到这个叶子节点到根路径上的点的颜色。我们发现在任意时刻,从一个叶子节点到根的路径上,一定是下面一段是黑或白(取决于叶子节点的颜色),然后上面都是灰色,那么问题就变成了找到这个分界点。可以直接拍成DFS序,然后倍增+树状数组判断,
O
(
n
log
2
n
)
O(n\log^2n)
O(nlog2n),对答案的贡献就是减去之前状态的答案,再加上当前状态的答案。但还有更好的做法,注意到路径上最深的灰色节点,是这个叶子节点和另一个和它颜色不同的叶子节点的LCA中最深的那一个,而这个和它颜色不同的叶子节点仅可能是DFS序上离它最近的两个颜色不同的点中的一个,所以用set维护两种颜色叶子节点在DFS序上的位置,然后就可以直接倍增求LCA并完成答案的修改了,时间复杂度为
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
今天这套题考了 100 + 0 + 100 + 200 100+0+100+200 100+0+100+200分,第二题本应该写个暴力却还是交了个不对的结论上去…我好菜啊…
2018.10.27 Day3
T1 Cycle
原题见BZOJ4773,这题只是把负环改成正环而已,使用倍增+Floyd解决。
T2 Leaves
原题见POI2011-Tree Rotations,一点没变(而我还是写挂爆零了,丢人)。
T3 Sequence
原题见CF840C,DP方程完全相同,都是证明条件有传递性后使用DP方法求解。
这次比赛就是个原题大赛…然而唯一有把握写出的T2居然挂了,现在还是没调出来,退役了…这也是我打这个网站的比赛以来第一次掉rating…
2018.10.28 Day4
T1 Tree
题目大意: 一棵带边权的树,定义
g
(
i
,
j
)
g(i,j)
g(i,j)为
i
,
j
i,j
i,j间路径上最大的边权,
i
=
j
i=j
i=j时
g
(
i
,
j
)
=
0
g(i,j)=0
g(i,j)=0,对于一个长为
n
n
n的序列(不一定是排列)
P
P
P,定义价值
f
(
P
)
f(P)
f(P)为
min
i
=
1
n
g
(
i
,
P
i
)
\min_{i=1}^n g(i,P_i)
mini=1ng(i,Pi),而定义合法的序列为,对于任意元素
i
i
i在序列中出现次数不超过
x
i
x_i
xi的序列,求合法序列的最大价值。
n
≤
1
0
5
n\le 10^5
n≤105。
做法: 最小值最大,很容易想到二分答案,转化为判定性问题。要让
f
(
P
)
≥
m
i
d
f(P)\ge mid
f(P)≥mid,就是所有的
g
(
i
,
P
i
)
g(i,P_i)
g(i,Pi)都
≥
m
i
d
\ge mid
≥mid,也就意味着这些路径都至少要经过一条边权
≥
m
i
d
\ge mid
≥mid的边。我们可以直接对于可能的匹配关系建立二分图,用网络流判定是否存在完美匹配,然而还是
30
30
30分…
结果这么明显的判定完美匹配问题,我竟然没有想到Hall定理…复习一遍Hall定理,说的是:一个二分图
X
−
Y
X-Y
X−Y中存在完美匹配,当且仅当对于
X
X
X中每一个子集
S
S
S,都满足:与
S
S
S直接连接的
Y
Y
Y内的点数
≥
∣
S
∣
\ge|S|
≥∣S∣。回到这一题,树上被
≥
m
i
d
\ge mid
≥mid的边分割成一些连通块(以下所说的连通块指的都是这个玩意),显然某个点能匹配的点是除了它所在连通块内的所有点。我们把
1
1
1 ~
n
n
n这一边看做
X
X
X,然后把每个点
i
i
i拆成
x
i
x_i
xi个,看做
Y
Y
Y,那么根据Hall定理,我们能得到很多约束条件。但约束条件有
O
(
2
n
)
O(2^n)
O(2n)个,不可能一一处理,需要看出它们的共性:当
S
S
S在树上处于同一个连通块时,直接连接的
Y
Y
Y中点的集合为除了这一连通块的所有点;否则,直接连接的
Y
Y
Y中点的集合为全集。因此我们发现约束条件被分成了最多
n
+
1
n+1
n+1类,同类中直接连接的
Y
Y
Y中点的集合相同。那么对于同一类,显然
∣
S
∣
|S|
∣S∣越大条件越不容易满足,因此在同类中我们选择出最大的
∣
S
∣
|S|
∣S∣来判断即可。于是我们就只要判断最多
n
+
1
n+1
n+1个条件了,这些条件是:
1.对于一个连通块
S
S
S,所有不属于这个连通块的点的
x
i
x_i
xi之和应该
≥
∣
S
∣
\ge |S|
≥∣S∣。
2.
n
n
n应该
≤
\le
≤所有点的
x
i
x_i
xi之和。
显然直接
O
(
n
)
O(n)
O(n)DFS就能判断这些条件了,于是我们就解决了这一题,时间复杂度为
O
(
n
log
v
)
O(n\log v)
O(nlogv),
v
v
v指二分的范围。
T2 Sort
题目大意: 给定两个长为
n
n
n的序列
A
,
B
A,B
A,B,输出把所有
A
i
+
B
j
A_i+B_j
Ai+Bj从小到大排序后第
L
L
L到第
R
R
R个数。
n
≤
1
0
5
,
1
≤
L
≤
R
≤
n
2
,
R
−
L
≤
1
0
5
n\le 10^5,1\le L\le R\le n^2,R-L\le 10^5
n≤105,1≤L≤R≤n2,R−L≤105。
做法: 如果
L
=
1
L=1
L=1,这就是一个非常经典的用优先队列解决的问题了:首先对
A
,
B
A,B
A,B都排序,那么对于一个
A
i
A_i
Ai,与其对应的所有
A
i
+
B
j
A_i+B_j
Ai+Bj随着
j
j
j的增大而增大。于是我们对每个
A
i
A_i
Ai存一个
n
o
w
i
now_i
nowi,一开始
n
o
w
i
=
1
now_i=1
nowi=1,然后把所有
A
i
+
B
1
A_i+B_1
Ai+B1扔进优先队列里。每次取出一个最小的输出,然后对应位置的
n
o
w
i
now_i
nowi就自增,把下一个
A
i
+
B
n
o
w
i
A_i+B_{now_i}
Ai+Bnowi扔进优先队列里,时间复杂度为
O
(
n
log
n
)
O(n\log n)
O(nlogn)。
而现在
L
L
L可能很大,但
R
−
L
R-L
R−L还是
1
0
5
10^5
105,于是我们想到通过某些方法把问题重新规约为上面的问题解决。我能想到的最简单的方法是,先二分答案,算出第
L
L
L大的
A
i
+
B
j
A_i+B_j
Ai+Bj的值
x
x
x,把正确数量的
x
x
x输出,然后再用上述方法求出
>
x
> x
>x的数中的前若干小的数。这就很容易处理了,手写二分,或者用upper_bound什么的都行。还可以加一个小小的优化,每次二分只用计算一次upper_bound(对于
A
1
A_1
A1),而对于后面所有的数,因为
A
i
A_i
Ai单调增,所以对应的
B
B
B的范围就单调缩短了,用双指针维护即可,这样一来即可做到
O
(
n
log
n
)
O(n\log n)
O(nlogn)的复杂度。
T3 Triangle
实际上就是NOIP某年原题《计算系数》,很简单不说了。
于是这次考试 20 + 100 + 100 = 220 20+100+100=220 20+100+100=220分,题目难度完全倒序,但AK爷貌似还是很多,我好菜啊…
2018.11.3 Day5
T1 排队
题目大意: 给定一个长为
n
n
n的数列
A
A
A和一个数
x
x
x,将某个数增加或减少
1
1
1的代价都为
1
1
1,问使得整个数列中位数为
x
x
x的最小代价。
n
≤
2
×
1
0
5
,
n
n\le 2\times 10^5,n
n≤2×105,n为奇数。
做法: 先将数列排序,可以看出,如果目前中位数小于
x
x
x,那么把中位数以及之后比
x
x
x小的数都改成
x
x
x是最优的,否则把中位数以及之前比
x
x
x大的数都改成
x
x
x是最优的,直接统计答案即可。
T2 翘课
题目大意: 有
n
n
n个点,给定一个数
K
K
K,一个点能被标记当且仅当与它直接相连的点中至少有
K
K
K个被标记,给定
m
m
m次操作,每次操作加一条边,询问每次操作后至多有多少个点可以被标记。
n
,
m
≤
2
×
1
0
5
,
K
<
n
n,m\le 2\times 10^5,K<n
n,m≤2×105,K<n。
做法: 容易想到一个判断的方法:先标记所有的点,然后不断删去度数小于
K
K
K的点(删点也意味着与它相连的边被删),直到不能再删为止,剩下的点数就是答案。那么按照这个思路,如果是不断加边的操作就不好做了,但如果我们倒过来,变成删边,就十分好做了,因为删一条边最多影响两个点的度数,而且一条边只会被遍历
O
(
1
)
O(1)
O(1)次,用一个队列维护删点的过程即可做到
O
(
n
+
m
)
O(n+m)
O(n+m)。
T3 运气大战
题目大意: 给定两个长为
n
n
n的序列
w
w
w和
r
r
r,每个
w
i
w_i
wi都有一个不能匹配的点的编号
f
i
f_i
fi,一开始
f
i
=
i
f_i=i
fi=i,要求一个排列
c
c
c,使得
c
i
≠
f
i
c_i\ne f_i
ci=fi,并且
∑
w
i
⋅
r
c
i
\sum w_i\cdot r_{c_i}
∑wi⋅rci最大。有
m
m
m个操作,每次交换两个
f
i
f_i
fi,每次交换后,请求出上面所求的最大值。
做法: 神题,暂时不会,等待补充。
2018.11.4 Day6
T1 地砖设计
题目大意: 用一些任意整数边长的正方形的地砖铺满
n
×
m
n\times m
n×m的地面,要求相邻的地砖颜色不同,并且将所有
1
×
1
1\times 1
1×1方格上的颜色从上到下,从左到右写出后字典序应该最小,求最后的方案。
做法: 要字典序最小,显然按顺序贪心,每次应该填当前能填的最小的颜色。但由于可以使用任意边长的正方形,考虑的时候会复杂一些。每次选择一个最左上的还没填的方格,先看一下这个方格能填的最小颜色,然后再往右看右边的方格能填的最小的颜色,能得到一个最长的能填这种颜色的连续段,那么我们就应该在这里放一个以这一段为上边界的正方形。当然,有时候可能放不下,那就放到边界为止。这样贪心下去就可以得到答案了,时间复杂度
O
(
n
3
)
O(n^3)
O(n3)。
T2 量子二叉堆
题目大意: 定义完全二叉树为,除了最后一层外是满二叉树,最后一层的节点也尽量靠左的树。堆是一种完全二叉树,每个点赋
1
1
1~
n
n
n的不同权值,求满足大根堆或小根堆性质的
n
n
n个点的树的数目。
做法: 先考虑大根堆,小根堆的情况是一样的。注意到每棵子树也是堆,显然是子问题,树形DP即可,令
f
(
i
)
f(i)
f(i)为以
i
i
i为根的子树的方案数,则有:
f
(
i
)
=
C
l
s
i
z
+
r
s
i
z
l
s
i
z
⋅
f
(
l
)
⋅
f
(
r
)
f(i)=C_{lsiz+rsiz}^{lsiz}\cdot f(l)\cdot f(r)
f(i)=Clsiz+rsizlsiz⋅f(l)⋅f(r)
最后的答案就是
f
(
r
o
o
t
)
f(root)
f(root),而小根堆相同也有
f
(
r
o
o
t
)
f(root)
f(root)的答案。注意当
n
>
1
n>1
n>1时不可能有树同时满足两种条件,但
n
=
1
n=1
n=1时唯一的那一种情况同时满足了两种条件,特判一下即可。
T3 作画鬼才
题目大意: 一个由小写字母组成的矩阵,现在制造
k
k
k个矩阵,每个矩阵都是在原矩阵的基础上将某一个子矩阵改成某种字母。定义两个矩阵间的差异度为,对应位置上字符差的绝对值之和,在
k
k
k个矩阵求一个矩阵,使得它和其他矩阵的差异度之和最小。
做法: 神题,还没弄懂,待补全。