主席树这个概念应该不陌生吧!恩?不会, 戳这里

主席树(函数式线段树)用的是函数思想,一个节点开数组用来保存自己的左右节点,这样节省许多不必要的空间,还可以保存许多历史状态。而这里我们用的是主席树的函数思想来实现。

上题:http://acm.hdu.edu.cn/showproblem.php?pid=5444

题目大意:

给你一个序列,第一个数为二叉树根节点,之后每个数往上加节点,且保证左节点小于根节点,且保证右节点大于根节点。且每个节点最多有2个子节点。然后再查询位置,每往左找输出一个E,右找输出W。例如序列2, 1, 4, 3可以生成如下图:

例如查找1,需要往左一次输出E,查找2,不需要搜直接输出,查找3需要向右一次再向左一次,输出WE。

哇!这题好水,不就是二叉树吗?啪啪啪,几分钟码完了, 交一发,嗯,居然RE了,不行,的开大叔组,开成10W,嗯?又RE了。最后一想如果这个数列是1-n,即a[i] = i,那样需要访问到2的1000次方个节点。咕~~(╯﹏╰)b,郁闷呢,然后回想起以前学过的主席树,可以开数组记录该节点的左右儿子,那样岂不是只要访问到n个节点就行。然后就这样AC了。(比赛的时候提交的时候超了了51s,,14:00:51的时候提交的。本来能AC的,TAT)

附上代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 4000 + 5; int a[N], b[N],ls[N], rs[N], mx[N]; int n, k, tot, sz, ql, qr, x, q, T; void update(int o, int l, int r, int p){
int m = (l + r) >> 1;
if(p <= mx[o]){
if(ls[o] == 0){
ls[o] = tot;
mx[tot] = p;
return ;
}
else update(ls[o], l, m, p);
}
else {
if(rs[o] == 0){
rs[o] = tot;
mx[tot] = p;
return;
}
else update(rs[o], m + 1, r, p);
}
} void query(int o, int l, int r, int k){
if(mx[o] == k)return ;
int m = (l + r) >> 1;
if(k <= mx[o]){
printf("E");
query(ls[o], l, m, k);
}
else{
printf("W");
query(rs[o], m + 1, r, k);
}
} void work(){
scanf("%d", &x);
query(1, 1, n, x);
puts("");
} int main(){
scanf("%d", &T);
while(T--){
scanf("%d", &n);
tot = 1;
//Build(rt[0], 1, n);
memset(mx, 0, sizeof(mx));
memset(ls, 0, sizeof(ls));
memset(rs, 0, sizeof(rs));
//for(int i = 1; i <= n; i ++)ls[i] = i << 1, rs[i] = i << 1|1;
//for(int i = 0; i <= 20; i ++)printf("i = %d, rt = %d, ls = %d, rs= %d, mx = %d\n", i, rt[i], ls[i], rs[i], mx[i]);
for(int i = 1; i <= n; i ++){
scanf("%d", a + i);
if(i == 1)mx[1] = a[1];
else update(1, 1, n, a[i]);
tot ++;
}
scanf("%d", &q);
while(q --)work();
}
return 0;
}

  

hdu5444Elven Postman(主席树思想的应用)的更多相关文章

  1. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

  2. POJ2104 K-TH NUMBER 传说中的主席树

    题意:给出1e5个数,向你提5000问,L到R间的第K个数是多少? -------------------------------------------------------- 这个题着实没有其它 ...

  3. 主席树入门(区间第k大)

    主席树入门 时隔5个月,我又来填主席树的坑了,现在才发现学算法真的要懂了之后,再自己调试,慢慢写出来,如果不懂,就只会按照代码敲,是不会有任何提升的,都不如不照着敲. 所以搞算法一定要弄清原理,和代码 ...

  4. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

  5. POJ 2104 K-th Number(主席树——附讲解)

    Description You are working for Macrohard company in data structures department. After failing your ...

  6. 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...

  7. SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)

    DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...

  8. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  9. HDU 2665 && POJ 2104(主席树)

    http://poj.org/problem?id=2104 对权值进行建树(这个时候树的叶子是数组b的有序数列),然后二分查找原数列中每个数在有序数列中的位置(即第几小),对每一个前缀[1,i]建一 ...

随机推荐

  1. MySQL分表自增ID解决方案

    当我们对MySQL进行分表操作后,将不能依赖MySQL的自动增量来产生唯一ID了,因为数据已经分散到多个表中. 应尽量避免使用自增IP来做为主键,为数据库分表操作带来极大的不便. 在postgreSQ ...

  2. yii2 GridView 日期格式化并实现日期可搜索 案例

    作者:白狼 出处:http://www.manks.top/article/yii2_gridview_dateformat_search 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且 ...

  3. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  4. js 百度地图

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 高效coder,筹备开源框架toutou.escort.js

    背景:JavaScript在工作中运用的非常广泛,作为一门弱类型语言,在使用JavaScript的时候,很多事情需要coder manual的去完成,这无疑增加了coder的工作量. 扩展:在这样的背 ...

  6. Oracle Data Provider for .NET

    官方地址: http://www.oracle.com/technetwork/topics/dotnet/index-085163.html 终于有正式版了.不用装客户端,又小,确实好.

  7. [译] 企业级 OpenStack 的六大需求(第 1 部分):API 高可用、管理和安全

    全文包括三部分: 第一部分:API 高可用和管理以及安全模型 第二部分:开放架构和混合云兼容 第三部分:弹性架构和全球交付 引言 OpenStack 是构造企业级私有云的非常理想的基础.它立志成为新一 ...

  8. 《Remus: High Availability via Asychronous Virtual Machine Replication》翻译

    Abstract 想要让应用能够躲过硬件故障是一项非常昂贵的任务,因为这通常意味着对软件进行重构,使它包含复杂的恢复逻辑的同时需要部署专用的硬件,而这些对于提升大型的或者遗留的应用的可靠性是巨大的障碍 ...

  9. 微软云Azure Website 远程调试

    微软云Azure Website 远程调试 是可以的 但是只有48小时,要在后台开启,所以还是很麻烦的啊! 但是安全性提高了,不得不承认哦

  10. 转:HTML网页中插入视频各种方法

    现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.Chrome),支持H.264的(Safari.IE ...