P3521 [POI2011]ROT-Tree Rotations

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

大体给出方式:

第一行一个正整数\(n\),表示该二叉树的叶节点的个数;

下面若干行,每行一个数\(p\):

如果\(p=0\),表示这个节点不是叶节点,递归地向下读入其左孩子和右孩子的信息;

如果\(p \neq 0\) ,表示这个节点是叶节点,权值为\(p\) 。


本来想学一下启发式合并的,结果被一个很神奇的错误卡了很久。。

启发式合并的复杂度没怎么学会,只是大致知道权值线段树的合并和相同的节点数量成正相关,反正把只有一条链的权值线段树都合起来的复杂度是\(O(nlogn)\)的

不过在最后出现了一个神奇的错误

10分:

int dfs()
{
scanf("%d",&k);
if(k) return build(1,n,k);
s1=s2=0;
int now=Merge(dfs(),dfs());
ans+=min(s1,s2);
return now;
}

100分:

int dfs()
{
scanf("%d",&k);
if(k) return build(1,n,k);
int now=Merge(dfs(),dfs());
ans+=min(s1,s2);
s1=s2=0;
return now;
}

注意递归时赋初值该在什么时候搞


Code:

#include <cstdio>
#define ll long long
#define ls ch[now][0]
#define rs ch[now][1]
const int N=200000;
ll min(ll x,ll y){return x<y?x:y;}
int ch[N*25][2],n,k,tot;
ll sum[N*25],ans,s1,s2;
int build(int l,int r,int pos)
{
int now=++tot;
sum[now]++;
if(l==r) return now;
int mid=l+r>>1;
if(pos<=mid)
ls=build(l,mid,pos);
else
rs=build(mid+1,r,pos);
return now;
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
sum[x]+=sum[y];
s1+=sum[ch[x][1]]*sum[ch[y][0]];
s2+=sum[ch[x][0]]*sum[ch[y][1]];
ch[x][0]=Merge(ch[x][0],ch[y][0]);
ch[x][1]=Merge(ch[x][1],ch[y][1]);
return x;
}
int dfs()
{
scanf("%d",&k);
if(k) return build(1,n,k);
int now=Merge(dfs(),dfs());
ans+=min(s1,s2);
s1=s2=0;
return now;
}
int main()
{
scanf("%d",&n);
dfs();
printf("%lld\n",ans);
return 0;
}

2018.7.30

洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告的更多相关文章

  1. 洛谷 P1501 [国家集训队]Tree II 解题报告

    P1501 [国家集训队]Tree II 题目描述 一棵\(n\)个点的树,每个点的初始权值为\(1\).对于这棵树有\(q\)个操作,每个操作为以下四种操作之一: + u v c:将\(u\)到\( ...

  2. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  3. [洛谷P3521][POI2011]ROT-Tree Rotations

    题目大意:给一棵$n(n\leqslant2\times10^5)$个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少.输出最少的逆序对个数 题解:线段树合并,对于每个节点求出交换 ...

  4. 洛谷P3521 [POI2011]ROT-Tree Rotation [线段树合并]

    题目传送门 Tree Rotation 题目描述 Byteasar the gardener is growing a rare tree called Rotatus Informatikus. I ...

  5. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  6. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  7. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  8. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

  9. 洛谷 P2774 方格取数问题 解题报告

    P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

随机推荐

  1. python import vs from import

    https://stackoverflow.com/questions/9439480/from-import-vs-import

  2. lintcode204 单例

    单例   单例 是最为最常见的设计模式之一.对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例.例如,对于 class Mouse (不是动物的mouse哦),我们应 ...

  3. JAVA基础学习之路(二)方法定义,重载,递归

    一,方法的定义: package test; public class test1 { public static void main(String args[]) { int result = ad ...

  4. 谜题 (Puzzle,ACM/ICPC World Finals 1993,UVa227)

    题目描述:算法竞赛入门经典习题3-5 题目思路:模拟题 #include <stdio.h> #include <string.h> #define maxn 55 char ...

  5. pthon web框架flask(一)

    pthon web框架优劣: 知乎上有一个讨论Python 有哪些好的 Web 框架?,从这个讨论中最后我选择了flask,原因是: Django,流行但是笨重,还麻烦,人生苦短,肯定不选 web.p ...

  6. spark提交任务的两种的方法

    在学习Spark过程中,资料中介绍的提交Spark Job的方式主要有两种(我所知道的): 第一种: 通过命令行的方式提交Job,使用spark 自带的spark-submit工具提交,官网和大多数参 ...

  7. Python对文本文件逐行扫描,将含有关键字的行存放到另一文件

    #逐行统计关键字行数,并将关键字所在行存放在新的文件中 keyword = "INFO" b = open("C:\\Users\\xxx\\Documents\\new ...

  8. mvc中actionresult的返回值类型

    以前一直没注意actionresult都能返回哪些类型的类型值(一直用的公司的内部工具类初始化进行返回的),今天跟大家分享一下(也是转载的别人的日志qaq). 首先我们了解一下对action的要求: ...

  9. Ubuntu—终端命令调整窗口的大小

    1,查看窗口大小 current 1280x768 是我当前电脑的窗口大小,下面提供的是可以修改的窗口大小. $ xrandr 2.修改窗口大小 示例: $ xrandr -s 1024x768

  10. error:no module named StringIO or cStringIO

    一般遇到没有某个模块问题的时候,通常的解决方法是pip相应的模块: 不过,鉴于Python2和python3的不同(让人头疼) 解决方法:在python3中,该模块被新的模块取代,即io. 重新imp ...