hdu 4417(树状数组+离线算法)
解题思路:这道题要求某区间内比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(树状数组+离线算法)相关推荐
- hdu 3333 树状数组+离线处理
思路:既然要求的是不同的元素的和,那么我们可以想办法让每个值在区间中只出现一次,于是想到了离线的算法:将查询按照右端点排序,位置在右端点之前的元素都插入到树状数组中,对于已经出现过的值,我们要先删除( ...
- hdu 3874(树状数组+离线算法)
解题思路:这道题和之前的题一样,查找[l,r]区间内不重复数字的和.可以利用离线算法,实际上离线算法为了解决在查找时出现的矛盾,因为每次询问的区间大小不同,如果单独处理的话可能会对之后的查询有影响,所 ...
- hdu 4417 树状数组查询区间不是1到n时需要转换,例[0,5]变成[1,6]
http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意:求区间内小于等于h的数的个数. 方法: 先对输入的n个数由小到大排序,在对查询的h由小到大排序. # ...
- HDU 4358 树状数组+思路
http://acm.hdu.edu.cn/showproblem.php?pid=4358 如图所示,当k==3时,如果我们扫描到红线所在的位置. 则符合条件的区间就是从红线到两条紫线所包含的区间( ...
- hdu 4991(树状数组优化dp)
Ordered Subsequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Sereja and Brackets CodeForces - 380C (树状数组+离线)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- Weak Pair HDU - 5877 树状数组+离散化+DFS遍历
题意 给我们一颗有根有向树 以及每个点得权值a[1]~a[n] 需要我们求出在这颗树种有多少对满足以下两个条件的pair (1)u是v的祖先节点 (2)a[u]*a[v]<= k N<=1 ...
- hdu 1166 树状数组解
树状数组解决 (关于树状数组参考大佬的博客https://www.cnblogs.com/hsd-/p/6139376.html) 然后就很好理解这题了,代码附上 /*hdu 1166 单点修改, ...
- 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 ...
最新文章
- 2022年全球及中国软包电池铝塑膜行业规模价值与竞争格局展望报告
- 今天的编程语言是怎么来的?
- 巧用VC工程下的rc文件
- [Java_kaikeba]java中堆和栈的区别(对象变量的理解)
- 报表软件公司高价悬赏BUG,100块1个我真是醉了
- 操作系统和语言的关系(转载)
- 小菜面试 String 篇 之 统计一个字符串中数字,字母,的个数
- matlab 坐标轴根号,在matlab图例中如何打数学符号---根号?
- 弯管机编程软件电脑版_编程一点通电脑版
- 城市售票网关于使用selenium撞库的一点心得,可以在抢票时间卡进去
- 计算图片的相似度(深度学习)
- Javaweb支付宝支付
- Android手机开发常用数据库,android开发常用的数据库
- 共享经济已成资本傀儡,背后是腾讯和阿里的暗斗
- Typora远程解绑设备的方法
- 【JavaSE】Lambda表达式、接口组成更新、方法引用
- 通向Golang的捷径【Top】
- 万级送风天花工作原理以及操作方法
- ucharts折线图出现断点时画小圆圈(当线的width很大时,小圆圈会很大)
- 在线压缩pdf文件任意大小,在线压缩pdf文件大小
热门文章
- 喜报!「神策 SA 分析师认证」第三期认证名单正式公布
- 解锁营销自动化行为触发,神策数据《营销自动化应用基准报告 2021》助力企业增长
- 神策数据入选“2019 全球企服科技创新 Top50”
- PPT 下载 | 神策数据孙文亮:客户全生命周期管理从方法到实践全解析
- 面试宝典系列-PHP变量在内存中的存储方式
- AtCoder Beginner Contest 096 题解
- 大数据学习(1)Hadoop安装
- LVS DR模式 负载均衡服务搭建
- SystemCenterOperationsManager2012 SP1系列文章
- ccna____总结