正解:线段树合并

解题报告:

传送门!

今天学了下线段树合并,,,感觉线段树相关的应用什么的还是挺有趣的,今天晚上可能会整理一下$QAQ?$

然后直接看这道题

现在考虑对一个节点$nw$,现在已经分别处理出它的$ls$和$rs$的最少逆序对个数了,然后现在考虑要不要交换呢$QAQ$

显然不管$nw$节点的左右子树内部是怎么排列的,他们整体对外部的贡献是不变的,所以我们只要考虑内部的逆序对个数怎么样尽量小$QAQ$

这里就可以考虑对每个节点分别开一个权值线段树,然后逆序对的话可以直接在merge的时候做,树状数组都能有的功能线段树肯定也能有昂$QAQ$

等下放代码$QAQ!$

对了还要说个,就是,它的读入很鬼畜,,,又麻油翻译,,,大概就是说,它是给的一个递归形式的输入,如果是$0$,说明有左右节点,否则为叶子节点

然后这个可以用$dfs$递归读入,而且刚刚好在读入的时候顺便一起做完了$QAQ$

最后夸一下,这题,特别好,它好就好在,,,我我我$RE\&MLE$了七十多次,,,开大点儿就$MLE$小了又会$RE$,,,调了半天发现是我代码中数据类型$int$和$long\ long$的定义有问题$QAQ$

这题动画,唯一要用ll的就是逆序对的个数,其他都不要开昂$QAQ$

然后还有就是,如果有这么一句话:$a=solve();$其中a是个$int$,函数的定义写的返回类型是$ll$,这样写可能就会有一些莫名其妙的后果,所以一定要注意对应$QAQ$!如果$a$是个$int$在定义$solve$的时候一定记得定义成$int$!

没了$QAQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define rg register
#define gc getchar()
#define ll long long int n,nod_cnt;
ll as,ret1,ret2;
struct sgtr{int ls,rs,sz;}tr[]; il int read()
{
rg char ch=gc;rg int x=;rg bool y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
int buildnw(rg int l,rg int r,rg int dat)
{
tr[++nod_cnt].sz=;if(l==r)return nod_cnt;
rg int mid=(l+r)>>,nw=nod_cnt;if(dat<=mid)tr[nod_cnt].ls=buildnw(l,mid,dat);else tr[nod_cnt].rs=buildnw(mid+,r,dat);return nw;
}
int merge(rg int l,rg int r,rg int nw1,rg int nw2)
{
if(!nw1 || !nw2)return nw1+nw2;
if(l==r)return tr[nw1].sz=tr[nw1].sz+tr[nw2].sz,nw1;
rg int mid=(l+r)>>;
ret1+=1ll*tr[tr[nw1].rs].sz*tr[tr[nw2].ls].sz;ret2+=1ll*tr[tr[nw1].ls].sz*tr[tr[nw2].rs].sz;
tr[nw1].ls=merge(l,mid,tr[nw1].ls,tr[nw2].ls);tr[nw1].rs=merge(mid+,r,tr[nw1].rs,tr[nw2].rs);tr[nw1].sz=tr[nw1].sz+tr[nw2].sz;return nw1;
}
int rd()
{
rg int tmp=read();
if(tmp)return buildnw(,n,tmp);
rg int nw=merge(,n,rd(),rd());as+=min(ret1,ret2);ret1=ret2=;return nw;
} int main()
{
n=read();rd();printf("%lld\n",as);
return ;
}

放下代码QAQ

洛谷 P3521 ROT-Tree Rotations [POI2011] 线段树的更多相关文章

  1. 「POI2011 R2 Day2」Tree Rotations【线段树合并】

    题目链接 [BZOJ] [洛谷] [LOJ] 题解 由于是前序遍历,那么讨论一棵树上的逆序对的情况. 两个节点都在左子树上 两个节点都在右子树上 两个节点分别在不同的子树上. 前两种情况其实也可以归结 ...

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

    题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2212 [题目大意] 给出一棵二叉树,每个叶节点上有一个权值,现在可以任意交换左右儿子, ...

  4. 【BZOJ2212】[POI2011]Tree Rotations (线段树合并)

    题解: 傻逼题 启发式合并线段树里面查$nlog^2$ 线段树合并顺便维护一下$nlogn$ 注意是叶子为n 总结点2n 代码: #include <bits/stdc++.h> usin ...

  5. bzoj 2212 : [Poi2011]Tree Rotations (线段树合并)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2212 思路:用线段树合并求出交换左右儿子之前之后逆序对的数量,如果数量变小则交换. 实现 ...

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

    题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...

  7. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  8. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  9. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

随机推荐

  1. java.util.concurrent介绍【转】

    java.util.concurrent介绍   java.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent ...

  2. /proc详解

    内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统. Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件 ...

  3. 用Go语言实现一个简单的聊天机器人

    一.介绍 目的:使用Go语言写一个简单的聊天机器人,复习整合Go语言的语法和基础知识. 软件环境:Go1.9,Goland 2018.1.5. 二.回顾 Go语言基本构成要素:标识符.关键字.字面量. ...

  4. Java如何与Web服务器连接?

    在Java编程中,如何与Web服务器连接? 以下示例演示如何使用net.Socket类的sock.getInetAddress()方法与Web服务器连接. package com.yiibai; im ...

  5. LRU 算法

    LRU算法 很多Cache都支持LRU(Least Recently Used)算法,LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小.也就是说,当限定 ...

  6. 仿迅雷播放器教程 -- 基于ffmpeg的C++播放器 (1)

    2011年12月份的时候发了这篇博客 http://blog.csdn.net/qq316293804/article/details/7107049 ,博文最后说会开源一个播放器,没想到快两年了,才 ...

  7. 127、Universal-Image-Loader解析(转载)(图片加载)

    (一)——ImageLoaderConfiguration的详细配置http://www.cnblogs.com/tianzhijiexian/p/4034215.html (二)——DisplayI ...

  8. redis如何后台启动

    当安装好redis之后,运行redis-server命令之后,显示如图所示: 但是这样没有办法在这个tab下做任何操作了,因为这个时候使用Ctrl+c之后,就变成了这个样子 然后就关闭了,那么我想让r ...

  9. OpenGL——圆公式相关变化的绘制

    #include<iostream> #include <math.h> //旧版本 固定管线 #include<Windows.h> #include <G ...

  10. sklearn中的回归器性能评估方法

    explained_variance_score() mean_absolute_error() mean_squared_error() r2_score() 以上四个函数的相同点: 这些函数都有一 ...