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 ...
随机推荐
- Pool thread stack traces: Thread[C3P0PooledConnectionPoolManager[identityToken->原因解决办法
今天本地连接测试库测试,发现早上还是好的,下午就崩了,报这个错,使用的是c3po连接池: , 纠结了好久,发现是数据库连接用光了,很多人都在连,果断换了本地库,好使了,看百度说把macPoolSizz ...
- 【codeforces】【比赛题解】#861 CF Round #434 (Div.2)
本来是rated,现在变成unrated,你说气不气. 链接. [A]k-凑整 题意: 一个正整数\(n\)的\(k\)-凑整数是最小的正整数\(x\)使得\(x\)在十进制下末尾有\(k\)个或更多 ...
- torch.Tensor.view (Python method, in torch.Tensor)
返回具有相同数据但大小不同的新张量.返回的张量共享相同的数据,必须具有相同数量的元素,但可能有不同的大小. Example >>> x = torch.randn(4, 4) > ...
- Apple Notification Center Service--ANCS【转】
Apple Notification Center Service 转自:http://studentdeng.github.io/blog/2014/03/22/ancs/ MAR 22ND, 20 ...
- aarch64_g3
glibc-langpack-wal-2.25-6.fc26.aarch64.rpm 2017-06-20 17:08 210K fedora Mirroring Project glibc-lang ...
- Fiddler是最强大最好用的Web调试工具
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...
- 使用脚本实现killproc的功能
在shell提示符号下输入type killproc,会发现killproc实在 /sbin/目录下,通过man killproc可以查看这个脚本(姑且这么称为脚本)的用法,现在,把这个脚本的实现过程 ...
- 如何用纯CSS布局两列,一列固定宽度,另一列自适应?
大家都知道好多网站都是左右布局的,很多公司在笔试和面试环节也常常问这个问题.一个去网易的师兄说14年腾讯面试的时候问过这个问题,网易在笔试和面试时候也问过这个问题,还有很多互联网公司也都涉及到这个问题 ...
- Java 中判断字符串是否为空
public class TestString { public static void main(String[] args) { String abc = null; //先判断是否为null再判 ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...