[atAGC023F]01 on Tree
对每一个节点维护一个序列,初始即自己(长度为1),并记$a_{i}$和$b_{i}$分别为第$i$个点序列上0和1的个数(也需要存储具体的序列)
考虑$\frac{b_{i}}{a_{i}}$最小中最深的非根节点(全局),其必然在其父亲之后选择,那么不妨将其与父亲合并,并将其的序列加入到父亲末尾(启发式合并)并利用$a_{i}$和$b_{i}$即可统计逆序对数量
(特别的,为了避免$a_{i}=0$,可以写成$\frac{b_{i}}{a_{i}+b_{i}}$)
另外,合并需要两个并查集,分别维护深度最小的点以及位置,以及set去找到$\frac{b_{i}}{a_{i}}$最小的点

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 set<pair<double,int> >s;
5 deque<int>v[N];
6 int n,x,fa[N],f[N],pos[N],sum[N][2];
7 long long ans;
8 int find(int k){
9 if (k==f[k])return k;
10 return f[k]=find(f[k]);
11 }
12 double calc(int k){
13 return 1.0*sum[k][1]/(sum[k][0]+sum[k][1]);
14 }
15 pair<double,int> get(int k){
16 return make_pair(calc(pos[find(k)]),k);
17 }
18 void merge(int x,int y){
19 x=find(x),y=find(y);
20 f[y]=x;
21 int xx=x;
22 x=pos[x],y=pos[y];
23 deque<int>::iterator it;
24 if (v[x].size()<v[y].size()){
25 while (!v[x].empty()){
26 v[y].push_front(v[x].back());
27 if (v[x].back())ans+=sum[y][0];
28 v[x].pop_back();
29 }
30 sum[y][0]+=sum[x][0];
31 sum[y][1]+=sum[x][1];
32 pos[xx]=y;
33 }
34 else{
35 while (!v[y].empty()){
36 v[x].push_back(v[y].front());
37 if (!v[y].front())ans+=sum[x][1];
38 v[y].pop_front();
39 }
40 sum[x][0]+=sum[y][0];
41 sum[x][1]+=sum[y][1];
42 pos[xx]=x;
43 }
44 }
45 int main(){
46 scanf("%d",&n);
47 for(int i=2;i<=n;i++)scanf("%d",&fa[i]);
48 for(int i=1;i<=n;i++)f[i]=pos[i]=i;
49 for(int i=1;i<=n;i++){
50 scanf("%d",&x);
51 sum[i][x]++;
52 v[i].push_back(x);
53 if (i>1)s.insert(get(i));
54 }
55 for(int i=1;i<n;i++){
56 x=(*s.begin()).second;
57 set<pair<double,int> >::iterator it;
58 s.erase(s.begin());
59 int y=find(fa[x]);
60 if (y!=1)s.erase(get(y));
61 merge(fa[x],x);
62 if (y!=1)s.insert(get(y));
63 }
64 printf("%lld",ans);
65 }
[atAGC023F]01 on Tree的更多相关文章
- 【AtCoder AGC023F】01 on Tree(贪心)
Description 给定一颗 \(n\) 个结点的树,每个点有一个点权 \(v\).点权只可能为 \(0\) 或 \(1\). 现有一个空数列,每次可以向数列尾部添加一个点 \(i\) 的点权 \ ...
- 【luogu AT3957】[AGC023F] 01 on Tree
01 on Tree 题目链接:luogu AT3957 题目大意 有一棵根为 \(1\) 的树,每个节点有个值 \(0\) 或 \(1\). 然后每次你可以把一个没有父亲的点删除,然后把值放进一个数 ...
- AtCoder Grand Contest 023 F - 01 on Tree
Description 题面 Solution HNOI-day2-t2 复制上去,删点东西,即可 \(AC\) #include<bits/stdc++.h> using namespa ...
- SaltStack 架构自动部署 03
架构图 模块化部署 系统模块:系统优化,内核参数,网络参数 功能模块:如:nginx,tomcat, 业务模块: 1.在salt-master端修改配置文件 [root@01 salt]# vim / ...
- Git详解之九:Git内部原理
Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...
- 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一.git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值 ...
- [机器学习]集成学习--bagging、boosting、stacking
集成学习简介 集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务. 如何产生"好而不同"的个体学习器,是集成学习研究的核心. 集成学习的思路是通过 ...
- git内部原理
Git 内部原理 无论是从之前的章节直接跳到本章,还是读完了其余章节一直到这——你都将在本章见识到 Git 的内部工作原理 和实现方式. 我们发现学习这部分内容对于理解 Git 的用途和强大至关重要. ...
- 【AtCoder】AGC023 A-F题解
可以说是第一场AGC了,做了三道题之后还有30min,杠了一下D题发现杠不出来,三题滚粗了 rating起步1300+,感觉还是很菜... 只有三题水平显然以后还会疯狂--啊(CF的惨痛经历) 改题的 ...
随机推荐
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- 微信公众号开发之H5页面跳转到指定的小程序
前言: 最近公司有一个这样的需要,需要从我们在现有的公众号H5页面中加一个跳转到第三方小程序的按钮.之前只知道小程序之间是可以相互跳转的,今天查阅了下微信开发文档原来现在H5网页也支持小程序之间的跳转 ...
- The Data Way Vol.4|开源是创造软件诸多方法中最好的一种形式
关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...
- 生日礼物网页Javascript版本与锚点版本
<style> #dv1{ width:60px; height:36px; margin:0 auto; background-color:orange; display:none; } ...
- UI BLOCK自定义枚举控件的宽度
三步: 1.修改PresentationStyle属性为Radio Box 2.修改NumberOfColumns属性为指定的宽度(显示字符的个数) 3.将PresentationStyle属性改回O ...
- 从零到熟悉,带你掌握Python len() 函数的使用
摘要:本文为你带来如何找到长度内置数据类型的使用len() 使用len()与第三方数据类型 提供用于支持len()与用户定义的类. 本文分享自华为云社区<在 Python 中使用 len() 函 ...
- 【Java虚拟机9】类加载器之命名空间详解
前言 前面介绍类加载器的时候,介绍了一下命名空间这个概念.今天就通过一个例子,来详细了解一下[类加载器的命名空间].然后通过这个例子,我们可以总结一下双亲委托模型的好处与优点. 例1(不删除class ...
- Unity——计时器功能实现
Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...
- 【UE4】类的继承层级关系
- VS2015+OpenCV+Qt
VS2015+OpenCV+Qt 01.OpenCV 下载 进入官网链接: https://opencv.org,下载所需要的版本: 下载完成后直接双击,选择解压路径,解压到响应的文件夹中: 若之后需 ...