题面

这道题咋看都是无法从dp入手,那么就从数据结构入手!;

首先你要会权值线段树和线段树合并。

然后你要知道:

对于任意一个节点,交换左右子树对当前节点和前面的所有节点没有影响

因为这是前序遍历:根节点->左子树->右子树。可以看到,交换左右子树对前面的节点无影响

我们清楚,交换子树只会对该逆序对横跨左右子树这种情况产生影响。因此,我们只需要在合并线段树的过程中统计交换子树的逆序对个数ans1和不交换子树的逆序对个数ans1,取 min(ans1,ans2) 累加到答案中就行了。

每一次合并线段树时,递归到除了叶节点的所有节点,都要累加逆序对个数u,v

需要注意,我们能够这样计算是因为无论左右儿子怎么交换,影响的都只有当前部分的逆序对个数,而不会影响深度更浅的节点的值。

注意要回收内存,否则会MLE

#include <bits/stdc++.h>
#define inc(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
int n;
class node{
public:
long long lson,rson,sum;
}tree[200010*13];
long long ans1,ans2;
int now=0;
int merge(int x,int y,int l,int r){
if(!x) return y;
if(!y) return x;
if(l==r){
tree[x].sum+=tree[y].sum;
return x;
}
ans1+=tree[tree[x].rson].sum*tree[tree[y].lson].sum;
ans2+=tree[tree[x].lson].sum*tree[tree[y].rson].sum;
int mid=(l+r)>>1;
tree[x].lson=merge(tree[x].lson,tree[y].lson,l,mid);
tree[x].rson=merge(tree[x].rson,tree[y].rson,mid+1,r);
tree[x].sum=(tree[tree[x].lson].sum+tree[tree[x].rson].sum);
return x;
}
int build(int l,int r,int goal){
int pos=++now;
tree[pos].sum++;
if(l==r) return pos;
int mid=(l+r)>>1;
if(goal<=mid){
tree[pos].lson=build(l,mid,goal);
}
else{
tree[pos].rson=build(mid+1,r,goal);
}
return pos;
}
long long ans=0;
int read()
{
int pos,v;
scanf("%d",&v);
if(v==0){
int lson=read(),rson=read();
ans1=0; ans2=0;
pos=merge(lson,rson,1,n);
ans+=min(ans1,ans2);
}
else{
return pos=build(1,n,v);
}
return pos;
}
int main()
{
scanf("%d",&n);
read();
cout<<ans;
}

[POI2011]ROT-Tree Rotations 题解的更多相关文章

  1. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  2. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  3. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

  4. 2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...

  5. POI2011 Tree Rotations

    POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...

  6. [bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树

    二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足 ...

  7. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  8. 线段树合并(【POI2011】ROT-Tree Rotations)

    线段树合并([POI2011]ROT-Tree Rotations) 题意 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有nn个叶子节点,满足这些权值为1-n1-n的一个 ...

  9. 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并

    原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...

  10. bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并

    Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...

随机推荐

  1. 【CUDA 基础】6.0 流和并发

    title: [CUDA 基础]6.0 流和并发 categories: - CUDA - Freshman tags: - 流 - 事件 - 网格级并行 - 同步机制 - NVVP toc: tru ...

  2. wait()函数

    wait()函数:回收僵尸进程 父进程调用wait函数可以回收子进程终止信息.该函数有三个功能: 1) 阻塞等待子进程退出 2) 回收子进程残留资源 3) 获取子进程结束状态(退出原因) /*** z ...

  3. 理解urllib、urllib2及requests区别及运用

    urllib and urllib2 区别 –博主提示:下面的是python2中的用法,python3需要做出相应修改. urllib和urllib2模块都做与请求URL相关的操作,但他们提供不同的功 ...

  4. Android webView加载图片显示过大的问题

    webview的基本使用流程这里我就不重复说明了,本篇针对的是文章详情加载完成后出现的情况,这里我们使用的方法是:通过js脚本,重置img标签中图片的宽度和高度. 使用步骤: 1.此方法需要使用js, ...

  5. 20175227张雪莹 2018-2019-2 《Java程序设计》第十一周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第十一周学习总结 教材学习内容总结 第十三章 Java网络编程 URL类 一个URL对象通常包含最基本的三部分信息:协议 ...

  6. RHEL防火墙命令

    firewall-cmd --state 查看防火墙状态 firewall-cmd --reload #重启firewall systemctl stop firewalld.service #停止f ...

  7. 使用 PM2 将 Node.js 的集群变得更加容易

    介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...

  8. css3_1

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 数据中心网络架构的问题与演进 — NFV

    目录 文章目录 目录 前文列表 前言 NFV NFV 的最终目标 NFV 的抽象框架 基础架构层与虚拟基础设施管理层 资源管理与业务流程编排层 OSS 层 SDN 控制层 NFV 的生态合作 NFV ...

  10. 问题root@localhost's password:localhost:permission denied,please try again

    转载:https://www.cnblogs.com/hmy-blog/p/6500909.html 经过试验,上述方法在我的电脑中没有成功. 1.安装 open ssh:sudo apt-get i ...