在一个二维平面里,有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; }