「Codeforces 643D」Bearish Fanpages
传送门
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=⌊DiBi⌋,那么 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=1DiEPj。
现在小 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(nlogn)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相关推荐
- 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 ...
- windows系统和linux系统可以使用相同的js代码吗_「React 手册 」在 Windows 下使用 React , 你需要注意这些问题...
大家好,本篇内容,我要和大家聊聊使用 Windows 开发 React ,你需要注意的一些问题.首先说明下,我不是使用 windows 进行开发,因为其配置开发环境来说不是特别方便,我更喜欢 苹果ma ...
- 自己动手,做一款抬头显示的「Todo Hud」
我用过好多款 TodoList 软件,但事情一多总还是丢三落四,原本计划好要做的事情总是安静地躺在某个角落,等我想起来要去扫一眼的时候,都已快「物是人非」... 要是能在桌面上实时显示 TodoLis ...
- 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?
背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...
- 长相酷似小强的小米「铁蛋」机器狗,售价 9999 元,打滚唱跳会空翻
整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 8月10日晚,雷军年度演讲及小米秋季发布会在线上召开,此次发布会足足讲了三个小时,不仅介绍了小米的目前市场状况,还分享了新品以及 ...
- 看过漫改,但你看过「改漫」吗?AI 一键让影视变漫画
作者 | 神经小兮 来源 | HyperAI超神经 头图 | 下载于视觉中国 把影视剧变成漫画,是怎样的一种神操作?来自大连理工大学和香港城市大学的团队,最新提出的 AI 框架,可自动将影视剧转换为漫 ...
- 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」
来源 | HyperAI超神经 这几天,传出 NVIDIA 将以 400 亿 英镑的价格收购 ARM 的消息,不少媒体在争相报道收购进度的同时,也将整起交易的幕后推手 -- 孙正义,放到了聚光灯下. ...
- 揭开「拓扑排序」的神秘面纱
作者 | 小齐本齐 责编 | Carol 来源 | 码农田小齐 Topological sort 又称 Topological order,这个名字有点迷惑性,因为拓扑排序并不是一个纯粹的排序算法,它 ...
- TIOBE 1月编程语言排行榜:C语言再度「C 位」出道,Python惜败
整理 | 屠敏 来源 | CSDN(ID:CSDNnews) [导读]在 2020 年初雪来临之际,TIOBE 官方在最新发布的 1 月编程语言榜单中为我们最终揭开了「 2019 年度编程语言」的神秘 ...
- 编程语言发展70年,用50种不同语言输出「Hello World」
「免费学习 60+ 节公开课,投票页面,点击讲师头像」 作者 | Sylvain Saurel 译者 | 风车云马 责编 | 屠敏 [导读]历经 70 年,不断出现的编程语言为开发者解决了哪些难题?其 ...
最新文章
- windows上安装mysql
- php业务网站资源网,企业创意业务网站模板
- javah导出类的头文件抛出异常——java.lang.IllegalArgumentException: Not a valid class name(原因及解决方法)
- python中文字符串转list
- linux 查看登入记录_无时无刻,用 SimplyBook.me 管理者 App 查看客户预约排程!
- java被电脑阻止怎么办_学电脑,一定要记住的6个常用命令,它能让你快速成为电脑达人...
- Java 项目开发及管理常用工具收集
- 圣诞快乐(祝福的话和音乐盒)
- BZOJ5216 [Lydsy2017省队十连测]公路建设
- 清空上传控件HtmlInputFile的方法
- win32 api应用如何输出日志log Windows程序设计 visualstudio vs无控制台如何输出
- QAC/QAC++静态软件代码测试分析-试用工具
- JavaScript中的时间与日期、正则表达式和Function类型
- HTML实战宝典PDF,《selenium webdriver实战宝典》记
- 安全牛:安全与业务不存在平衡 证明价值是关键
- 前端的扁平化是什么意思
- 关于计算机网络实验心得体会以及两种错误情况
- 【基础算法】试除法求约数(Acwing869题)
- 三星a60android9,三星A605G官方安卓9台湾版固件rom线刷包:BRI-A605GDXU5BSH3
- iOS App 安装包瘦身指南
热门文章
- matlab用图像,Matlab常用图像操作
- openwrt查看flash、RAM、CPU信息【转】
- 财务数字大小写转换函数代码
- Splitter 控件的使用
- 点云分割中Proposal-based Methods与Proposal-free Methods
- Ubuntu Linux 15.04安装 nginx + passenger
- convexHull实现
- app服务器指向dat文件,appdat-系统爱好者
- kkt条件 弱对偶 强对偶_机器学习笔记(8)-对偶关系和KKT条件
- Windows10 pycharm 前进后退快捷键配置