The most interesting, flexible and juicy binary tree problem I have ever seen.

I learnt it from here: https://codepair.hackerrank.com/paper/5fIoGg74?b=eyJyb2xlIjoiY2FuZGlkYXRlIiwibmFtZSI6IkJsdWVCaXJkMjI0IiwiZW1haWwiOiJoZWFsdGh5dG9ueUBnbWFpbC5jb20ifQ%3D%3D

Everything is so generalized.

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std; struct node {
long value, size;
int prev;
node *left, *right;
}; const long MAX_N = 100000l;
node nodes[MAX_N];
long values[MAX_N]; // Get Tree Size
long size(node *p)
{
return p ? p->size : ;
} // Tree Operations
//
node *merge(node *l, node *r)
{
if (!l) return r;
if (!r) return l; if (l->prev > r->prev)
{
l->right = merge(l->right, r);
l->size = size(l->left) + size(l->right) + ;
return l;
} // l is on left of r: append l to r's left
r->left = merge(l, r->left);
r->size = size(r->left) + size(r->right) + ;
return r;
} // split tree p by inx, to l and r
void split(node *p, long inx, node *&l, node *&r)
{
if (!p)
{
l = r = nullptr;
return;
} long cur = size(p->left) + ;
if (cur <= inx)
{
split(p->right, inx - cur, p->right, r);
l = p;
}
else
{
split(p->left, inx, l, p->left);
r = p;
} p->size = size(p->left) + size(p->right) + ;
} //
node *extract(node *&p, long from, long to)
{
node *l, *m, *r; split(p, from, l, m);
split(m, to - from, m, r);
p = merge(l, r);
return m;
} // Traversal
long preorder(node *p, long i/*from inx*/) // return new start inx
{
if (!p) return i; i = preorder(p->left, i);
values[i++] = p->value;
return preorder(p->right, i);
} int main()
{
for (long i = ; i != MAX_N; ++i) {
nodes[i].prev = rand();
nodes[i].size = ;
} long n, m;
cin >> n >> m; node *tree = nullptr;
for (long i = ; i != n; ++i) {
cin >> nodes[i].value;
tree = merge(tree, nodes + i);
} for (long i = ; i != m; ++i) {
long l, r;
int type;
cin >> type >> l >> r; node *sub = extract(tree, l - , r);
if (type == )
tree = merge(sub, tree);
else
tree = merge(tree, sub);
} // Serialize tree
preorder(tree, );
cout << abs(values[] - values[n-]) << endl;
for (long i = ; i < n; ++i)
cout << values[i] << " ";
cout << endl; return ;
}

最新文章

  1. Senparc.Weixin.MP SDK 微信公众平台开发教程(四):Hello World
  2. 在忘记root密码的情况下如何修改linux系统的root密码
  3. Cygwin的安装与配置
  4. 初识python第二天(3)
  5. Java从零开始学四十七(注解简述)
  6. HDU 2896
  7. SAP-设置显示表格格式
  8. 十件你需要知道的事,关于openstack-trove(翻译)
  9. 深入分析:微信小程序与H5的区别
  10. 部署AlwaysOn第一步:搭建Windows服务器故障转移集群
  11. JavaScript面向对象(二)——成员属性、静态属性、原型属性与JS原型链
  12. sqlite ef6
  13. 11、JDBC-Druid
  14. Linux platform平台总线、平台设备、平台驱动
  15. ijkplayer总结
  16. 《Spring_Four》第一次作业:团队亮相
  17. MongoDB修改与聚合二
  18. 常用的机器学习&amp;数据挖掘知识(点)总结
  19. (精)AVL树旋转共8种情况(涵盖所有考研的范围)
  20. Pascal可视化编程 CodeTyphon 、Lazarus

热门文章

  1. 五 浅谈CPU 并行编程和 GPU 并行编程的区别
  2. elfutils-libelf由于依赖而安装失败
  3. 用CSS变形创建圆形导航
  4. 《C标准库》——之&lt;ctype.h&gt;
  5. 【转载】.NET(C#): Task.Unwrap扩展方法和async Lambda
  6. C#使用指针的2个主要原因
  7. JS构造函数详解
  8. 用 C# 在 Windows 7 中写注册表想到的
  9. Java——关于String(字符串)
  10. (转)现代C++函数式编程