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);elsers=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

转载于:https://www.cnblogs.com/butterflydew/p/9392041.html

洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告相关推荐

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

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

  2. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  3. 洛谷 P2114 [NOI2014]起床困难综合症 解题报告

    P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...

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

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

  5. 洛谷 P1377 [TJOI2011]树的序 解题报告

    P1377 [TJOI2011]树的序 题目描述 众所周知,二叉查找树的形态和键值的插入顺序密切相关.准确的讲:1.空树中加入一个键值\(k\),则变为只有一个结点的二叉查找树,此结点的键值即为\(k ...

  6. 洛谷 P1356 数列的整数性 解题报告

    P1356 数列的整数性 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5, ...

  7. 洛谷 P2530 [SHOI2001]化工厂装箱员 解题报告

    P2530 [SHOI2001]化工厂装箱员 题目描述 118号工厂是世界唯一秘密提炼锎的化工厂,由于提炼锎的难度非常高,技术不是十分完善,所以工厂生产的锎成品可能会有3种不同的纯度,A:100%,B ...

  8. 洛谷 P3797 妖梦斩木棒 解题报告

    P3797 妖梦斩木棒 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的\(n\)段.现在这个木棒可以看做 ...

  9. 一中OJ #3509 七的倍数 [USACO Jan16,洛谷P3131] | 同余前缀和 | 解题报告

    一中OJ | #3509 七的倍数 [USACO Jan16 Silver , Subsequences Summing to Sevens] 时限 1000MS/Case 内存 128MB/Case ...

最新文章

  1. 到这个年纪为什么我还要开始学习理解参与区块链?
  2. 什么是静态UItableView
  3. Hadoop3 Hive Spark完整安装与实践
  4. LeetCode 554. 砖墙(map计数)
  5. IP trie树接口
  6. UE4 美术学习笔记和经验
  7. 又要辞职了,又要换工作了
  8. QByteArray使用方法举例
  9. centos locale报错问题
  10. 云原生网络性能优化:service mesh 篇
  11. 什么的SIT测试?什么是UAT测试?
  12. ong拼音汉字_儿童拼音汉字入门
  13. LIU学生成绩管理系统源码【演示视频】
  14. NYOJ 独木舟上的旅行
  15. 基于PyQT5制作一个二维码生成器
  16. big_6d77fbb7bde4011fdf01df45fef8d0dd9ddcbdd5.jpg
  17. Battle Mages (魔法之战,精灵传说)修改器
  18. 【26】地图可视化:基于 Echarts + Java SpringBoot 的动态实时地图组件 - 点气泡流向组合区域三级下钻地图
  19. 单组学的多变量分析| 2.稀疏偏最小二乘判别分析(sPLS-DA)
  20. Ubuntu 18.04 安装googlepinyin 输入法

热门文章

  1. 算法学习笔记2022.1.8
  2. 三数之和—leetcode15
  3. android 中的invalidate 和 postInvalidate
  4. CF-196 D.The Next Good String(hash)
  5. B. Light It Up
  6. B树,B-树和B+树、B*树的区别
  7. 记录 之 numpy查看数据类型和类型转换
  8. pytorch 之 分开安装 torch 和 torchvision
  9. [攻防世界 pwn]——int_overflow
  10. [BUUCTF-pwn]——pwn2_sctf_2016