[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的惨痛经历) 改题的 ...
随机推荐
- 关于VS中的无法解析的外部符号问题
利用caffe的源码编译出的caffe.lib静态链接库里面就包含了源码里面的那些函数的接口i,所以如果在程序中使用的是源码的话,就不需要在链接器里面再添加此静态链接库了 对于无法解析的外部符号,首先 ...
- JUC多线程之ThreadPoolExecutor类任务执行流程
ThreadPoolExecutor类: ThreadPoolExecutor是我们最常用的一个线程池类,它实现了AbstractExecutorService接口.首先来看一下它的构造器及相关关键变 ...
- v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码
子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...
- 设置elementUI的table组件滚动条位置
1.设置table的ref为tableList 2.设置滚动至顶部 this.$refs.tableList.bodyWrapper.scrollTop =0; 3.设置滚动至底部 this.$ref ...
- tomcat内存马原理解析及实现
内存马 简介 Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站.应用.但传统的Webshell都是基于文件类型的,黑客 ...
- BUAA 2020 软件工程 结对项目作业
Author: 17373051 郭骏 3.28添加:4.计算模块接口的设计与实现过程部分,PairCore实现的细节 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) ...
- mac上安装lua
一.背景 最近在操作redis的时候,有些时候是需要原子操作的,而redis中支持lua脚本,因此为了以后学习lua,此处记录一下 lua的安装. 二.mac上安装lua 其余的系统上安装lua步骤大 ...
- (二)、Docker 快速入门
文档:https://docs.docker.com/install/linux/docker-ce/centos/ 中文文档:https://docs.docker-cn.com/engine/in ...
- 计算机网络传输层之TCP可靠传输
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105524592 学习课程:<2019王道考研计算机网络> 学习目的 ...
- IPv6(诞生原因、数据报格式、与IPv4的不同、地址表现形式、基本地址类型、IPv6与IPv4的过渡策略)
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105297642 学习课程:<2019王道考研计算机网络> 学习目的 ...