花儿朵朵
时间限制:1000 ms | 内存限制:65535 KB
难度:5
- 描述
- 春天到了,花儿朵朵盛开,hrdv是一座大花园的主人,在他的花园里种着许多种鲜花,每当这个时候,就会有一大群游客来他的花园欣赏漂亮的花朵,游客们总是会询问,某个时间有多少种花儿同时在盛开着?hrdv虽然知道每种花儿的开花时间段,但是他不能很快的答出游客的问题,你能编写一个程序帮助他吗?
- 输入
- 第一行有个整数t,表示有t组测试数据,每组测试数据第一行为两个整数n,m(0<n<100000,0<m<100000);随后有n行,每一行有两个整数x,y(0<x<y<1000000000),表示这一种花的盛开时间是从x到y;随后有m行,每行有一个整数,代表游客询问的时间。
- 输出
- 对于每次游客的询问,输出一个整数在单独的一行,表示这个时间盛开的花有多少种。
- 样例输入
-
2 1 1 5 10 4 2 3 1 4 4 8 1 4 6
- 样例输出
-
0 1 2 1 解题思路:先把所给的值都离散化后再操作。然后就是插线问点了。
#include<bits/stdc++.h> using namespace std; const int maxn=120000; #define mid (L+R)/2 #define lson rt*2,L,mid #define rson rt*2+1,mid+1,R int a[maxn*2],aa[maxn*2],a_[maxn*2]; int x[maxn*2],y[maxn*2],q[maxn]; int f_num[maxn*4]; int discretization(int *tm,int l,int r,int key){ int m; //离散化 while(l<=r){ m=(l+r)/2; if(tm[m]<key){ l=m+1; }else if(tm[m]>key){ r=m-1; }else{ return m; } } } void update(int rt,int L,int R,int l_ran,int r_ran){ if(l_ran<=L&&R<=r_ran){ //区间更新 f_num[rt]+=1; return ; } if(l_ran<=mid){ update(lson,l_ran,r_ran); } if(r_ran>mid){ update(rson,l_ran,r_ran); } } void PushDown(int rt){ f_num[rt*2]+=f_num[rt]; f_num[rt*2+1]+=f_num[rt]; f_num[rt]=0; } int query(int rt,int L,int R,int v){ //单点查询 if(L==R){ return f_num[rt]; } if(f_num[rt]!=0) PushDown(rt); if(mid>=v){ return query(lson,v); } if(mid<v){ return query(rson,v); } } int main(){ int t; scanf("%d",&t); while(t--){ memset(f_num,0,sizeof(f_num)); int n,m,tmp; scanf("%d%d",&n,&m); int num_a=n*2+m; for(int i=0;i<num_a;i++){ scanf("%d",&tmp); a[i]=tmp; aa[i]=tmp; } sort(a,a+num_a); int num=0; a_[num++]=a[0]; for(int i=1;i<num_a;i++){ if(a[i]!=a[i-1]){ a_[num++]=a[i]; } } int num_x=0,num_y=0,num_q=0,nn=0; for(int i=0;i<n*2;i++){ if(i%2==0){ x[num_x++]=discretization(a_,0,num-1,aa[i])+1; if(nn<x[num_x-1]){ nn=x[num_x-1]; } }else{ y[num_y++]=discretization(a_,0,num-1,aa[i])+1; if(nn<y[num_y-1]){ nn=y[num_y-1]; } } } for(int i=n*2;i<num_a;i++){ q[num_q++]=discretization(a_,0,num-1,aa[i])+1; } for(int i=0;i<n;i++){ update(1,1,nn,x[i],y[i]); } for(int i=0;i<num_q;i++){ int ans=query(1,1,nn,q[i]); printf("%d\n",ans); } } return 0; }
时间: 2024-11-03 22:23:18