hdu 4417 区间内比h小的数 线段树
题意求区间内比h小的数的个数
将所有的询问离线读入之后,按H从小到大排序。然后对于所有的结点也按从小到大排序,然后根据查询的H,将比H小的点加入到线段树,然后就是一个区间和.
2015-07-27:专题训练到此
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
using namespace std;
const int MAXN=+;
int sum[MAXN<<],lsum[MAXN<<],rsum[MAXN<<];
int n,m,tt;
struct Node
{
int L,R,H;
int id;
void in(int w)
{
scanf("%d%d%d",&L,&R,&H);
L++,R++;
id=w;
}
}node[MAXN];
struct No
{
int val;
int id;
void in(int w)
{
scanf("%d",&val);
id=w;
}
}no[MAXN];
bool cmp1(Node a,Node b)
{
return a.H<b.H;
}
bool cmp2(No a,No b)
{
return a.val<b.val;
}
int pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void update(int pos,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=;
return;
}
if(pos<=mid) update(pos,lson);
else update(pos,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int ans=;
if(L<=mid) ans+=query(L,R,lson);
if(R>mid) ans+=query(L,R,rson);
return ans;
}
int a[MAXN];
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&tt);
int ca=;
while(tt--)
{
scanf("%d%d",&n,&m);
cl(sum);
for(i=;i<=n;i++)
{
no[i].in(i);
}
sort(no+,no+n+,cmp2);
for(i=;i<=m;i++)
{
node[i].in(i);
}
sort(node+,node+m+,cmp1);
int tot=;
for(i=;i<=m;i++)
{
while(node[i].H>=no[tot].val)
{
update(no[tot].id,root);
tot++;
}
a[node[i].id]=query(node[i].L,node[i].R,root);
}
printf("Case %d:\n",ca++);
for(i=;i<=m;i++)
{
printf("%d\n",a[i]);
}
}
}
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root 1,n,1
#define mid ((l+r)>>1)
#define ll long long
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
using namespace std;
const int MAXN=;
int sum[MAXN<<],o[MAXN];
int n,m,t;
struct Node
{
int L,R,H;
int id;
void in(int i)
{
scanf("%d%d%d",&L,&R,&H);
L++,R++;
id=i;
}
}node[MAXN];
struct Num
{
int val,id;
void in(int i)
{
scanf("%d",&val);
id=i;
}
}num[MAXN];
bool cmp1(Num a,Num b)
{
return a.val<b.val;
}
bool cmp2(Node a,Node b)
{
return a.H<b.H;
}
void pushup(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
}
void build(int l,int r,int rt)
{
sum[rt]=;
if(l==r) return;
build(lson);
build(rson);
}
void update(int pos,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=;
return;
}
if(pos<=mid) update(pos,lson);
if(pos>mid) update(pos,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
return sum[rt];
}
int ans=;
if(L<=mid) ans+=query(L,R,lson);
if(R>mid) ans+=query(L,R,rson);
return ans;
}
int main()
{
int i,j,k,q,tt;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d",&tt);
int ca=;
while(tt--)
{
scanf("%d%d",&n,&m);
build(root);
for(i=;i<=n;i++)
{
num[i].in(i);
}
for(i=;i<m;i++)
{
node[i].in(i);
}
sort(num+,num+n+,cmp1);
sort(node,node+m,cmp2);
i=,j=;
while(i<m)
{
while(j<=n)
{
if(node[i].H<num[j].val) break;
update(num[j].id,root);
j++;
}
while(i<m)
{
if(j<=n&&node[i].H>=num[j].val) break;
o[node[i].id]=query(node[i].L,node[i].R,root);
i++;
}
}
printf("Case %d:\n",ca++);
for(i=;i<m;i++)
{
printf("%d\n",o[i]);
}
}
return ;
}
hdu 4417 区间内比h小的数 线段树的更多相关文章
- hdu 4417 区间内比h小的数 划分树
二分查找最近一个比h小的数 #include<cstdio> #include<iostream> #include<algorithm> #include< ...
- POJ- 2104 hdu 2665 (区间第k小 可持久化线段树)
可持久化线段树 也叫函数式线段树也叫主席树,其主要思想是充分利用历史信息,共用空间 http://blog.sina.com.cn/s/blog_4a0c4e5d0101c8fr.html 这个博客总 ...
- 区间第K小——可持久化线段树模板
概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...
- 区间第k大问题 权值线段树 hdu 5249
先说下权值线段树的概念吧 权值平均树 就是指区间维护值为这个区间内点出现次数和的线段树 用这个加权线段树 解决第k大问题就很方便了 int query(int l,int r,int rt,int k ...
- HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)
题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...
- hdu 5266 pog loves szh III(lca + 线段树)
I - pog loves szh III Time Limit:6000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I ...
- HDU 2795 Billboard(宣传栏贴公告,线段树应用)
HDU 2795 Billboard(宣传栏贴公告,线段树应用) ACM 题目地址:HDU 2795 Billboard 题意: 要在h*w宣传栏上贴公告,每条公告的高度都是为1的,并且每条公告都要 ...
- HDU 4027 Can you answer these queries?(线段树区间开方)
Can you answer these queries? Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65768/65768 K ...
- HDU 4521 小明系列问题——小明序列 (线段树维护DP)
题目地址:HDU 4521 基本思路是DP.找前面数的最大值时能够用线段树来维护节省时间. 因为间隔要大于d. 所以能够用一个队列来延迟更新,来保证每次询问到的都是d个之前的. 代码例如以下: #in ...
随机推荐
- Struts2笔记1:--Struts2原理、优点、编程流程、6大配置文件以及核心配置文件struts.xml
Struts2原理(底层使用的是Servlet的doFilter方法): Struts2优点: 第一个Struts程序: 在开发Struts程序之前,首先要导入额外的jar包,基本需求的是14个jar ...
- jquery easyui 扩展验证
$.extend($.fn.validatebox.defaults.rules, { idcard : {// 验证身份证 validator : function(value) ...
- zookeeper zkClient api 使用
操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...
- C# 反射获取和设置值
/// <summary> /// 遍历泛型 /// </summary> /// <typeparam name="T"></typep ...
- Runtime - 消息发送原理
Runtime - 消息发送原理. Objective-C运行时的核心就在于消息分派器objc_msgSend,消息分派器把选择器映射为函数指针,并调用被引用的函数. 要想理解objc_msgSend ...
- MongoDB安全:创建第1个、第2个、第3个用户
Windows 10家庭中文版,MongoDB3.6.3, 前言 使用mongod命令基于某个空白文件夹(存放数据)启动MongoDB服务器时,要是没有使用--auth选项,启动后,任何客户端是可以无 ...
- MongoDB官方文档结构
本文展示MongoDB 3.6.4.0的官方Server文档的结构图——一眼可见完整的知识脉络图.不过,MongoDB除了Server的文档外,还有DRIVERS.CLOUD.TOOLS.DUIDES ...
- spring boot 中使用redis session
spring boot 默认的httpsession是存在内存中.这种默认方式有几个缺点:1.当分布式部署时,存在session不一致的问题:2.当服务重启时session就会丢失,这时候用户就需要重 ...
- Robust Mesh Watermarking
之前看了一篇题为"Robust Mesh Watermarking"的论文,查阅资料的时候发现了一篇与之很相似的名为"三维模型数字水印系统的设计与实现"的中文论 ...
- nginx防止DDOS攻击
防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈.DDOS的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构 ...