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 【线段树+离线处理】的更多相关文章

  1. J - Super Mario HDU - 4417 线段树 离线处理 区间排序

    J - Super Mario HDU - 4417 这个题目我开始直接暴力,然后就超时了,不知道该怎么做,直接看了题解,这个习惯其实不太好. 不过网上的思路真的很厉害,看完之后有点伤心,感觉自己应该 ...

  2. hdu 4288 线段树+离线+离散化

    http://acm.hdu.edu.cn/showproblem.php?pid=4288 開始的时候,果断TLE,做的方法是,线段树上只维护%5==3的坐标,比方1 2 3 4 5 6 7  假设 ...

  3. 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 ...

  4. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  8. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. JavaScript 运算符的优先级

    ㈠逗号(,)运算符 ⑴使用 , 可以分割多个语句,一般可以在声明多个变量时使用 , : ⑵使用 , 运算符同时声明多个变量    // var a , b , c ; ⑶可以同时声明多个变量并赋值   ...

  2. MFC的静态链接、动态链接

    项目属性页面可以查看更改编译方式,推荐使用静态编译.也可以在创建MFC项目时选择静态编译. 标准Windows库,使用的是系统API,Win32是面向API的编程平台.Win32项目使用的是此编译方式 ...

  3. hover([over,]out)

    hover([over,]out) 概述 一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法.这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配 ...

  4. asp.net实现浏览器大文件分片上传

    IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头. 一. 两个必要响应头Accept-Ranges.ETag 客户端每次提交下载请求时,服务 ...

  5. 一个参数既可以是const还可以是volatile

    可以的,例如只读的状态寄存器.它是volatile因为它可能被意想不到地改变.它是const因为程序不应该试图去修改它. 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器 ...

  6. ZOJ - 4114 Flipping Game

    ZOJ - 4114 Flipping Game 题目大意:给出两个串s,t,n个灯泡的序列,1代表开着,0代表关着,一共操作k轮,每轮改变m个灯泡的状态,问最终能把s串变成t串的方案数. 坤神题解. ...

  7. assert 笔记

    目录 什么是assert? assert使用 assert错误使用 什么是assert? Python 的 assert 语句是一个 debug 的好工具,主要用于测试一个条件是否满足.如果测试的条件 ...

  8. 使用Xshell链接阿里云服务

    1.下载Xshell,进入xshell官网 https://xshell.en.softonic.com/,选择免费版本进行下载,在该页面https://www.netsarang.com/zh/fr ...

  9. LeetCode 279. 完全平方数(Perfect Squares)

    题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释 ...

  10. mac 安装laravel

    安装laravel之前先安装composer 使用 curl 指令下载: curl -sS https://getcomposer.org/installer | php 或是沒有安裝 curl ,也 ...