题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 , 线段树(或树状数组) + 离线处理

  最近看了几道线段树的题都是需要离线处理数据的,正好这块比较手生,就练练了。


   这道题主要的地方就是离线处理数据,具体想法:

  ① 先把所有位置的高度都存下来,然后排序,注意保存下标;

  ② 把所有询问存下来,然后按照询问的高度进行排序,同注意保存下标;

  ③ 对于排序后的每次询问的处理:由于每个位置的高度都已经存了下来并且进行了排序,所以可以按照顺序将每个点插入到线段树的对应位置(保存的下标),并更新线段树,直到要插入的位置的高度大于这次询问的高度H;最后处理区间查询,由于刚才已经把小于等于该次查询高度的位置都已经插入到了线段树中,所以询问的结果就是查询区间中被更新过的叶子节点的个数,也就是区间求和问题。

#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int MOD = 10000007;
const int maxn = 100000 + 5;
const int N = 15;
struct Node {        //每个节点的信息int h , pos;bool operator < (const Node tmp) const {return h < tmp.h;}
} a[maxn];
struct Section {    //每次查询的区间信息int L , R , H;int index;bool operator < (const Section tmp) const {return H < tmp.H;}
} s[maxn];
int cnt[maxn << 2] , ans[maxn];
void PushUp(int rt)
{cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
}
void build()
{memset(cnt , 0 , sizeof(cnt));
}
void update(int p , int l , int r , int rt)
{if(l == r) {cnt[rt]++;return;}int m = (l + r) >> 1;if(p > m)        //找到更新点的位置
        update(p , rson);elseupdate(p , lson);PushUp(rt);
}
int query(int L , int R , int l , int r , int rt)
{if(L <= l && R >= r) {return cnt[rt];}int m = (l + r) >> 1;if(L > m)return query(L , R , rson);else if(R <= m)return query(L , R , lson);elsereturn query(L , R , lson) + query(L , R , rson);
}
int main()
{int T , i , j , n , m;cin >> T;for(int k = 1 ; k <= T ; k++){build();printf("Case %d:\n" , k);scanf("%d %d" , &n , &m);for(i = 1 ; i <= n ; i++) {scanf("%d" , &a[i].h);a[i].pos = i;}for(i = 1 ; i <= m ; i++) {scanf("%d %d %d" , &s[i].L , &s[i].R , &s[i].H);s[i].index = i;}sort(a + 1 , a + n + 1);sort(s + 1 , s + m + 1);for(i = j = 1 ; i <= m ; i++) {        //这里就是上面的③while(a[j].h <= s[i].H && j <= n) {update(a[j++].pos , 1 , n , 1);}ans[s[i].index] = query(s[i].L + 1 , s[i].R + 1 , 1 , n , 1);}for(i = 1 ; i <= m ; i++)printf("%d\n" , ans[i]);}return 0;
}

  此题还可以用划分树来做,并且特别快,可惜我没学~

转载于:https://www.cnblogs.com/H-Vking/p/4296171.html

HDU4417 线段树 + 离线处理相关推荐

  1. HDU - 4417 Super Mario(主席树/线段树+离线)

    题目链接:点击查看 题目大意:给出由 n 个数的数列,再给出 m 次查询,每次查询需要输出 [ l , r ] 内小于等于 h 的数有多少个 题目分析:大晚上睡不着觉随便做做题,发现这个题目原来可以用 ...

  2. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...

  3. Super Mario HDU - 4417(主席树解决区间数字小于k的个数||线段树+离线)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  4. HDU 4417 Super Mario(线段树离线处理/主席树)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  5. HDU - 3804 Query on a tree(树链剖分+线段树+离线处理)

    题目链接:点击查看 题目大意:给出一棵树,每条边上都有一个权值,给出m个查询:a,b:问从点1到点a的唯一路径上,在边权小于等于b的边中选出边权最大的值输出,若没有符合条件的边则输出-1: 题目分析: ...

  6. HDU - 3333 Turing Tree(线段树+离线处理)

    题目链接:点击查看 题目大意:给定一个长度为n的数列,依次求m个区间中不相同数字之和 题目分析:n给的是3e4,看到区间问题先要想到线段树或差分区间或动态规划,暴力是肯定不行滴,那么这个题已经知道是需 ...

  7. No Pain No Game HDU - 4630(gcd+线段树+离线处理)

    Life is a game,and you lose it,so you suicide. But you can not kill yourself before you solve this p ...

  8. SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -

    Can you answer these queries II 这是一道线段树的题目,维护历史版本,给出N(<=100000)个数字(-100000<=x<=100000),要求求出 ...

  9. 【BZOJ2221】面试的考验,随机数列+线段树+离线

    传送门 shallwe's blog //以上内容由shallwe本人暴力添加 思路: 好题 断断续续想了1周左右 暴力思路显然是O(n2logn)O(n^2\log n)的 我最开始的想法是用莫队+ ...

最新文章

  1. typedef BOOL(WINAPI *MYFUNC) (HWND,COLORREF,BYTE,DWORD);语句的理解
  2. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
  3. 【云计算】5_云存储产品介绍
  4. 如何写一手好 SQL 【频繁出现慢SQL告警的优化方案】
  5. Sharepoint的文档库用资源管理器方式浏览报错“Explorer View ”解决方案。
  6. linux-查看用户id-查看文件目录所有者-查看进程操作者
  7. 内核同步机制-信号量(semaphore)
  8. Python绘制每个柱的颜色各不相同的三维柱状图
  9. 3Dslicer中 PET/CT 模块:PET Standard Uptake Value Computation
  10. 【转载】Java文件编码自动转换工具类
  11. 关于通过图注意神经网络处理多元时间序列的错误预测论文的讨论
  12. 应用笔记3816 ds 1302 估算涓流充电实时时钟的超级电容备份时间
  13. IOS开发之UI进阶(安全区高度)
  14. 以太坊 2.0 中的验证者经济模型,Part-1
  15. P2197 nim博弈
  16. canvas如何绘制虚线
  17. VRF在区块链中的应用
  18. jquery控制元素的隐藏和显示
  19. LTE学习笔记--LTE无线连接过程--网络接入过程
  20. B站黑马程序员pink老师讲的JavaScript代码

热门文章

  1. php mime base64,base64_encode — 使用 MIME base64 对数据进行编码
  2. jmeter 获取全部响应,jmeter中的正则表达式提取器-从响应中提取多个值.
  3. html%3c arial%3e,【博客园】样式美化+网站统计访问+添加网易云背景音乐
  4. atomic原子类实现机制_JDK中Atomic开头的原子类实现原子性的原理是什么?
  5. VB 使用SendMessage枚举文件与目录
  6. 第5章 set命令详解
  7. 机房收费系统个人重构版:透过文档谈文档驱动开发
  8. DeepMind去年亏损27亿元,同比扩大221%,谷歌说:继续烧
  9. 小米距告别破发还差2分钱
  10. 墙后的所有姿势,全被“瞎眼”AI透视