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 ...
随机推荐
- PHP mysqli_fetch_object() 函数
定义和用法 mysqli_fetch_object() 函数从结果集中取得当前行,并作为对象返回. 注释:该函数返回的字段名是区分大小写的. <?php // 假定数据库用户名:root,密码: ...
- BZOJ 1097: [POI2007]旅游景点atr 状态压缩+Dijkstra
题解: $k<=20,$ 考虑状压dp. 从 $1$ 号点走到 $n$ 号点经过的点的个数可能会非常多,但是强制要求经过的点一共才 $20$ 个. 而我们发现这个题好就好在可以经过某个城市,而不 ...
- 洛谷 P1355 神秘大三角(计算几何基础)
P1355 神秘大三角 题目提供者yeszy 标签 福建省历届夏令营 难度 普及/提高- 题目描述 判断一个点与已知三角形的位置关系. 输入输出格式 输入格式: 前三行:每行一个坐标,表示该三角形的三 ...
- Python字典元素的增加删除和取出字典所有的键和值
一.增加一个或多个元素 d = {'a': 1} d.update(b=2) #也可以 d.update({‘b’: 2}) print(d) # {'a': 1, 'b': 2} d['e'] = ...
- Raspberry Pi 4B基本设置
目录 一.SSH登录Raspberry Pi 二.开启VNC服务 三.将SD卡分区扩展 四.修改软件源 一.SSH登录Raspberry Pi 完成系统烧录后,就需要登录Raspberry Pi,此时 ...
- TCP拥塞控制算法
转自浅谈TCP拥塞控制算法 本篇文章介绍了几种经典的TCP拥塞控制算法,包括算法原理及各自适用场景. 回顾上篇文章:浅谈 redis 延迟 前言 TCP 通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的 ...
- 【VMWare】虚拟机启动遇到黑屏,在命令行窗口输入netsh winsock reset并不管用 重新启动客户机就好了
现象:虚拟机启动后是莫名其妙的黑屏,而且它上面安装的MySql也无法访问了. 处置:上网百度方案,看到大多数网文推荐:“以管理员身份打开cmd,输入netsh winsock reset,然后重启机器 ...
- 负载均衡 | Nginx+Tomcat 动静分离实现负载均衡
0.前期准备 使用Debian环境.安装Nginx(默认安装),一个web项目,安装tomcat(默认安装)等. 1.一份Nginx.conf配置文件 基本配置这个文件,就可以实现负载了.但是里面的各 ...
- eclipse syso 自动补全设置方法
eclipse syso 自动补全设置方法 转 https://blog.csdn.net/sinat_23536373/article/details/76512390 经常遇到打”sys ...
- css sprite 雪碧图
使用雪碧图的目的:有时为了美观,我们会使用一张图片来代替一些小图标,但是一个网页可能有很多很多的小图标,浏览器在显示页面的时候,就需要像服务器发送很多次访问请求, 这样一来,一是造成资源浪费,二是会导 ...