题意

原意简述版

有 \(n\) 个公司,每个公司在某社交媒体拥有一个粉丝专页。该社交媒体推出了“关注”功能,每个粉丝专页必须“关注”一个粉丝专页,保证不会有自己关注自己和互关的事情出现。第 \(i\) 个公司的粉丝专页有 \(v_i\) 位订阅者。每个粉丝专页上都有一些广告,分别来自:

  • 该粉丝专页的所有者公司
  • 该粉丝专页“关注”的粉丝专页的所有者公司
  • “关注”该粉丝专页的粉丝专页的所有者公司

当第 \(i\) 个公司的粉丝专页上有 \(k\) 条广告时,每条广告都会被点击 \(\left\lfloor\dfrac {v_i}k\right\rfloor\) 次。每位订阅者会点一条广告,所以多余的还没有点广告的订阅者就会全部点该粉丝专页的所有者公司的广告。每一位订阅者的点击会为广告的所有者公司带来 \(1\) 的收益。现在要求你支持以下三个操作:

  1. 1 x y 让第 \(x\) 个公司的粉丝专页改为“关注”第 \(y\) 个公司的粉丝专页。
  2. 2 x 查询假如每位订阅者按照上述规则进行一次点击,第 \(x\) 个公司的收益。
  3. 3 查询假如每位订阅者按照上述规则进行一次点击,收益最低的公司的收益和收益最高的公司的收益。

压缩版

\(n\) 个带权点,每个点有一条出边。不会出现自环和互为出边指向点。要查询的值被称为收益。设和点 \(u\) 直接有边相连(与边的方向无关)的点数为 \(k_u\),点 \(u\) 的权值为 \(v_u\)。则每一个和 \(u\) 直接有边相连的点收益增加 \(\left\lfloor\dfrac {v_u}{k_u+1}\right\rfloor\),对自己贡献 \(v_u-k_u\times\left\lfloor\dfrac {v_u}{k_u+1}\right\rfloor\)。注意每个点只会在每个独立询问时对周围的点有收益贡献,收益不会保留到下次询问继续累加,而是会清空。三种操作:

  1. 1 x y 修改点 \(x\) 的出边指向点为 \(y\)。
  2. 2 x 查询点 \(x\) 的收益。
  3. 3 查询所有点中的最小收益和最大收益。

思路

暴力怎么做?修改时暴力修改对周围所有点的贡献,查询时直接输出或枚举所有点求最值。修改最劣 \(O(n)\)。

仔细考虑,发现这个 \(O(n)\) 来自于该点连接的边数,而边数是 \(O(n)\) 级别的。也就是说,随机下均摊是 \(O(1)\) 级别的。那我们有没有方法可以平衡复杂度呢?

要做到严格 \(O(1)\),可以想到要强制某点修改时只对相连的边中 \(O(1)\) 条边进行操作,其他的部分在查询时另行 \(O(1)\) 查询。

这时我们就发现每个点只有一条出边,看作基环树就可以理解为每个点只有一个父亲。那么我们就强制他只处理对其父亲的贡献,而对儿子的贡献等查询儿子时再计算。这样一来,每个点只有一个父亲则修改父亲 \(O(1)\),查询时也只需要加上父亲的贡献。这下就 \(O(n)\) 解决前两个操作了。(很多大佬能一眼看出这是个经典 trick:所有相连点都会造成贡献时,儿子的贡献和父亲的贡献分开计算。)

如何处理 3 操作?暴力开 set 维护或者暴力扫维护都不可行,怎么办?回到上面的思路,我们只计算儿子对自己的贡献可以做到 \(O(1)\) 修改。可是我们不能只看儿子贡献啊?每个点的父亲贡献不同,所以不能单纯用儿子贡献做关键字存 set。考虑到一个点的所有儿子的父亲贡献相等,则自然而然想到将该点的儿子们的信息维护在该点的 set 中。那么我们只需把该点的 set 的最大最小取出,加上该点对儿子的贡献丢进全局 set,就能做到 \(O(q\log n)\) 了。常数较大。

实现

注意到 \(n\) 比较小,时间充裕,我们以防万一,也为了代码简洁,维护最大最小值时,可以先把有关点的 set 中放入全局 set 中的元素删除,修改了该点的 set 后再取最大最小值放入全局 set 中。善于使用函数的话,可以写的比较简洁。

core code:

