传送门


problem

小 A 所在的地区有 nnn 个点,标号为 1∼n1 ∼ n1∼n。每个节点都连出去恰好一条有向边,设 iii 连出去的点是 AiA_iAi​。保证 Ai≠iA_i \ne iAi​​=i 且 AAi≠iA_{A_i} \ne iAAi​​​=i。

每个点上有一些糖果,第 iii 个节点上的糖果数量为 BiB_iBi​,小 A 定义一个节点的稠密度为 CiC_iCi​,CiC_iCi​ 求法如下:

假设和 iii 距离不超过 111 的点有 DiD_iDi​ 个(包括 iii 连出去的点、连向 iii 的点以及 iii 自己),分别是 P1,P2,...PDiP_1, P_2, ...P_{D_i}P1​,P2​,...PDi​​。

设 Ei=⌊BiDi⌋E_i = ⌊\frac {B_i}{D_i}⌋Ei​=⌊Di​Bi​​⌋,那么 Ci=Bi−Di×Ei+∑j=1DiEPjC_i = B_i-D_i\times E_i+\sum_{j=1}^{D_i}E_{P_j}Ci​=Bi​−Di​×Ei​+∑j=1Di​​EPj​​。

现在小 A 想让你实现一个糖果稠密度分析仪,要支持三种操作:

  • 111 iii jjj:表示把 iii 的出边改为 jjj,即令 Ai=jAi = jAi=j,保证 j≠ij \ne ij​=i 且 Aj≠iA_j \ne iAj​​=i。
  • 222 iii:表示询问 iii 点的稠密度,即你需要输出 CiC_iCi​。
  • 333:询问所有节点中,CiC_iCi​ 的最小值和最大值。

数据范围:3≤n≤1053 ≤ n ≤ 10^53≤n≤105,1≤q≤1051 ≤ q ≤ 10^51≤q≤105,1≤Bi≤10121 ≤ B_i ≤ 10^{12}1≤Bi​≤1012,1≤Ai≤n1 ≤ A_i ≤ n1≤Ai​≤n。


solution

感觉这道题想通了就不算很难了,主要是代码细节问题。

把 CiC_iCi​ 中 AiA_iAi​ 的贡献与其他点的贡献分开,即我们先不考虑 AiA_iAi​,最后加上EAiE_{A_i}EAi​​。

记集合 soni={Cj∣Aj=i}son_i=\{C_j \mid A_j=i\}soni​={Cj​∣Aj​=i}(注意这里的 CjC_jCj​ 也是不考虑 EAjE_{A_j}EAj​​ 的)。对每个点都维护一个这样的集合,然后把 Ei+max{soni}E_i+max\{son_i\}Ei​+max{soni​} 和 Ei+min{soni}E_i+min\{son_i\}Ei​+min{soni​} 丢到全局的集合,最后全局集合的最大最小值就是 333 的答案。

对于 222,答案也就是 Cx+EAxC_x+E_{A_x}Cx​+EAx​​。

那么对于 111 的修改,考虑会有这些东西的更改:

  • iii 点的 AAA 值。
  • 原 AiA_iAi​ 点的 C,D,EC,D,EC,D,E 值和 sonsonson 集合。
  • AAiA_{A_i}AAi​​ 点的 CCC 值和 sonsonson 集合。
  • AAAiA_{A_{A_i}}AAAi​​​ 点的 sonsonson 集合。
  • jjj 点的 C,D,EC,D,EC,D,E 值和 sonsonson 集合。
  • AjA_jAj​ 的 CCC 值和 sonsonson 集合。
  • AAjA_{A_j}AAj​​ 的 sonsonson 集合。

这些其实在草稿纸上好好推一推就可以得到,具体怎么改根据公式也很容易推出。

时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)。


code

