题目大意

考虑一个由 $n$ 个人构成的社交网络,其中任意两人都有一个用非负整数表示的亲密度。
初始时给出 $m$ 对人的亲密度,其余的亲密度为 $0$ 。
定义此社交网络的「八卦度」为异性之间的亲密度之和。
要求维护三种操作:

  1. 修改某人的性别
  2. 修改某两人的亲密度
  3. 询问八卦度

操作总数为 $q$ 。
数据范围:
$1 \le n, m, q \le 100000$

解法

这个社交网络可用一个无向图表示,亲密度为边的权值,按边所连接的两个点(人)的性别将边分为「同性边」和「异性边」。

先考虑暴力做法:
修改性别或亲密度都需要遍历某个点或某两个点的临接边表,复杂度太高。
一个优化是,用 std::map<pair<int,int>,int> 维护边的权值(即亲密度);
即便如此,修改性别仍需要遍历点的邻接边表。

正解是:
将无向图改造成有向图,边的方向由「度数小的点」指「向度数大的点」。
用 $c(u)$ 表示 $u$ 的出边的数目。

对每个点 $u$ 维护两个值 $s_1$, $s_2$,分别表示指向 $u$ 的边中同性边的权值之和 和 异性边的权值之和。

这样,对于改变点 $u$ 性别的操作,需要:

  1. 交换 $s_1[u]$ 和 $s_2[u]$ 。
  2. 对 $u$ 的出边指向的点 $v$,修改 $s_1[v]$ 和 $s_2[v]$ 。

复杂度为 $O(c(u))$

对于修改亲密度的操作,首先找到对应的那条边 $(u,v)$,修改其权值,再更新 $s_1[v]$ 和 $s_2[v]$ 。

复杂度为 $O(c(u) + c(v))$

下面证明 $c(u) = O(\sqrt{m}) $,$m$ 是边数。
证明:点 $u$ 的出边指向的点的总度数为 $\sum_{v\colon (u,v)\in E}$,

$2m > \sum_{v\colon (u,v)\in E} d(v) \ge c(u) d(u) \ge c(u)^2 $

$c(u) < \sqrt{2m}$
所以 $c(u) = O(\sqrt{m})$ 。

上述证明里所考虑的图是静态的。对于这个题目,我们可以采用离线的方式,将动态图转化成静态图,但这样就增加了编程复杂度。
下面考虑在动态添边的情况下是否还有类似的结论。

为了便于描述,我们把 $u$ 的出边所指向的点称作 $u$ 的「出邻点」,将 $u$ 的出邻点的集合记作 $N^-(u)$,则 $c(u) = |N^-(u)|$ 。
令 $d(N^-(u)) = \sum_{v\in N^-(u)} d(v)$ 。

考虑往途中增加一条(有向)边 $(u,v)$ 之后的情形:
$d(u) \to d(u)+1$
$d(N^-(u))$ 的增量 $\Delta$ 满足
$\Delta \ge d(u) + 1 $

所以
$2m > d(N^-(u)) \ge 1 + 2 + 3 + \dots + c(u)$
同样有
$c(u) = O(\sqrt{m})$

hihoCoder #1161 八卦的小冰的更多相关文章

  1. hihocoder 微软编程之美2015 初赛 第二场(暴力+字典序+图论+思维算法)

    题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52 ...

  2. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  3. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  4. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  5. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  6. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  7. Java实现画八卦

    八卦是由多个圆叠加而成,如果我们让每个圆都有自己的颜色,那么具体结构便一目了然,如下图所示: 显然只要令对应的圆颜色相同,就能达到我们预期的效果. 用Java就能轻松画出来: import java. ...

  8. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

  9. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

随机推荐

  1. JS中作用域和变量提升(hoisting)的深入理解

    作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部 ...

  2. pip和apt-get换源

    pip换源 一下方法对pip和pip3同时起作用 永久换源 运行一下命令: cd ~/.pip 如果提示目录不存在的话,我们要自行创建一个,再进入目录 mkdir ~/.pip cd ~/.pip 在 ...

  3. falling object思路总结

    1.用检测的方法把falling object标记为一个类别,然后检测出类别.这种方式不可行的原因:因为falling object可能是任何东西,所以可能是一个路锥,也可能是一个玻璃瓶,还可能是掉下 ...

  4. MySQL 外键 表的查询

    自增补充 这是查看怎么创建的表, \G示旋转90度显示表的内容 表的自增的关键是** AUTO_INCREMENT=3**,在表中添加数据后,这个会自动改变,通过alert可以改变这个默认值 mysq ...

  5. 【转】树莓派3代3.5寸触摸屏驱动的安装(通过ssh安装)

    这是用到的配件的树莓派3代 烧录好系统后,启动的树莓派,我的树莓派已经在一开始通过路由器和局域网,登陆了ssh,设置好了开机就能自动连接到电脑的360wifi,所以无论到哪 里,只要自己的笔记本电脑还 ...

  6. oracle 数据导到 sql server

    方法一: navicate:用法比较简单,选择工具-数据传输就可以了.目前测试了下暂时没遇到什么问题. 方法二: Microsoft SQL Server Migration Assistant 8. ...

  7. RestSharp使用备忘

    (1)一般调用: public static List<T> Execute<T>(string resourceUrl, object obj, out int totalN ...

  8. lua 使用正则表达式分割字符串

    function string_split(str, delimiter) if str == nil or str == '' or delimiter == nil then  return ni ...

  9. TCP/UDP 协议介绍

    TCP/IP五层网络结构模型 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输.只有该层为真实物理通信,其它各层为虚拟通信 数据 ...

  10. AutoLayout处理UITableView动态高度

    我们经常会遇到UITableViewCell的高度要跟随内容而调整,在未引入AutoLayout之前,我们使用以下方法计算Label高度,然后heightForRowAtIndexPath中返回计算的 ...