洛谷 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...... 我永远只会有最直 ...
随机推荐
- C++ 智能指针一
/* 智能指针shared_ptr */ #include <iostream> #include <string> #include <memory> //智能指 ...
- 找出相似的图片--C#
请先参考我写到java这章 原理讲解 参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm) ...
- [Hinton] Neural Networks for Machine Learning - Converage
Link: Neural Networks for Machine Learning - 多伦多大学 Link: Hinton的CSC321课程笔记 Ref: 神经网络训练中的Tricks之高效BP ...
- [Node.js] 09 - Connect with Database
简介两个数据库: Node.js 连接 MySQL Node.js 连接 MongoDB Node.js 连接 MySql 导入已有数据库: unsw@unsw-UX303UB$ mysql -u r ...
- 【代码审计】YUNUCMS_v1.0.6 前台反射型XSS跨站脚本漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- linux udev学习
自2.6 核心开始,就可以使用udev 协助管理系统中各设备名称.例如,磁盘设备排序.网卡设备排序等.udev能动态地在/dev 目录里产生自定义的.标识性强的设备文件或设备链接.本文即以红旗Asia ...
- vs2017企业版本安装和序列号
离线包大概下载为19G,可以选择的选择项很多,很不错,安装如下: 安装完成 启动效果 SharePoint插件自带了 离线包(19G) Visual Studio 2017(VS2017) 企业版En ...
- JVM源码分析之栈溢出完全解读
概述 之所以想写这篇文章,其实是因为最近有不少系统出现了栈溢出导致进程crash的问题,并且很隐蔽,根本原因还得借助coredump才能分析出来,于是想从JVM实现的角度来全面分析下栈溢出的这类问题, ...
- golang - channels
如果说goroutine是Go语音程序的并发体的话,那么channels它们之间的通信机制.一个channels是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息 ...
- discuz 忘记安全密码的处理方式 修改pre_common_setting表的数据,
一定要记住不要清空pre_common_setting表的数据,会给你带来烦恼的!!!!!只修改siteuniqueid 这条数据的密码就行!!!! 也可以先用我这条密码系统自动加密后:[DXRGYC ...