说在前面
报了这场CF但是不想打
于是就去帮室友AK了23333
UPD:还把紫打穿了
MegaOwler真的好厉害呀,码代码飞快
题目
题目大意
有
N
N
N个人在同一个公司上班,第
i
i
i个人的薪水一开始为
i
i
i,不过老板可以Q次指定员工编号
v
i
v_i
vi,第
i
i
i次操作会将
v
i
v_i
vi的薪水提升至
n
+
i
n+i
n+i
现在有
M
M
M对仇恨关系。假如
u
,
v
u,v
u,v有仇恨关系,那么当
u
u
u薪水比
v
v
v高(或
v
v
v比
u
u
u高)时,高的那个人就会向低的那个人炫耀
如果
u
u
u向
v
v
v炫耀,
v
v
v向
w
w
w炫耀,那么它们构成一个三元组
现在,需要在每次老板更改薪水之后,统计三元组的数量
数据范围见传送门
解法
我们把人看作点,将仇恨关系看成点间连边,方向为小权值指向大权值
这样,一个点对答案的贡献就是入度乘出度。每次操作相当于是把所有指向某点的边反向,并统计贡献
稍微YY一下,发现这题暴力的复杂度应该不差
对一个点操作,复杂度是入度大小,操作完之后入度将清零,菊花图的复杂度是很低的
如果我们要卡掉这个暴力,显然每次需要选择入度最大的点进行操作。不难发现,可以构造一个 N \sqrt{N} N个点的完全图,这样总能保证有一个点的入度达到最大的 N \sqrt{N} N,总复杂度 n N n\sqrt{N} nN
看起来也许暴力可过?尝试从 N \sqrt{N} N入手来证明复杂度
证明如下:
将度数小于
N
\sqrt{N}
N的点的集合记为
A
A
A,其余记为集合
B
B
B,显然
∣
B
∣
≤
N
|B|\leq\sqrt{N}
∣B∣≤N,并定义一个点的势能为它的入度
不妨先消费一定的复杂度,使得
A
A
A所连边全为入边(显然这部分复杂度不会超过
Θ
(
N
)
\Theta(N)
Θ(N)),以方便讨论
现在:
- 操作 A A A中任何一个点,单次释放势能不超过 N \sqrt{N} N,别的点增加的势能不超过 N \sqrt{N} N
- 操作 B B B中任何一个点,对 B B B中点的势能增加不超过 N \sqrt{N} N(因为 ∣ B ∣ < N ) |B|<\sqrt{N}) ∣B∣<N)
- 操作 B B B中任何一个点,所释放的来自 A A A的势能,必须是 A A A中的点被操作之后给 B B B的势能,这一部分不应该超过 1 1 1中的复杂度,即总量不超过 n N n\sqrt{N} nN
所以,总复杂度为 Θ ( n N ) \Theta(n\sqrt{N}) Θ(nN),证毕
于是就可以愉快了暴力AC啦
下面是代码
懒得不想写代码
是室友写的233333
这里是CF代码传送门