洛谷 P3521 ROT-Tree Rotations [POI2011] 线段树
正解:线段树合并
解题报告:
今天学了下线段树合并,,,感觉线段树相关的应用什么的还是挺有趣的,今天晚上可能会整理一下$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] 线段树的更多相关文章
- 「POI2011 R2 Day2」Tree Rotations【线段树合并】
题目链接 [BZOJ] [洛谷] [LOJ] 题解 由于是前序遍历,那么讨论一棵树上的逆序对的情况. 两个节点都在左子树上 两个节点都在右子树上 两个节点分别在不同的子树上. 前两种情况其实也可以归结 ...
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
题目链接:BZOJ - 2212 题目分析 子树 x 内的逆序对个数为 :x 左子树内的逆序对个数 + x 右子树内的逆序对个数 + 跨越 x 左子树与右子树的逆序对. 左右子树内部的逆序对与是否交换 ...
- BZOJ 2212 [Poi2011]Tree Rotations(线段树合并)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2212 [题目大意] 给出一棵二叉树,每个叶节点上有一个权值,现在可以任意交换左右儿子, ...
- 【BZOJ2212】[POI2011]Tree Rotations (线段树合并)
题解: 傻逼题 启发式合并线段树里面查$nlog^2$ 线段树合并顺便维护一下$nlogn$ 注意是叶子为n 总结点2n 代码: #include <bits/stdc++.h> usin ...
- bzoj 2212 : [Poi2011]Tree Rotations (线段树合并)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2212 思路:用线段树合并求出交换左右儿子之前之后逆序对的数量,如果数量变小则交换. 实现 ...
- BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】
题目链接 BZOJ2212 题解 一棵子树内的顺序不影响其与其它子树合并时的答案,这一点与归并排序的思想非常相似 所以我们只需单独处理每个节点的两棵子树所产生的最少逆序对即可 只有两种情况,要么正序要 ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
随机推荐
- CEO退休
早上刚来公司就收到群发邮件,说CEO退休了,在公司服务了22年.以后还是会part time做vice chairman.其实在公司也没打过几次照面...就知道是个和善的老人,祝他退休生活幸福! 我的 ...
- 【网络编程】——ne-snmp开发实例1
net-snmp扩展有多种方式,在此只介绍两种——动态库扩展,静态库扩展. 在做net-snmp开发之前,首先确定net-snmp相关的软件是否安装. rpm -qa | grep snmp net- ...
- 初试 Kubernetes 集群中使用 Traefik 反向代理
初试 Kubernetes 集群中使用 Traefik 反向代理 2017年11月17日 09:47:20 哎_小羊_168 阅读数:12308 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- debian系列下c++调用mysql, linux下面安装mysql.h文件
mysql.h的报错还没有解决,你们不用看了,等我解决了吧还不知道什么时候 先用c吧 #include <stdio.h> #include <stdlib.h> #inclu ...
- [Python] 06 - Modules --> Packages
故事背景 一.阶级关系 1. Programs are composed of modules.2. Modules contain statements.3. Statements contain ...
- 解决在antd中使用 autoprefixer 9.4.5 会抛出错误 Replace text-decoration-skip: ink to text-decoration-skip-ink: auto, because spec had been changed 的问题
其实这个和antd的版本有关系,只需要把antd的版本升级到3.12.4就可以了 yarn add antd@ --save 记得重新运行一下项目
- mysql连接时提示错误太多的解决
mysqladmin flush-hosts -uroot -p -h127.0.0.1 -P3306 然后输入密码就可以了
- HTML5实现本地JSON文件的读写
参考: 使用HTML5来实现本地文件读取和写入 (FileReader读取json文件,FileSaver.js保存json文件) w3school <input>标签 FileRead ...
- day_6.5 py
Wireshark的使用 2018-6-5 20:16:05 明天学 03
- 隐藏响应的server,X-Powered-By
隐藏X-Powered-By 修改 php.ini 文件 设置 expose_php = Off apache 隐藏 server 修改httpd.conf 设置 ServerSignature Of ...