[POI2011]ROT-Tree Rotations 题解
这道题咋看都是无法从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 题解的更多相关文章
- BZOJ2212: [Poi2011]Tree Rotations
2212: [Poi2011]Tree Rotations Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 391 Solved: 127[Submi ...
- 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并
[BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...
- BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...
- 2212: [Poi2011]Tree Rotations
2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...
- POI2011 Tree Rotations
POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...
- [bzoj3702/2212][Poi2011]二叉树/Tree Rotations_线段树
二叉树 Tree Rotations bzoj-3702 bzoj-2212 Poi-2011 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节点,满足 ...
- bzoj 2212 Tree Rotations
bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...
- 线段树合并(【POI2011】ROT-Tree Rotations)
线段树合并([POI2011]ROT-Tree Rotations) 题意 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有nn个叶子节点,满足这些权值为1-n1-n的一个 ...
- 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并
原文地址:http://www.cnblogs.com/GXZlegend/p/6826614.html 题目描述 Byteasar the gardener is growing a rare tr ...
- bzoj2212/3702 [Poi2011]Tree Rotations 线段树合并
Description Byteasar the gardener is growing a rare tree called Rotatus Informatikus. It has some in ...
随机推荐
- bbs-admin-自定义admin(一)
自定义admin 概要:django-admin本质就是一个app,只是Django内部分装了,因此我们尝试自己设计一个简易版的admin 设计前知识补充: model._meta.app_label ...
- 【redis 学习系列08】Redis小功能大用处02 Pipeline、事务与Lua
3.Pipeline 3.1 Pipeline概念 Redis客户端执行一条命令分为如下四个过程: (1)发送命令 (2)命令排队 (3)命令执行 (4)返回结果 其中(1)和(4)称为Round T ...
- 01 关于jupyter的环境安装
jupyter notebook环境安装 一.什么是Jupyter Notebook? 1. 简介 Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过程计算:开发 ...
- IDEA出现Could not autowire. No beans of 'xxx' type found.解决
Plan A File → Project Structure... Facets → Spring → 右键删除即可 Plan B File → Settings → Editor → Inspec ...
- SpringCloud-Config通过Java访问URL对敏感词加密解密
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- L1-049 天梯赛座位分配 (20 分)
L1-049 天梯赛座位分配 (20 分)(Java解法) 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情.为此我们制定如下策略:假设某赛场有 N 所 ...
- mysql连表操作是先连表还是先查询条件
mysql连表操作是先连表还是先查询条件 一.总结 一句话总结: 连表操作时:先根据查询条件和查询字段确定驱动表,确定驱动表之后就可以开始连表操作了,然后再在缓存结果中根据查询条件找符合条件的数据 1 ...
- storm java.io.NotSerializableException
今天编写一个storm的topology,bolt的逻辑跟之前的类似. 为了减少重复代码,我建了个抽象基类,存放bolt的公共逻辑,设计了几个abstract方法,不同的逻辑部分由子类实现. 基类日志 ...
- python查找鞍点
问题:对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行.列坐标,坐标从1开始). 提示:鞍点的特点:列上最小,行上最大. 思路:求出每一行的最大值,将行号.列号.值存入列表中 ...
- linux下如何基于已有容器创建image并运行?
1. 通过docker ps命令先找到容器id,示例如下,123456789012就是我们要找的 jello@~$ docker ps CONTAINER ID IMAGE COMMAND CREAT ...