[codeforces 1230F]Konrad and Company Evaluation-暴力

说在前面

报了这场CF但是不想打
于是就去帮室友AK了23333

UPD:还把紫打穿了

MegaOwler真的好厉害呀,码代码飞快


题目

CF1230F传送门

题目大意

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} BN ,并定义一个点的势能为它的入度
不妨先消费一定的复杂度,使得 A A A所连边全为入边(显然这部分复杂度不会超过 Θ ( N ) \Theta(N) Θ(N)),以方便讨论

现在:

  1. 操作 A A A中任何一个点,单次释放势能不超过 N \sqrt{N} N ,别的点增加的势能不超过 N \sqrt{N} N
  2. 操作 B B B中任何一个点,对 B B B中点的势能增加不超过 N \sqrt{N} N (因为 ∣ B ∣ < N ) |B|<\sqrt{N}) B<N
  3. 操作 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代码传送门

你可能感兴趣的:(杂题(乱搞))