Interval Noj
Interval
时间限制:2000 ms | 内存限制:65535 KB
描述
There are n(1 <= n <= 100000) intervals [ai, bi] and m(1 <= m <= 100000) queries, -100000 <= ai <= bi <= 100000 are integers.
Each query contains an integer xi(-100000 <= x <= 100000). For each query, you should answer how many intervals convers xi.
输入
The first line of input is the number of test case.
For each test case,
two integers n m on the first line,
then n lines, each line contains two integers ai, bi;
then m lines, each line contains an integer xi.
输出
m lines, each line an integer, the number of intervals that covers xi.
样例输入
2
3 4
1 3
1 2
2 3
0
1
2
3
1 3
0 0
-1
0
1样例输出
0
2
3
2
0
1
0
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 100010
int Z[N],F[N];
int lowbit(int n){
return n&(-n);
}
void update(int x,int n,int value){
while(n>0){
if(x>0)
Z[n]+=value;
else
F[n]+=value;
n-=lowbit(n);
}
}
int getsum(int x,int n){
int s=0;
while(n<N){
if(x>0)
s+=Z[n];
else
s+=F[n];
n+=lowbit(n);
}
return s;
}
int main()
{
//freopen("in.txt","r",stdin);
int t,n,m,a,b,c,i;
scanf("%d",&t);
while(t--){
memset(Z,0,sizeof(Z));
memset(F,0,sizeof(F));
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
if(a==0 && b==0){F[0]+=1;}
else if(a==0 && b!=0){ F[0]+=1;a+=1;}
else if(a!=0 && b==0) { F[0]+=1;b+=1;}
if(a>0){
update(1,b,1);
update(1,a-1,-1);
}
else if(a<0 && b>0){
F[0]+=1;
update(0,-a,1);
update(1,b,1);
}
else if(a<0 && b<0){
update(0,-a,1);
update(0,(-b-1),-1);
}
}
for(i=0; i<m; i++){
int s=0;
scanf("%d",&c);
if(c>0)
s=getsum(1,c);
else if(c<0)
s=getsum(0,-c);
else
s=F[0];
printf("%d\n",s);
}
}
return 0;
}
//采取的思路与士兵杀敌四一样,不同的是,还要给区间为负数的定义一个数组来存放,代码有点长,但很简单!
浙公网安备 33010602011771号