[HDU 4417] Super Mario (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417

题目大意:给你n个数,下标为0到n-1,m个查询,问查询区间[l,r]之间小于等于x的数有多少个。

写的时候逗比了。。。还是写的太少了。。

我们按照x从小到大排序来查询,然后找区间上的点,如果小于等于它就插入,然后看这个区间内插入了多少个点。

点也是可以排序的。。

详见代码:

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <vector>
 6 using namespace std;
 7 typedef pair<int,int> PII;
 8
 9 const int MAX_N = 100100;
10 int bit[MAX_N];
11 PII a[MAX_N];
12 int ans[MAX_N];
13 struct Node{
14     int ql,qr,qh,idx;
15     bool operator<(const Node& a) const{
16         return qh<a.qh;
17     }
18 };
19 Node qq[MAX_N];
20 int T,n,m;
21 int ub;
22
23 void add(int i,int x){
24     while( i<=n ){
25         bit[i] += x;
26         i+=i&-i;
27     }
28 }
29
30 int sum(int i){
31     int res = 0;
32     while( i>0 ){
33         res += bit[i];
34         i -= i&-i;
35     }
36     return res;
37 }
38
39
40 int main(){
41     scanf("%d",&T);
42     int kase = 1;
43     while( T-- ){
44         memset(bit,0,sizeof(bit));
45         printf("Case %d:\n",kase++);
46         scanf("%d%d",&n,&m);
47         int ptr = 0;
48         for(int i=0;i<n;i++){
49             scanf("%d",&a[i].first);
50             a[i].second = i+1;
51         }
52         for(int i=0;i<m;i++){
53             scanf("%d%d%d",&qq[i].ql,&qq[i].qr,&qq[i].qh);
54             qq[i].idx = i;
55         }
56
57         sort(qq,qq+m);
58         sort(a,a+n);
59
60         int j=0;
61         for(int i=0;i<m;i++){
62             while(j<n && a[j].first<=qq[i].qh ){
63                 add(a[j].second,1);
64                 j++;
65             }
66             ans[qq[i].idx] = sum( qq[i].qr+1 ) - sum(qq[i].ql);
67         }
68
69         for(int i=0;i<m;i++){
70             printf("%d\n",ans[i]);
71         }
72
73     }
74     return 0;
75 }
时间: 2024-10-07 05:02:28

[HDU 4417] Super Mario (树状数组)的相关文章

HDU 4417 Super Mario (树状数组/线段树)

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory. Now the poor princess is in trouble agai

hdu4417 Super Mario 树状数组离线/划分树

http://acm.hdu.edu.cn/showproblem.php?pid=4417 Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2720    Accepted Submission(s): 1322 Problem Description Mario is world-famous plumber

hdu-4417 Super Mario(树状数组 + 划分树)

题目链接: Super Mario Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory. Now the poor princess is

ACM学习历程—HDU4417 Super Mario(树状数组 &amp;&amp; 离线)

Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory. Now the poor princess is in trouble again and Mario needs to save his lover. We regard the road to the boss’s castle as a line (

hdu 4417 Super Mario/树套树

原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可解吧,可弱弱的沙茶一直没弄懂其精髓,只好用树套树暴力碾压了 额树套树,线段树的每一个节点套一个sb树. 当查询[l,r]区间中的值小于等于H的个数,先用线段树找到相应的区间, 然后再查询该区间下对应的平衡树中小于等于H的个数,累加即可. 一直以为会超时,结果400+ms就过了,数据应该很弱吧(自己对

HDU 4417 Super Mario ( 超级马里奥 + 主席树 + 线段树/树状数组离线处理 + 划分树 )

HDU 4417 - Super Mario ( 主席树 + 线段树/树状数组离线处理 + 划分树 ) 这道题有很多种做法,我先学习的是主席树.后面陆续补上线段树离线和划分树 题目大意就是给定一个区间给定一个数列,每次要求你查询区间[L,R]内不超过K的数的数量 主席树做法: 最基本的是静态第k大,这里是求静态的 <= K,差不多,在Query操作里面需要修改修改 先建立size棵主席树,然后询问的时候统计的是 第R棵主席树中[1,K]的数量 - 第L-1棵主席树中[1,K]的数量 注意这里下标

HDU 1541 Stars (树状数组)

Problem Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given

HDU 3854 Glorious Array(树状数组)

题意:给一些结点,每个结点是黑色或白色,并有一个权值.定义两个结点之间的距离为两个结点之间结点的最小权值当两个结点异色时,否则距离为无穷大.给出两种操作,一种是将某个结点改变颜色,另一个操作是询问当前距离小于K的结点有多少对,K是一个定值. 思路:先求最初时候小于k的结点有多少对,然后每次改变颜色的时候,统计该点左侧和右侧各有多少同色和异色的结点(这一步使用树状数组),分别处理就行.另外需要预处理离某个结点最近的两个距离小于K的结点的位置. 代码写的略乱. #include<cstdio> #

HDU 3333 Turing Tree 树状数组 离线查询

题意: 给你一个数列,然后有n个查询,问你给定区间中不同数字的和是多少. 思路还是比较难想的,起码对于蒟蒻我来说. 将区间按照先右端点,后左端点从小到大排序之后,对于每个查询,我只要维护每个数字出现的最后一次就可以了(这个结论稍微想一下就可以证明是正确的). 然后就是简单的点更新,区间求和问题了- #include <cstdio> #include <cstring> #include <iostream> #include <map> #include