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 ;
}

HackerRank "Array and simple queries" !的更多相关文章

  1. [Codeforces 863D]Yet Another Array Queries Problem

    Description You are given an array a of size n, and q queries to it. There are queries of two types: ...

  2. Yet Another Array Queries Problem CodeForces - 863D (暴力/思维)

    You are given an array a of size n, and q queries to it. There are queries of two types: 1 li ri — p ...

  3. Elastic Search 5.x Nest Multiple Queries C#

    I'm using C# with those nuget packeges; <package id="Elasticsearch.Net" version="5 ...

  4. 转://Oracle PL/SQL 优化与调整 -- Bulk 说明

    一. Bulk 概述 本来只想测试一下Bulk Collect 和update性能的,但发现Bulk 的东西还是很多的,在OTN上搜了一些,整理如下. 1.1 Bulk Binding 和 Bulk ...

  5. Sphinx 2.2.11-release reference manual

    1. Introduction 1.1. About 1.2. Sphinx features 1.3. Where to get Sphinx 1.4. License 1.5. Credits 1 ...

  6. 零售行业下MongoDB在产品目录系统、库存系统、个性推荐系统中的应用【转载】

    Retail Reference Architecture Part 1: Building a Flexible, Searchable, Low-Latency Product Catalog P ...

  7. Docker 搭建 ELK 集群步骤

    前言 本篇文章主要介绍在两台机器上使用 Docker 搭建 ELK. 正文 环境 CentOS 7.7 系统 Docker version 19.03.8 docker-compose version ...

  8. Objective-C Memory Management

    Objective-C Memory Management Using Reference Counting 每一个从NSObject派生的对象都继承了对应的内存管理的行为.这些类的内部存在一个称为r ...

  9. 前端自动化测试工具doh学习总结(一)

    前言 项目中需要用到前端自动化测试,自己被当作一个探针研究了下目前用的比较多的web自动化测试工具.一开始研究的是的selenium,但由于项目使用了大量的dijit控件,写起testCase来很费劲 ...

随机推荐

  1. VMware虚拟机固定IP后克隆出现无法访问网卡问题

    通常我们现在都喜欢使用虚拟机进行实验,进行集群搭建等,在这个过程中,会遇到克隆虚拟机问题,当没有修改任何IP的情况下,克隆后,在逐台修改IP地址是没有问题的,但是,如果我们先设置了固定IP地址后,克隆 ...

  2. 【题解】【数组】【查找】【Leetcode】Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  3. Sqlserver CheckPoint 在三种恢复模式中的不同表现

    准备: 日志截断在下列情况下发生: 1.执行完 BACKUP LOG 语句时.2.在每次处理检查点时(如果数据库使用的是简单恢复模式).这包括 CHECKPOINT 语句所产生的显式检查点和系统生成的 ...

  4. 移动开发中使用Onsen UI的笔记

    onsen var m_index = ons.bootstrap() 初始化框架 m_index 赋值 增加对象. m_index.value('getUser',{ // user:window. ...

  5. 关于Ajax知识点小节

    URL:统一资源定位符 网络的七层协议:网卡 驱动  网络层(ip)  传输层(tcp udp) 会话层( )  应用层(http.) restful表征状态转移(一种表征架构) CURD 增删改查 ...

  6. JS开发者常用的10个Sublime Text插件

    Sublime Text 是每个开发者工具箱中都应该有的一个强大的应用.它是一个跨平台的.高定制化的.高级的文本编辑器,在功能强大的 集成开发环境(众所周知地消耗资源)和类似于 Vim 或 Emacs ...

  7. c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;

    网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...

  8. URAL(timus) 1272 Non-Yekaterinburg Subway(最小生成树)

    Non-Yekaterinburg Subway Time limit: 1.0 secondMemory limit: 64 MB A little town started to construc ...

  9. poj2912 带权并查集

    题意:多个人玩石头剪刀布,每个人提前选定了自己出哪个手势,而其中有一种特殊的人他可以随意出什么手势,问是否能够从给出的一系列石头剪刀布游戏中判断出哪个是特殊的,可以从第几局游戏中判断出来. 首先按照食 ...

  10. Android开源项目第一篇——个性化控件(View)篇

    本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Ga ...