热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LuoguP3521[POI2011]ROTTreeRotations

P3521[POI2011]ROTTreeRotations题目大意:给一棵$(1≤n≤200000)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。我们

P3521 [POI2011]ROT-Tree Rotations

题目大意:

给一棵\((1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少。

我们发现交换两个子树并不会影响某个子树内的逆序对个数,只会对两个子树之间的逆序对产生影响.

所以我们将换与不换的逆序对求出来,取个最小值

将两颗线段树合并就好了

#include
#include
#include
#include
#include
#define LL long long
using namespace std;
const int N = 4e5 + 3;
struct node{
    int sum;
    int lc,rc;  
}a[N * 30];
int root;
int n,t,cnt = 1;
int rt[N];
LL ans1,ans2,ans;
inline int read(){
    int v = 0,c = 1;char ch = getchar();
    while(!isdigit(ch)){
        if(ch == '-') c = -1;
        ch = getchar(); 
    }
    while(isdigit(ch)){
        v = v * 10 + ch - 48;
        ch = getchar(); 
    }
    return v * c;
}
inline void pushup(int u){
    a[u].sum = a[a[u].lc].sum + a[a[u].rc].sum;
}
inline void ins(int &u,int l,int r,int x){
//  printf("%d %d %d\n",l,r,x);
    if(!u) u = ++t; 
    if(l == r){
        a[u].sum++;
        return ;    
    }
    int mid = (l + r) >> 1;
    if(x <= mid) ins(a[u].lc,l,mid,x);
    else ins(a[u].rc,mid + 1,r,x);
    pushup(u);
}
inline void merge(int &u1,int u2,int l,int r){
    if(!u1){u1 = u2;return ;}
    if(!u2) return ;
    if(l == r){
        a[u1].sum += a[u2].sum;
        return ;
    }
    int mid = (l + r) >> 1;
    ans1 += 1ll * a[a[u1].lc].sum * a[a[u2].rc].sum;
    ans2 += 1ll * a[a[u2].lc].sum * a[a[u1].rc].sum;
    merge(a[u1].lc,a[u2].lc,l,mid);
    merge(a[u1].rc,a[u2].rc,mid + 1,r);
    pushup(u1); 
}
inline void solve(int pos){
    int x = read();
    if(!x){
        int lc = ++cnt;solve(lc);
        int rc = ++cnt;solve(rc);
        merge(rt[pos],rt[lc],1,n);
        ans1 = ans2 = 0;
        merge(rt[pos],rt[rc],1,n);
        ans += min(ans1,ans2);
    }
    else{
        ins(rt[pos],1,n,x);
        return ;    
    }
}
int main(){
    n = read();
    solve(1);
    printf("%lld\n",ans);
    return 0;   
}

LuoguP3521 [POI2011]ROT-Tree Rotations


推荐阅读
  • 题目:写一个函数返回参数二进制中1的个数方法1:我自己写的,运用‘%‘和‘‘,感觉挺简单的。intcount_one_bit(intnum){unsignedintcount0;w ... [详细]
  • 网络Cisco考试
    二、操作题(共80分)请将以下拓扑实验配置完毕,保存拓扑,建立一个文本文档,按照交换机-路由器1234的顺序,将每台设备的showrunning-config复制粘贴出来,将文本文 ... [详细]
  • SparkMLlib提供了一些基本的统计学的算法,下面主要说明一下:1、Summarystatistics对于RDD[Vector]类型,SparkMLlib提供了colStats ... [详细]
  • mysql在BTree上创建伪哈希索引
    构建哈希的过程select过程长字符串下,构建索引可通过自定义哈希作为索引,本人通过实验,在3百多个数据记录的下,性能效果很明显,完全不是一个等级.以下为索引前后几种情况对比在哈希 ... [详细]
  • 状压dfs。。。。GemsFight!TimeLimit:2000010000MS(JavaOthers)    MemoryLimit:327680327680K ... [详细]
  • 注意:用心找自己做的项目中自己感觉最拿出来手的(复杂度最高,用的技术最多的项目),描述的时候尽可能往里面添加一些技术名词布局我们用html5+css3我们会用reset.css重置 ... [详细]
  • 对于一些不符合的点来说,肯定是被他的父节点上权值最小的点转换最好。首先我们先排除不可能情况也就是01不等之后发现,交换完两个数后,0不符合的和1不符合的个数各自-1,因此不会影响其 ... [详细]
  • 点击按钮改变多张图片
    点击按钮改变多张图片 ... [详细]
  • Linux DNS
    libnss_files.solibnss_dnslibnss_ldap展现的就是一个配置文件etcnsswitch.conf?查看这个文件这个files就是通过libnss_fi ... [详细]
  • 一、配置大概分三类:通过配置文件配置、通过命令配置、通过图形化的网络连接菜单配置。拨号无线等的没条件实验,不涉及。主要文件:etcnetworkinterfaces,这里是IP、网 ... [详细]
  • Dom捕捉事件和冒泡事件原理与demo测试
    先参考一下百度百科对冒泡事件流的解释:----------不喜欢读文字的同学,可以直接看下面demo,传递顺序简单明了!ht ... [详细]
  • WhatisthisPRfor?AddingMapVisualizationforZeppelinusingLeaflet[1]. ... [详细]
  • Cocos2d android(一个小时学会FlyppyBird开发)
    FlyppyBird游戏在此分四步:1、添加小鸟2、添加地板3、改变小鸟速度4、添加滑块并设置速度那么接下来开始写代码:首先搭建An ... [详细]
  • 打造你爱不释手的编辑器sublime3
    首先去官网下载你的sublime3让后安装好packagecontrol去packagecontrol官网安装好packagecontrol安装emmet,和格式化工具接着安装一个 ... [详细]
  • DDD领域驱动设计和实践(转载)
    --目录导航一、DDD领域驱动设计介绍1.什么是领域驱动设计(DDD)2.领域驱动设计的特点3.如果不使用DDD?4.领域驱动设计的分层架构和构成要素5.事务脚本和领域模型二 ... [详细]
author-avatar
叶子已经不是木头的了
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有