int n,m;
LL v[N+10],ic[N+10]; //value and income 权值与来自儿子的收益
int fa[N+10],sc[N+10]; //父亲与儿子数
multiset<LL> ch[N+10],mm; //每个点的儿子 set 与全局 set inline void Addm(int u){ //将点 u 的 set 取最大最小值加上 u 对其贡献放入全局 set 中
if(sc[u]){
mm.insert(*ch[u].begin()+v[u]/(sc[u]+2));
if(sc[u]>1)
mm.insert(*--ch[u].end()+v[u]/(sc[u]+2));
}
} inline void Delm(int u){ //同上函数,但是是删除
if(sc[u]){
mm.erase(mm.find(*ch[u].begin()+v[u]/(sc[u]+2)));
if(sc[u]>1)
mm.erase(mm.find(*--ch[u].end()+v[u]/(sc[u]+2)));
}
} inline void Change(int u,LL x){ //修改一个点的来自儿子的收益
int f=fa[u];
Delm(f);
ch[f].erase(ch[f].find(ic[u]));
ic[u]+=x;
ch[f].insert(ic[u]);
Addm(f);
} inline void Del(int u){ //断开 u 到父亲的边
int f=fa[u];
Delm(f);
ch[f].erase(ch[f].find(ic[u]));
Change(fa[f],v[f]/(sc[f]+1)-v[f]/(sc[f]+2));
Change(f,(sc[f]+1)*(v[f]/(sc[f]+2))-sc[f]*(v[f]/(sc[f]+1))-v[u]/(sc[u]+2));
--sc[f];
fa[u]=0;
Addm(f);
} inline void Link(int u,int f){ //连接 u 到 f 的边,内容与上函数类似,相反而已
Delm(f);
fa[u]=f;
++sc[f];
Change(f,v[u]/(sc[u]+2)-(sc[f]+1)*(v[f]/(sc[f]+2))+sc[f]*(v[f]/(sc[f]+1)));
Change(fa[f],v[f]/(sc[f]+2)-v[f]/(sc[f]+1));
ch[f].insert(ic[u]);
Addm(f);
} int main(){
n=Read(),m=Read();
for(int i=1;i<=n;++i)
v[i]=Read();
for(int i=1;i<=n;++i)
++sc[fa[i]=Read()];
for(int i=1;i<=n;++i)
ic[fa[i]]+=v[i]/(sc[i]+2),ic[i]+=v[i]-(sc[i]+1)*(v[i]/(sc[i]+2));
for(int i=1;i<=n;++i)
ch[fa[i]].insert(ic[i]);
for(int i=1;i<=n;++i)
Addm(i);
++m;
while(--m){
int op=Read();
if(op==1){
int x=Read(),y=Read();
Del(x);
Link(x,y);
}
else if(op==2){
int x=Read();
printf("%lld\n",ic[x]+v[fa[x]]/(sc[fa[x]]+2));
}
else
printf("%lld %lld\n",*mm.begin(),*--mm.end());
}
return 0;
}

题解[CF674D]Bearish_Fanpages的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 华为云服务器8000通道映射到本地,本地浏览器访问jupyter

    首先你得有个华为云服务器(这不是废话) 第二你得开放它的端口(重点) 第三打开本地cmd 输入ssh -L [客户端IP或省略]:[客户端端口]:[服务器IP]:[服务器端口] [登陆服务器的用户名] ...

  2. vulnhub靶场之MOMENTUM: 2

    准备: 攻击机:虚拟机kali.本机win10. 靶机:Momentum: 2,下载地址:https://download.vulnhub.com/momentum/Momentum2.ova,下载后 ...

  3. requests进行webdriver协议,模仿selenium

    准备工作 你在做下面的练习之前应该具备 安装好chrome,并通过chrome://version确认其版本号 安装chromedriver并与你的chrome版本相匹配,下载路径如下 https:/ ...

  4. 记一次失败的StackOverflow回答

    有一位同学在StackOverflow上提问,他想创建一个 Future 类,异步的实现 Future 的构造,当构造完成之后自动调用 .then 方法,执行后面的逻辑 class Features ...

  5. wsl2 使用串口/usb

    wsl2串口 搜了几个方案,都不合适 网上很多人说wsl可以直接使用win的串口,com* 就对应 /dev/ttyS* 实际上这是wsl1的,wsl2官方明确表示不支持了 CH340 介绍 CH34 ...

  6. 详解Redisson分布式限流的实现原理

    摘要:本文将详细介绍下RRateLimiter的具体使用方式.实现原理还有一些注意事项. 本文分享自华为云社区<详解Redisson分布式限流的实现原理>,作者: xindoo. 我们目前 ...

  7. STM32F4跳转函数

    JMP2APP void JMP2APP(void) { pFunction Jump_To_Application; uint32_t JumpAddress; if (((*(__IO uint3 ...

  8. 3 .NET Core笔试题

    1.什么是ASP.NET Core? 2.ASP.NET Core 中AOP的支持有哪些? 3.ASP.NET Core Filter的注册方式有哪些? 4.ASP.NET Core Filter如何 ...

  9. 大规模 IoT 边缘容器集群管理的几种架构-1-Rancher+K3s

    前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介 ️Reference: IoT 边缘计算系列文章 Rancher + K3s 简介 Rancher: Kubernetes ...

  10. GeoServer在Linux上源码安装、启动、发布地图服务

    1. 环境准备 笔者此次使用的Linux系统是CentOS 8 ,没错,目前已经停止维护,但就操作而言,和其他Linux发行版大同小异 目前的GeoServer版本是2.21 1.1 Git环境 yu ...