整理一下线段树合并的思路,大体是给每个树上节点分配一个根编号建一棵log长的权值线段树,一开始树上只有这个树节点的节点权

merge两个树节点的时候,对于当前合并的值域(例如两棵线段树的表示1到n/2的节点),

任意取两棵树中的一个节点编号,空的返回另一个,把树丰满起来,同时更新一下计数就可以了

#include<bits/stdc++.h>
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
#include<iostream>
#include<math.h>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<iomanip>
#include<bitset>
using namespace std;         //#define ll long long
#define ull unsigned long long
#define pb push_back
#define FOR(a) for(int i=1;i<=a;i++)
#define sqr(a) (a)*(a)
#define dis(a,b) sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
ll qp(ll a,ll b,ll mod){ll t=1;while(b){if(b&1)t=t*a%mod;b>>=1;a=a*a%mod;}return t;
}
struct DOT{ll x;ll y;};
inline void read(int &x){int k=0;char f=1;char c=getchar();for(;!isdigit(c);c=getchar())if(c=='-')f=-1;for(;isdigit(c);c=getchar())k=k*10+c-'0';x=k*f;}
const int dx[4]={0,0,-1,1};
const int dy[4]={1,-1,0,0};
const int inf=0x3f3f3f3f;
const ll Linf=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;;const int maxn=8e6+34;int RT;
int n,a[maxn];int seg;
int tree[maxn],lson[maxn],rson[maxn];
int root[maxn];vector<int>G[maxn];
int Time;void pushup(int rt){tree[rt]=tree[lson[rt]]+tree[rson[rt]];}
void build(int &rt,int l,int r,int pos){rt=++seg;if(l==r){tree[rt]=1;return;}int m=l+r>>1;if(pos<=m)build(lson[rt],l,m,pos);else build(rson[rt],m+1,r,pos);pushup(rt);
}
ll ans,ans1,ans2;int merge(int x,int y){if(!x)return y;if(!y)return x;ans1+=1ll*tree[rson[x]]*tree[lson[y]];ans2+=1ll*tree[lson[x]]*tree[rson[y]];lson[x]=merge(lson[x],lson[y]);rson[x]=merge(rson[x],rson[y]);pushup(x);return x;
}void dfs(int u){if(a[u])return;dfs(G[u][0]);dfs(G[u][1]);ans1=ans2=0;root[u]=merge(root[G[u][0]],root[G[u][1]]);ans+=min(ans1,ans2);
}void init(int &rt){rt=++Time;scanf("%d",&a[Time]);if(a[Time])return;G[rt].pb(0);G[rt].pb(0);init(G[rt][0]);init(G[rt][1]);
}int main(){scanf("%d",&n);init(RT);for(int i=1;i<=Time;i++){if(a[i])build(root[i],1,n,a[i]);}dfs(RT);printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/Drenight/p/8611191.html

[Poi2011]Tree Rotations线段树合并相关推荐

  1. BZOJ.2212.[POI2011]Tree Rotations(线段树合并)

    题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...

  2. 【BZOJ2212】【POI2011】Tree Rotations(线段树合并)

    Description click me Solution 对于每个节点有一棵权值线段树,向上递归时合并同时计算逆序对即可. Source /***************************** ...

  3. 数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

    文章目录 [HNOI2012]永无乡 Lomsat gelral 「POI2011 R2 Day2」旋转树木 Tree Rotations Escape Through Leaf 线段树合并与 fhq ...

  4. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...

    原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...

  5. 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)

    题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode​,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...

  6. P6847-[CEOI2019]Magic Tree【dp,线段树合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P6847 题目大意 nnn个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在did_idi​时刻这个 ...

  7. 【线段树合并】解题报告:luogu P4556雨天的尾巴 (树上对点差分 + 动态开点 + 线段树合并)线段树合并模板离线/在线详解

    题目链接:雨天的尾巴 本题本身是一个非常简单的一道树上差分的模板题,但是由于变态的数据范围,我们直接用数组是存不下的(本来使用一颗普通的线段树直接维护最大值即可.但是本题的空间只有128MB,直接按照 ...

  8. 【BZOJ-3681】Arietta 网络流 + 线段树合并

    3681: Arietta Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 182  Solved: 70 [Submit][Status][Discu ...

  9. [BJWC2018]Border 的四种求法(后缀自动机+链分治+线段树合并)

    题目描述 给一个小写字母字符串 S ,q 次询问每次给出 l,r ,求 s[l..r] 的 Border . Border: 对于给定的串 s ,最大的 i 使得 s[1..i] = s[|s|-i+ ...

最新文章

  1. 简化管理面向服务的应用程序的创建
  2. Nutch中MapReduce的分析[zz]
  3. Py之re:re正则表达式库的简介、常用函数、经典案例之详细攻略
  4. 【NOI 2018】归程(Kruskal重构树)
  5. sicktim571操作手册_SICK激光传感器TIM310操作说明书
  6. 喜讯 | 国际智慧城市大会巨杉喜获两项大奖
  7. android 高帧模式,达人分享技巧 手动让安卓机支持王者荣耀高帧率
  8. c语言recover函数的功能是,c语言实验报告(附答案版).doc
  9. 博通:NFC将成手机标配nbsp;新芯…
  10. CentOS 7.5 安装Zabbix4.4.4和Grafana6.4.4监控系统安装
  11. java设计模式之装饰者模式学习
  12. 安卓Android类原生系统官网集合
  13. remains in conflict解决方法
  14. 一分钟让你明白货币贬值现象
  15. 线性代数常用名词详解1
  16. ubuntu Aria2 AriaNg安装
  17. 团队任务3每日立会(2018-10-25)
  18. excel如何批量删除缺失数据所在的行?
  19. 三个月死磕Python是种什么样的体验?
  20. 打卡leetcode第12天

热门文章

  1. 智能机器人及其应用ppt课件_机器人视觉技术在建筑智能化生产中的应用
  2. java课程课后作业190502之单词统计续集
  3. Spring对AspectJ的支持
  4. 【洛谷P3389】【模板】高斯消元
  5. PHP的time函数返回时间不正确
  6. 使用 ServiceStack 构建跨平台 Web 服务(转)
  7. 《Python核心编程》笔记 Python对象
  8. Pacman主题下给Hexo增加简历类型
  9. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)
  10. 优麒麟在linux下安装教程,在优麒麟Ubuntu Kylin系统中安装百度网盘Linux版.deb的方法...