#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
int n,q;
ll A[N],B[N],C[N],D[N],E[N];
multiset<ll>son[N],Ans;
void Insert(int x){if(!son[x].empty()){Ans.insert(E[x]+*son[x].begin());Ans.insert(E[x]+*son[x].rbegin());}
}
void Delete(int x){if(!son[x].empty()){Ans.erase(Ans.find(E[x]+*son[x].begin()));Ans.erase(Ans.find(E[x]+*son[x].rbegin()));}
}
void ins(int fa,int x)  {son[fa].insert(C[x]);}
void del(int fa,int x)  {son[fa].erase(son[fa].find(C[x]));}
void Modify(int i,int j){int x=A[i],y=A[x],z=A[y];Delete(x),Delete(y),Delete(z);del(z,y),del(y,x),del(x,i);C[y]-=E[x],C[x]-=E[i]-E[x]*(D[x]-1);--D[x],E[x]=B[x]/D[x];C[y]+=E[x],C[x]-=E[x]*(D[x]-1);ins(y,x),ins(z,y);Insert(x),Insert(y),Insert(z);A[i]=j,x=A[j],y=A[x];Delete(j),Delete(x),Delete(y);del(y,x),del(x,j);C[x]-=E[j],C[j]+=E[j]*(D[j]-1);++D[j],E[j]=B[j]/D[j];C[x]+=E[j],C[j]-=E[j]*(D[j]-1)-E[i];ins(j,i),ins(x,j),ins(y,x);Insert(j),Insert(x),Insert(y);
}
int main(){scanf("%d%d",&n,&q);for(int i=1;i<=n;++i)  scanf("%lld",&B[i]),D[i]=2;for(int i=1;i<=n;++i)  scanf("%lld",&A[i]),D[A[i]]++;for(int i=1;i<=n;++i)  E[i]=B[i]/D[i];for(int i=1;i<=n;++i)  C[i]+=B[i]-E[i]*(D[i]-1),C[A[i]]+=E[i];for(int i=1;i<=n;++i)  ins(A[i],i);for(int i=1;i<=n;++i)  Insert(i);int op,x,y;while(q--){scanf("%d",&op);if(op==1)  scanf("%d%d",&x,&y),Modify(x,y);else  if(op==2)  scanf("%d",&x),printf("%lld\n",C[x]+E[A[x]]);else  printf("%lld %lld\n",*Ans.begin(),*Ans.rbegin());}return 0;
}

「Codeforces 643D」Bearish Fanpages相关推荐

  1. loj2058 「TJOI / HEOI2016」求和 NTT

    loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...

  2. windows系统和linux系统可以使用相同的js代码吗_「React 手册 」在 Windows 下使用 React , 你需要注意这些问题...

    大家好,本篇内容,我要和大家聊聊使用 Windows 开发 React ,你需要注意的一些问题.首先说明下,我不是使用 windows 进行开发,因为其配置开发环境来说不是特别方便,我更喜欢 苹果ma ...

  3. 自己动手,做一款抬头显示的「Todo Hud」

    我用过好多款 TodoList 软件,但事情一多总还是丢三落四,原本计划好要做的事情总是安静地躺在某个角落,等我想起来要去扫一眼的时候,都已快「物是人非」... 要是能在桌面上实时显示 TodoLis ...

  4. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?

    背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...

  5. 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...

  6. 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画

    作者 | 神经小兮 来源 | HyperAI超神经 头图 | 下载于视觉中国 把影视剧变成漫画,是怎样的一种神操作?来自大连理工大学和香港城市大学的团队,最新提出的 AI 框架,可自动将影视剧转换为漫 ...

  7. 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」

    来源 | HyperAI超神经 这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 -- 孙正义,放到了聚光灯下. ...

  8. 揭开「拓扑排序」的神秘面纱

    作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...

  9. TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败

    整理 | 屠敏 来源 | CSDN(ID:CSDNnews) [导读]在 2020 年初雪来临之际,TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘 ...

  10. 编程语言发展70年,用50种不同语言输出「Hello World」

    「免费学习 60+ 节公开课,投票页面,点击讲师头像」 作者 | Sylvain Saurel 译者 | 风车云马 责编 | 屠敏 [导读]历经 70 年,不断出现的编程语言为开发者解决了哪些难题?其 ...

最新文章

  1. windows上安装mysql
  2. php业务网站资源网,企业创意业务网站模板
  3. javah导出类的头文件抛出异常——java.lang.IllegalArgumentException: Not a valid class name(原因及解决方法)
  4. python中文字符串转list
  5. linux 查看登入记录_无时无刻,用 SimplyBook.me 管理者 App 查看客户预约排程!
  6. java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...
  7. Java 项目开发及管理常用工具收集
  8. 圣诞快乐(祝福的话和音乐盒)
  9. BZOJ5216 [Lydsy2017省队十连测]公路建设
  10. 清空上传控件HtmlInputFile的方法
  11. win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出
  12. QAC/QAC++静态软件代码测试分析-试用工具
  13. JavaScript中的时间与日期、正则表达式和Function类型
  14. HTML实战宝典PDF,《selenium webdriver实战宝典》记
  15. 安全牛:安全与业务不存在平衡 证明价值是关键
  16. 前端的扁平化是什么意思
  17. 关于计算机网络实验心得体会以及两种错误情况
  18. 【基础算法】试除法求约数(Acwing869题)
  19. 三星a60android9,三星A605G官方安卓9台湾版固件rom线刷包:BRI-A605GDXU5BSH3
  20. iOS App 安装包瘦身指南

热门文章

  1. matlab用图像,Matlab常用图像操作
  2. openwrt查看flash、RAM、CPU信息【转】
  3. 财务数字大小写转换函数代码
  4. Splitter 控件的使用
  5. 点云分割中Proposal-based Methods与Proposal-free Methods
  6. Ubuntu Linux 15.04安装 nginx + passenger
  7. convexHull实现
  8. app服务器指向dat文件,appdat-系统爱好者
  9. kkt条件 弱对偶 强对偶_机器学习笔记(8)-对偶关系和KKT条件
  10. Windows10 pycharm 前进后退快捷键配置