一句话题意(不用我改了.....):给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。

......这题输入很神烦呐。。。

给你一棵二叉树的dfs序(考场上没发现2333),只有叶子结点有值,然后求逆序对大小

在考场上,建树建了好久,然后暴力暴了好久,然后得到了0分的好成绩呢(我真棒)

正解其实也不难想(但是当时不会权值线段树)

题解:

其实很简单,想想:对于一层的逆序对,数量是一定的。也就是说,无论怎么转当前子树,对上一层的逆序对数量是没有影响的。

挺好理解的但是还是上张图吧:

对于第二层来说,无论左边的2,3怎么改变,相对于右边4,1或1,4的逆序对个数始终不会改变。

这个性质吼啊

于是我们只需要求块内的最小逆序对个数就行了。

然后再考虑怎么求逆序对个数。

首先,权值线段树是一个桶,而且下标是有序的(废话)

然后,两课权值线段树在本题中是等价的,也就是说,左右要合并的线段树,除了维护的区间&&存储元素不一样,是满足可并线段树的条件的。

所以,对于一个区间,逆序对只需要比较左区间的右半边(桶中)数量*右区间的左半边就行了,

然后再比较swap之后的,贪心地取下去,合并下去就行了。

.....语言表述有问题,看一下这一小段代码:

ans1+=(ll )t[t[l].rs].sum*t[t[r].ls].sum;
ans2+=(ll )t[t[l].ls].sum*t[t[r].rs].sum;

就这样,比较然后加小的,最后就是总答案了。

tips:真正明白了指针的好处,好好用啊,但是得注意一下,因为指针是直接改值,有些值不能改的话,得用一个中间变量记录。

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
#define ll long long
struct tree
{
int ls,rs,sum;
}t[maxn*];
ll ans=,ans1=,ans2=;
int n,pos;
int cnt=;
void insert(int &x,int l,int r)
{
if(!x)
{
x=++cnt;
}
t[x].sum++;
if(l==r)
{
return ;
}
int mid=(l+r)>>;
if(pos<=mid)
{
insert(t[x].ls,l,mid);
}
else
{
insert(t[x].rs,mid+,r);
}
}
void merge(int &l,int r)//直接指针合并,比原来的要好写
{
if(!l||!r)
{
l=l+r;
return ;
}
t[l].sum+=t[r].sum;
ans1+=(ll )t[t[l].rs].sum*t[t[r].ls].sum;
ans2+=(ll )t[t[l].ls].sum*t[t[r].rs].sum;
merge(t[l].ls,t[r].ls);
merge(t[l].rs,t[r].rs);
}
int work(int &x)
{
int T,ls,rs;
x=;
cin>>T;
if(!T)
{
work(ls);
work(rs);
ans1=ans2=;
x=ls;//指针,得用中间变量存储
merge(x,rs);
ans+=min(ans1,ans2);
}
else
{
pos=T;
insert(x,,n);
}
}
int main()
{
scanf("%d",&n);
int t=;
work(t);
printf("%lld",ans);
return ;
}

(完)

最新文章

  1. Java中用ClassLoader载入各种资源(类、文件、web资源)的方法
  2. 正则表达式获取字符串中的img标签中的url链接
  3. WIN7实现多人远程一台电脑
  4. (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
  5. jquery下拉框实现将左边的选项添加到右边区域
  6. Mvc设计模型与三层架构
  7. 十款优秀的在线JavaScript工具介绍
  8. 微软云平台windows azure入门系列八课程
  9. Unity3d 要点板书
  10. poj 3185 The Water Bowls 高斯消元枚举变元
  11. HDU 4916 树形dp
  12. 移动app安全测试
  13. [转载] java的动态代理机制详解
  14. Android Library projetcts cannot be exported.
  15. Spark高可用集群搭建
  16. poj3358 Period of an Infinite Binary Expansion
  17. path node
  18. Python数据科学“冷门”库
  19. NYOJ 61 传纸条(一)
  20. &lt;基础&gt; PHP 数组操作

热门文章

  1. iOS 设备数据管理工具 iMazing v2.10.3 绿色便携版
  2. BZOJ 1965 [AHOI2005]洗牌
  3. firefox 实用插件推荐和使用
  4. 常见PHP危险函数及特殊函数
  5. Python:的web爬虫实现及原理(BeautifulSoup工具)
  6. [Luogu3868] [TJOI2009]猜数字
  7. Java自动化测试框架-04 - TestNG之Test Method篇 - 道法自然,法力无边(详细教程)
  8. linux+jenkins+postman持续集成
  9. 11.Linux用户特殊权限
  10. sql查询入门