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