在一个二维平面里,有N个点,第i个点的坐标是(X[i], Y[i]),坐标的值都是整数。接下来输入P个矩形,第i个矩形的左下角坐标是:(X1[i], Y1[i]), 右上角的坐标是(X2[i], Y2[i])。你的任务:每读入一个矩形信息,输出有多少个点恰好处于这个矩形的边框上(在矩形内部的点不算)?
输入格式:
第一行:一个整数N (1 ≤ N ≤ 300 000)。
第二至N+1行,每行两个整数X[i] 和 Y[i],表示在坐标 (X[i], Y[i])处有一个点。1 <= X[i], Y[i] <= 10^9.
第N+2行:一个整数P. 1 ≤ P ≤ 100 000.
接下来有P行,每行4个整数,X1, Y1, X2 ,Y2,描述一个矩形的信息。1 ≤ X1 < X2 ≤10^9, 1 ≤ Y1 < Y2 ≤10^9.
输出格式:
共P行,第i行表示第i个矩形的边框上有多少个点。
|
输入样例: sum.in |
输出样例: sum.out |
输入数据图表 |
|
6 1 2 3 2 2 3 2 5 4 4 6 3 4 2 2 4 4 2 2 6 5 3 3 5 6 5 1 6 6
|
3 4 0 1
|
|
|
|
|
|
二分二分多分几遍
#include<fstream>
#include<cstdlib>
#define maxn 300010
#define maxp 100010
using namespace std;
ifstream cin("sum.in");
ofstream cout("sum.out");
int n,p,t;
struct nn
{
int x,y;
}d[maxn],e[maxn];
int ans;
int cmpx(const void *a,const void *b)
{
if ((*(nn *)a).x!=(*(nn *)b).x) return (*(nn *)a).x-(*(nn *)b).x;
else return (*(nn *)a).y-(*(nn *)b).y;
}
int cmpy(const void *a,const void *b)
{
if ((*(nn *)a).y!=(*(nn *)b).y) return (*(nn *)a).y-(*(nn *)b).y;
else return (*(nn *)a).x-(*(nn *)b).x;
}
int findx(int x,int y1,int y2)
{
int l=1,r=n,mid,k=0,t1=0,t2=0;
while (l<=r)
{
mid=(l+r)>>1;
if (d[mid].x<x) l=mid+1;
else if (d[mid].x>x) r=mid-1;
else if (d[mid].x==x)
{
if (d[mid].y>y2) r=mid-1; else {k=mid;l=mid+1;}
}
}
if (!k) return 0;
t1=k;
l=1;r=n;k=0;
while (l<=r)
{
mid=(l+r)>>1;
if (d[mid].x<x) l=mid+1;
else if (d[mid].x>x) r=mid-1;
else if (d[mid].x==x)
{
if (d[mid].y>=y1) {k=mid;r=mid-1;}
else l=mid+1;
}
}
t2=k;
if (!t1||!t2) return 0;
k=t1-t2+1;
if (k>0)
return k;else return 0;
}
int findy(int y,int x1,int x2)
{
int l=1,r=n,mid,k=0,t1=0,t2=0;
while (l<=r)
{
mid=(l+r)>>1;
if (e[mid].y<y) l=mid+1;
else if (e[mid].y>y) r=mid-1;
else if (e[mid].y==y)
{
if (e[mid].x>=x2) r=mid-1;
else {k=mid;l=mid+1;}
}
}
if (k==0) return 0;
t1=k;
l=1;r=n;k=0;
while (l<=r)
{
mid=(l+r)>>1;
if (e[mid].y<y) l=mid+1;
else if (e[mid].y>y) r=mid-1;
else if (e[mid].y==y)
{
if (e[mid].x>x1) {k=mid;r=mid-1;}
else l=mid+1;
}
}
t2=k;
if (!t1||!t2) return 0;
k=t1-t2+1;
if (k>0)
return k;else return 0;
}
int main()
{
int i;
cin>>n;
for (i=1;i<=n;i++) cin>>d[i].x>>d[i].y;
memcpy(e,d,sizeof(d));
qsort(d+1,n,sizeof(nn),cmpx);
qsort(e+1,n,sizeof(nn),cmpy);
cin>>p;
int x1,x2,y1,y2;
for (i=1;i<=p;i++)
{
ans=0;
cin>>x1>>y1>>x2>>y2;
if (x1>x2) swap(x1,x2);
if (y1>y2) swap(y1,y2);
ans+=findx(x1,y1,y2);
ans+=findx(x2,y1,y2);
ans+=findy(y1,x1,x2);
ans+=findy(y2,x1,x2);
cout<<ans<<endl;
}
return 0;
}
浙公网安备 33010602011771号