HackerRank "Array and simple queries" !
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" !的更多相关文章
- [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: ...
- 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 ...
- Elastic Search 5.x Nest Multiple Queries C#
I'm using C# with those nuget packeges; <package id="Elasticsearch.Net" version="5 ...
- 转://Oracle PL/SQL 优化与调整 -- Bulk 说明
一. Bulk 概述 本来只想测试一下Bulk Collect 和update性能的,但发现Bulk 的东西还是很多的,在OTN上搜了一些,整理如下. 1.1 Bulk Binding 和 Bulk ...
- 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 ...
- 零售行业下MongoDB在产品目录系统、库存系统、个性推荐系统中的应用【转载】
Retail Reference Architecture Part 1: Building a Flexible, Searchable, Low-Latency Product Catalog P ...
- Docker 搭建 ELK 集群步骤
前言 本篇文章主要介绍在两台机器上使用 Docker 搭建 ELK. 正文 环境 CentOS 7.7 系统 Docker version 19.03.8 docker-compose version ...
- Objective-C Memory Management
Objective-C Memory Management Using Reference Counting 每一个从NSObject派生的对象都继承了对应的内存管理的行为.这些类的内部存在一个称为r ...
- 前端自动化测试工具doh学习总结(一)
前言 项目中需要用到前端自动化测试,自己被当作一个探针研究了下目前用的比较多的web自动化测试工具.一开始研究的是的selenium,但由于项目使用了大量的dijit控件,写起testCase来很费劲 ...
随机推荐
- toLocaleString
- 添加mongodb支持
最近花了些时间,将引擎的存储换成了mongodb. 私下,我觉得现有的存储机制极为落后.现在写数据的操作交由单独的进程完成,该进程兼当数据缓冲与持续化数据的责任.此次引擎的更换,只是简单的利用mong ...
- Binary Tree Traversal
1.Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For ex ...
- 希尔排序(C++版)
#include <iostream> using namespace std; /** Shell Sort * * Key: * * increment * * insertSort( ...
- ResponsiveSlides.js最轻量级的幻灯片插件
摘要:ResponsiveSlides.js是一个展示同一容器内图片的轻量级响应式jQuery幻灯片插件它支持包括IE6在内的几乎所有的浏览器,在IE6中还支持最大宽度属性,但在其它浏览器中并不原生支 ...
- 转载:为什么要对URI进行编码
为什么需要Url编码,通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义 ...
- my PhoneWeb
<meta name="viewport" content="width=device-width, user-scalable=yes, minimum-scal ...
- MySQL常用配置
查看MySQL的参数信息 mysql> show variables; 查看key_buffer_size的使用情况 mysql> show status like 'key_read%' ...
- Python-属性(property)
在2.6版本中,添加了一种新的类成员函数的访问方式--property. 原型 class property([fget[, fset[, fdel[, doc]]]]) fget:获取属性 fset ...
- easyui datagrid 添删改(纪录)
var groups;//用户组为另一个表,所以需先加载,用于编辑时下拉框 var editindex = undefined; var action; $(function () { $.ajax( ...