解题思路:这道题要求某区间内比h小的个数,其实这里可以类似于树状数组求逆序数那样。关键是如何转换成树状数组的模型,这才是本题的难点。

我们首先分析,如果知道h在该区间的哪个位置,那么剩下的就很好做了。我们还可以发现,如果找到了当前的比h小的所有点(大于的点我们先忽略掉),那么我们就可以用树状数组求它的[l,r]区间的和。这样就跟树状数组有了一点联系,但是还不够,因为我们发现,h的大小会影响我们所要找的区间。什么意思呢?就是我们先找到的是h1,再找h2,但h1>h2,就会出现这样的问题:h1所对应的区间找到了,但再找h2时,它对应的区间中可能会有比h2大的数,这样就不符合条件了。所以说这里有一个离线算法,就是先把所有的询问存下来,再按照h的大小进行从小到大排序,然后根据h的大小,从小到大地一个个插入所有区间内的数,这样就符合条件了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int maxn = 1e5+5;
struct Query
{int l,r,h;int id;bool operator < (Query a){return h < a.h;}
}q[maxn];
struct Node
{int num;int id;bool operator < (Node a){return num < a.num;}
}a[maxn];
int n,m;
int tree[maxn<<2],ans[maxn];int lowbit(int x)
{return x & (-x);
}void update(int x,int d)
{for(int i = x; i <= n; i += lowbit(i))tree[i] += d;
}int getsum(int x)
{int sum = 0;for(int i = x; i > 0; i -= lowbit(i))sum += tree[i];return sum;
}int main()
{int t,cas = 1;cin >> t;while(t--){cin >> n >> m;for(int i = 1; i <= n; i++){cin >> a[i].num;a[i].id = i;}for(int i = 1; i <= m; i++){cin >> q[i].l >> q[i].r >> q[i].h;q[i].l++, q[i].r++;q[i].id = i;}sort(a+1,a+1+n);sort(q+1,q+1+m);memset(tree,0,sizeof(tree));int idx = 1;for(int i = 1; i <= m; i++){while(q[i].h >= a[idx].num && idx <= n){update(a[idx].id,1);idx++;}ans[q[i].id] = getsum(q[i].r) - getsum(q[i].l-1);}printf("Case %d:\n",cas++);for(int i = 1; i <= m; i++)printf("%d\n",ans[i]);}return 0;
}

hdu 4417(树状数组+离线算法)相关推荐

  1. hdu 3333 树状数组+离线处理

    思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...

  2. hdu 3874(树状数组+离线算法)

    解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和.可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所 ...

  3. hdu 4417 树状数组查询区间不是1到n时需要转换,例[0,5]变成[1,6]

    http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:求区间内小于等于h的数的个数. 方法: 先对输入的n个数由小到大排序,在对查询的h由小到大排序. # ...

  4. HDU 4358 树状数组+思路

    http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...

  5. hdu 4991(树状数组优化dp)

    Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  6. Sereja and Brackets CodeForces - 380C (树状数组+离线)

    Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...

  7. Weak Pair HDU - 5877 树状数组+离散化+DFS遍历

    题意 给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1 ...

  8. hdu 1166 树状数组解

    树状数组解决   (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...

  9. SPOJ D-query 树状数组离线 求区间内不同数字的个数

    Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query is a pair (i, j) (1 ...

最新文章

  1. 2022年全球及中国软包电池铝塑膜行业规模价值与竞争格局展望报告
  2. 今天的编程语言是怎么来的?
  3. 巧用VC工程下的rc文件
  4. [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
  5. 报表软件公司高价悬赏BUG,100块1个我真是醉了
  6. 操作系统和语言的关系(转载)
  7. 小菜面试 String 篇 之 统计一个字符串中数字,字母,的个数
  8. matlab 坐标轴根号,在matlab图例中如何打数学符号---根号?
  9. 弯管机编程软件电脑版_编程一点通电脑版
  10. 城市售票网关于使用selenium撞库的一点心得,可以在抢票时间卡进去
  11. 计算图片的相似度(深度学习)
  12. Javaweb支付宝支付
  13. Android手机开发常用数据库,android开发常用的数据库
  14. 共享经济已成资本傀儡,背后是腾讯和阿里的暗斗
  15. Typora远程解绑设备的方法
  16. 【JavaSE】Lambda表达式、接口组成更新、方法引用
  17. 通向Golang的捷径【Top】
  18. 万级送风天花工作原理以及操作方法
  19. ucharts折线图出现断点时画小圆圈(当线的width很大时,小圆圈会很大)
  20. 在线压缩pdf文件任意大小,在线压缩pdf文件大小

热门文章

  1. 喜报!「神策 SA 分析师认证」第三期认证名单正式公布
  2. 解锁营销自动化行为触发,神策数据《营销自动化应用基准报告 2021》助力企业增长
  3. 神策数据入选“2019 全球企服科技创新 Top50”
  4. PPT 下载 | 神策数据孙文亮:客户全生命周期管理从方法到实践全解析
  5. 面试宝典系列-PHP变量在内存中的存储方式
  6. AtCoder Beginner Contest 096 题解
  7. 大数据学习(1)Hadoop安装
  8. LVS DR模式 负载均衡服务搭建
  9. SystemCenterOperationsManager2012 SP1系列文章
  10. ccna____总结