「NOIP模拟赛」轰炸
「题目描述」
平面上有n个目标,你驾驶着一辆轰炸机要轰炸这些目标,由于技术限制,每次轰炸的目标必须在一条直线上,请你写个程序统计每次能摧毁多少个目标。
注意,目标不能重复计数,也就是此次轰炸后目标下次就消失了。
「输入格式」
第一行两个数n,m,代表目标个数和轰炸的次数
下面n行,每行两个整数(x,y),代表每个目标的坐标
再下面m行,第一个数为0或1,0表示此次轰炸是一条水平的直线,1则表示竖直
第二个数t表示此直线的位置(x = t或者y = t)
「输出格式」
m行,表示每次轰炸的目标数
「样例输入」
3 2
1 2
1 3
2 3
0 1
1 3
「样例输出」
2
1
「数据规模」
30% n,m<=5000
100% n,m <= 100000
|x|, |y| <= 10^9
「时间限制」
1s
题解
离散化以后将x,y坐标分别排序,记录某一x坐标/y坐标的个数
然后随便yy个做法,只要注意不能反复删除同一行/列就行了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #define inf 1000000000 #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m; int dx[100005],dy[100005],nx[100005],ny[100005]; int lx[100005],rx[100005],ly[100005],ry[100005]; struct data{int x,y;}a[100005],b[100005]; inline bool cx(data a,data b) { return a.x<b.x; } inline bool cy(data a,data b) { return a.y<b.y; } void calx(int x) { if(nx[x]<=0){puts("0");return;} printf("%d\n",nx[x]);nx[x]=0; for(int i=lx[x];i<=rx[x];i++)ny[a[i].y]--; } void caly(int y) { if(ny[y]<=0){puts("0");return;} printf("%d\n",ny[y]);ny[y]=0; for(int i=ly[y];i<=ry[y];i++)nx[b[i].x]--; } int main() { //freopen("bomb.in","r",stdin); //freopen("bomb.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++) { a[i].x=dx[i]=read(),a[i].y=dy[i]=read(); } sort(dx+1,dx+n+1);sort(dy+1,dy+n+1); for(int i=1;i<=n;i++) { a[i].x=lower_bound(dx+1,dx+n+1,a[i].x)-dx; a[i].y=lower_bound(dy+1,dy+n+1,a[i].y)-dy; nx[a[i].x]++;ny[a[i].y]++; b[i]=a[i]; } sort(a+1,a+n+1,cx);sort(b+1,b+n+1,cy); for(int i=1;i<=n;i++) { if(!lx[a[i].x])lx[a[i].x]=i;rx[a[i].x]=i; if(!ly[b[i].y])ly[b[i].y]=i;ry[b[i].y]=i; } for(int i=1;i<=m;i++) { int f=read(),t=read(); if(!f) { int x=lower_bound(dx+1,dx+n+1,t)-dx; if(dx[x]!=t){puts("0");continue;} calx(x); } else { int y=lower_bound(dy+1,dy+n+1,t)-dy; if(dy[y]!=t){puts("0");continue;} caly(y); } } return 0; } |
Subscribe