Bzoj P2212 [Poi2011]Tree Rotations | 线段树合并
2024-09-05 09:31:22
通过观察与思考,我们可以发现,交换一个结点的两棵子树,只对这两棵子树内的节点的逆序对个数有影响,对这两棵子树以外的节点是没有影响的。嗯,然后呢?(っ•̀ω•́)っ
然后,我们就可以对于每一个节点的两棵子树,求出其交换前与交换后的两棵子树内的逆序对个数,取最小就好啦!
怎么求啊,不能暴力吧,TLE啊,不会了呀!!! (ノ`⊿´)ノ(掀桌
对了,我们有线段树合并!(o゚▽゚)o
(如果不知道线段树合并是什么可以看这一篇文章哦。)
对于每一个叶节点,我们都可以建一棵权值线段树,然后一步一步合并上来,顺便求出两颗子树交换前和交换后的次数就好了。
一次线段树合并的时间复杂度就是两棵线段树之间重复节点的个数,由于这道题目的特殊性,所以两棵线段树之间重复节点的个数不会太多,总的时间复杂度就是O(nlogn)左右啦!(゚▽゚*)
代码:
#include<iostream>
#include<cstdio>
using namespace std;
//val存储每个节点的值,ls存储每个节点的左儿子编号 ,rs存储每个节点的右儿子编号
int n=0,tot=0,t=0,val[8000000],ls[8000000],rs[8000000];
long long ans=0,anon=0,antw=0;
int builnetre(int l,int r,int x)//建一棵新的线段树
{
val[++tot]=1;
if(l==r) return tot;
int mid=(l+r)>>1,nw=tot;
if(x<=mid) ls[nw]=builnetre(l,mid,x);
else rs[nw]=builnetre(mid+1,r,x);
return nw;
}
int mergtwtre(int l,int r,int x,int y)//合并两棵线段树
{
if(!x||!y) return (!x)?y:x;
if(l==r) { val[++tot]=val[x]+val[y]; return tot; }
int mid=(l+r)>>1,nw=++tot;
anon+=(long long)(val[rs[x]])*val[ls[y]];//anon为不交换的逆序对个数
antw+=(long long)(val[rs[y]])*val[ls[x]];//antw为交换后的逆序对个数
ls[nw]=mergtwtre(l,mid,ls[x],ls[y]);
rs[nw]=mergtwtre(mid+1,r,rs[x],rs[y]);
val[nw]=val[ls[nw]]+val[rs[nw]];
return nw;
}
int worea()
{
scanf("%d",&t);
if(t) return builnetre(1,n,t);
int nw=mergtwtre(1,n,worea(),worea());
ans+=min(anon,antw);//取最小累加
anon=antw=0;//注意:这个赋值语句不能放在合并函数之前,不然它们的值就会在下一层的合并中改变,就无法达到初始化的效果了
return nw;
}
int main()
{
scanf("%d",&n);
worea();
printf("%lld",ans);
return 0;
}
参考文章。
最新文章
- CSS清除浮动
- 斗地主(Noip2015Day1T3)
- block大小和分区最大容量单个文件最大容量的关系
- 如何在CentOS5中增加CentALT的源
- 修改 apache http server 默认站点目录
- *JRebel 热部署
- c语言sizeof用法(32位机)
- 这可能是史上最好的 Java8 新特性 Stream 流教程
- Android Spannable为同一TextView设直不同样式
- direct path read temp的处理方法
- 将xml 写到内存中再已string类型读出来
- js 调用 手机 相机摄像机麦克风
- 关于等效的物理意义 On the Physical Meaning of Equivalence
- react项目开发中遇到的问题
- Java 8新特性之 Nashorn(八恶人-6)
- 3. sklearn的K-Means的使用
- 基础 | batchnorm原理及代码详解
- 第七章&#160;二叉搜索树(b3)BST:删除
- 监控 Linux 系统的 7 个命令行工具
- SpringCloud - 2. 服务注册 和 发现
热门文章
- 使用 VSCode 给STM32配置一个串口 printf 工程
- Jmeter系列(20)- 录制控制器
- 低差异序列 (low-discrepancy sequences)之Hammerysley在半球中采样点方法的介绍
- Gitee自动化部署python脚本
- P7295-[USACO21JAN]Paint by Letters P【平面图欧拉公式】
- Kronecker product
- 你需要知道的MySQL&;InnoDB锁都在这里
- MyBatis实现批量添加
- Java运行时异常与非运行时异常
- redis 5.0.12 install