P3521-[POI2011]ROT-Tree【线段树合并】
正题
题目链接:https://www.luogu.com.cn/problem/P3521
题目大意
一棵二叉树,叶子节点有权值,对于每个非叶子节点可以选择交换左右节点,求最后遍历出来的叶子节点权值逆序对最少。
解题思路
十分显然一个节点是否交换是不影响该节点子树之外的逆序对数量的,所以如果更优直接交换就好了。
所以我们开始对于每个叶子节点维护一个线段树,然后每次将两棵线段树合并,顺便在合并的时候统计一下交换优还是不交换优。
时间复杂度O(nlogn)O(n\log n)O(nlogn)
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=200000;
ll n,ans1,ans2,ans;
struct Seq_Tree{#define ls t[x][0]#define rs t[x][1]ll t[N*30][2],val[N*30],cnt;ll Ask(ll x,ll l,ll r,ll L,ll R){if(!x) return 0;if(l==L&&r==R){return val[x];}ll mid=(L+R)/2;if(r<=R) return Ask(ls,l,r,L,mid);if(l>L) return Ask(rs,l,r,mid+1,R);return Ask(ls,l,mid,L,mid)+Ask(rs,mid+1,r,mid+1,R);}void Change(ll &x,ll pos,ll L,ll R){if(!x) x=++cnt;if(L==R){val[x]++;return;}ll mid=(L+R)/2;if(pos<=mid) Change(ls,pos,L,mid);else Change(rs,pos,mid+1,R);val[x]=val[ls]+val[rs];return;}ll Merge(ll x,ll y,ll L,ll R){if(!x||!y) return x+y;ans1+=val[rs]*val[t[y][0]];ans2+=val[ls]*val[t[y][1]];val[x]=val[x]+val[y];if(L==R) return x;ll mid=(L+R)/2;ls=Merge(ls,t[y][0],L,mid);rs=Merge(rs,t[y][1],mid+1,R);return x;}#undef ls#undef rs
}T;
void dfs(ll &x){ll op;scanf("%lld",&op);if(!op){ll ls=0,rs=0;dfs(ls);dfs(rs);ans1=ans2=0;x=T.Merge(ls,rs,1,n);ans+=min(ans1,ans2);}else T.Change(x,op,1,n);return;
}
int main()
{scanf("%lld",&n);ll op=0;dfs(op);printf("%lld",ans);return 0;
}
P3521-[POI2011]ROT-Tree【线段树合并】相关推荐
- [Poi2011]Tree Rotations线段树合并
整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权 merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2 ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf
文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...
- 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...
- 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)
题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...
- P6847-[CEOI2019]Magic Tree【dp,线段树合并】
正题 题目链接:https://www.luogu.com.cn/problem/P6847 题目大意 nnn个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在did_idi时刻这个 ...
- 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解
题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...
- 【BZOJ-3681】Arietta 网络流 + 线段树合并
3681: Arietta Time Limit: 20 Sec Memory Limit: 64 MB Submit: 182 Solved: 70 [Submit][Status][Discu ...
- [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)
题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...
- hdu 5511 Minimum Cut-Cut——分类讨论思想+线段树合并
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5511 题意:割一些边使得无向图变成不连通的,并且恰好割了两条给定生成树上的边.满足非树边两段一定在给定生成 ...
最新文章
- 某女程序员吐槽自己被男同事集体排挤!一个人吃饭,一个人敲代码!深深感觉到世界的恶意!...
- 举重若轻的人人车移动端数据平台
- c++将引用作为函数的参数---6
- 精讲Java NIO
- 关系数据库模式和完整性约束相关概念
- js里面拼接代码和使用ModelAndView
- 【Python】pysnooper模块对代码进行调试
- 实现灵活的IT架构的三个要点
- 里计算两个数的总和_发动机排量怎样计算?懂这个的修理工真嘀很少!
- [Unity] 在协程中等待指定的毫秒
- Java编程的11个特点
- VoIP服务器Asterisk安装及部署
- 把ts自动合并 下载网页视频并自动合成视频
- php 会议室预定系统,MRBS开源会议室预订系统安装
- linux 如何获取最高权限 设定
- matlab中Folder是什么意思,matlab – @folder和文件夹
- 中国IT领袖峰会青年领袖论坛:新老交锋同台对话
- 域名解析软件SwitchHosts的安装与使用
- card样式 layui_layui后台模板
- 2016 年度开源中国新增开源软件排行榜 TOP 100
热门文章
- 未发现android设备,Brother iPrintScan 应用程序上出现错误信息“未发现支持设备”(Android™ 智能手机)。...
- python大型项目中的日志模块_Python中日志模块的使用
- java转python推荐算法_java和python实现一个加权SlopeOne推荐算法
- int函数在Oracle,vb中int是什么意思 ?
- mysql查询语句不返回_PHP-CI MySQL查询联接表,并且where语句不返回所...
- 关于导入c3p0-0.9.5.5.jar包引发NoClassDefFoundError、ClassNotFoundException
- qt 实现html 编辑器,基于QT的HTML编辑器的设计与实现.doc
- LeetCode 04检查平衡性-简单
- [信息学奥赛一本通-T1620]质因数分解-数论
- 高等数学上-赵立军-北京大学出版社-题解-练习4.5