【二分】hdu 4022

来源:互联网 发布:linux rpm 路径 编辑:程序博客网 时间:2024/05/16 12:28

SB的二分,O(nlgn),其实比赛时已经这样想过,不过还是懒得去敲

 

#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;#define LL long long#define PI acos(-1.0)#define N  100005#define MAX INT_MAX#define MIN INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)struct node{    int x,y;    int id;}xx[N],yy[N];bool vis[N];int n,m;int gaox(int k){    int l=1,r=n,mid;    while(l<r){        mid=(l+r)>>1;        if(xx[mid].x>=k)        r=mid;        else        l=mid+1;    }    return r;}int gaoy(int k){    int l=1,r=n,mid;    while(l<r){        mid=(l+r)>>1;        if(yy[mid].y>=k)        r=mid;        else        l=mid+1;    }    return r;}bool cmpx(node a,node b){    if(a.x==b.x)return a.y<b.y;    return a.x<b.x;}bool cmpy(node a,node b){    if(a.y==b.y)return a.x<b.x;    return a.y<b.y;}int main(){    while(scanf("%d%d",&n,&m) && (n+m)){        int i,j;        for(i=1;i<=n;i++){            scanf("%d%d",&xx[i].x,&xx[i].y);            yy[i].x=xx[i].x;            yy[i].y=xx[i].y;            xx[i].id=yy[i].id=i;            vis[i]=0;        }        sort(xx+1,xx+n+1,cmpx);        sort(yy+1,yy+1+n,cmpy);        while(m--){            int a,k;            scanf("%d%d",&a,&k);            int cnt=0;            if(a==0){                j=gaox(k);                for(i=j;i<=n;i++){                    if(xx[i].x!=k)break;                    if(!vis[xx[i].id] && xx[i].x==k){                    cnt++;                    vis[xx[i].id]=1;                    }                }            }            else{                j=gaoy(k);                for(i=j;i<=n;i++){                    if(yy[i].y!=k)break;                    if(!vis[yy[i].id] && yy[i].y==k){                    cnt++;                    vis[yy[i].id]=1;                    }                }            }            printf("%d\n",cnt);        }        puts("");//Output a blank line after each test case.    }    return 0;}

原创粉丝点击