HDU 4417 【线段树+离线处理】
http://acm.hdu.edu.cn/showproblem.php?pid=4417
题意:找出给定区间内,有多少个数小于等于给定的数。用线段树维护的话会超时,要用到线段树的离线操作,对询问与数列都进行从小到大的排序,记录下标。从第一个询问开始,遍历数列,满足小于等于就插入到线段树中相应的位置。答案即为当前线段树中有多少个值。转换成了区间和,记录答案,最后一遍输出。
代码如下:
- #include<stdio.h>
- #include<algorithm>
- const int MAXN = 1e5 + ;
- using namespace std;
- int n, m;
- int ANS[MAXN];
- struct Node
- {
- int id, h;
- }node[MAXN];
- bool cmp1(Node a, Node b)
- {
- return a.h < b.h;
- }
- struct Tree
- {
- int l, r, num;
- }t[MAXN * ];
- struct Query
- {
- int l, r, limit, id;
- }q[MAXN];
- bool cmp2(Query a, Query b)
- {
- return a.limit < b.limit;
- }
- void build(int l, int r, int k)
- {
- t[k].l = l, t[k].r = r, t[k].num = ;
- if(l == r)
- return ;
- int mid = (l + r) / ;
- build(l, mid, * k);
- build(mid + , r, * k + );
- }
- void up_date(int id, int k)
- {
- if(t[k].l == t[k].r)
- {
- t[k].num = ;
- return ;
- }
- int mid = (t[k].l + t[k].r) / ;
- if(id <= mid)
- up_date(id, * k);
- else
- up_date(id, * k + );
- t[k].num = t[ * k].num + t[ * k + ].num;
- }
- int query(int f_l, int f_r, int k)
- {
- if(f_l <= t[k].l && f_r >= t[k].r)
- return t[k].num;
- int mid = (t[k].l + t[k].r) / ;
- if(f_l > mid)
- return query(f_l, f_r, * k + );
- else if(f_r <= mid)
- return query(f_l, f_r, * k);
- else
- {
- return query(f_l, mid, * k) + query(mid + , f_r, * k + );
- }
- }
- int main()
- {
- int T, k = ;
- scanf("%d", &T);
- while(T --)
- {
- scanf("%d%d", &n, &m);
- build(, n, );
- for(int i = ; i <= n; i ++)
- {
- scanf("%d", &node[i].h);
- node[i].id = i;
- }
- sort(node + , node + + n, cmp1);
- // for(int i = 1; i <= n; i ++)
- // printf("%d\n", node[i].h);
- printf("Case %d:\n", k ++);
- for(int i = ; i <= m; i ++)
- {
- scanf("%d%d%d", &q[i].l, &q[i].r, &q[i].limit);
- q[i].l ++, q[i].r ++;
- q[i].id = i;
- }
- sort(q + , q + + m, cmp2);
- int j = ;
- for(int i = ; i <= m; i ++)
- {
- while(node[j].h <= q[i].limit && j <= n)
- {
- up_date(node[j].id, );
- j ++;
- }
- ANS[q[i].id] = query(q[i].l, q[i].r, );
- }
- for(int i = ; i <= m; i ++)
- printf("%d\n", ANS[i]);
- }
- return ;
- }
HDU 4417 【线段树+离线处理】的更多相关文章
- J - Super Mario HDU - 4417 线段树 离线处理 区间排序
J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...
- hdu 4288 线段树+离线+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7 假设 ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- 装饰者模式(Decorator)---结构型
1 基础知识 定义:在不改变原有对象的基础上,将功能附加到对象上即动态地给一个对象添加一些额外的职责.特征:提供了比继承更有弹性的替代方案. 本质:动态组合. 使用场景:扩展一个类的功能或给一个类添加 ...
- 初入SG-UAP
初入SG-UAP SpriderMan 关注 2019.06.19 14:10 字数 1130 阅读 10评论 0喜欢 0 初次接触SG-UAP,将自己的见解以文字形式记录下来,希望能对初入的伙伴们有 ...
- 如何打开Mac OSX 终端的颜色
如何打开Mac OSX 终端的颜色 听语音 | 浏览:8453 | 更新:2015-12-15 16:48 1 2 3 4 5 6 7 分步阅读 Mac 终端默认颜色很单一,文件夹和文件无法区分,可以 ...
- [Luogu] 树
https://www.luogu.org/problemnew/show/P4092 树剖 + 线段树区间修改,单点查询 #include <bits/stdc++.h> using n ...
- STL中的BITSET运用
胡小兔的OI博客C++ bitset 常用函数及运算符 对于一个叫做foo的bitset: foo.size() 返回大小(位数) foo.count() 返回1的个数 foo.any() 返回是否有 ...
- 数据结构实验之栈与队列一:进制转换(SDUT 2131)
题目链接 题解: 特判一下n==0的时候. #include <bits/stdc++.h> using namespace std; int a[1000]; int main() { ...
- Maximum GCD(UVA 11827)
Problem:Given the N integers, you have to find the maximum GCD (greatest common divisor) of every po ...
- 集合家族——ArrayList
一.概述: ArrayList 是实现 List 接口的动态数组,所谓动态就是它的大小是可变的.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些 ...
- Django基础之cookie
1. Cookie 1.1 Cookie的由来 大家都知道HTTP协议是无状态的.无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系, 它不会受前面的请求响应情况 ...
- 使用python播放音乐
1.首先安装pygame,pip install pygame 2.上代码: import time import pygame #音乐路径 filepath=r"C:\Users\1473 ...