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;}