Bombing
HDU - 4022
题意:给出n个目标,m个炸弹,每个炸弹可以炸一行或者一列,问每一个炸弹摧毁了多少目标。
可以用STL做,也可以二分做。
这是kuangbin的代码~
用STL很简洁,但是慢
1 /* 2 HDU 4022 3 G++ 1296ms 4 5 6 */ 7 8 9 #include<stdio.h> 10 #include<iostream> 11 #include<set> 12 #include<map> 13 #include<algorithm> 14 using namespace std; 15 16 // 建立一个 map,从 int 到 一个 multiset 容器的映射 17 typedef map<int,multiset<int> > line;// 两个>间一定要加个空格 18 map<int,multiset<int> >mx;//定义x坐标对应的map 19 map<int,multiset<int> >my;//定义y坐标对应的map 20 21 int bomb(line &x,line &y,int pos) 22 { 23 int ret=x[pos].size(); 24 multiset<int>::iterator it;//这个学习下 25 for(it=x[pos].begin();it!=x[pos].end();it++) 26 y[*it].erase(pos);//multiset 去除一个元素 27 x[pos].clear();//清空multiset 28 return ret; 29 } 30 int main() 31 { 32 int n,m; 33 int c,d; 34 int tx,ty; 35 while(scanf("%d%d",&n,&m)!=EOF) 36 { 37 if(n==0&&m==0)break; 38 mx.clear(); 39 my.clear(); 40 for(int i=0;i<n;i++) 41 { 42 scanf("%d%d",&tx,&ty); 43 mx[tx].insert(ty); 44 my[ty].insert(tx); 45 } 46 for(int i=0;i<m;i++) 47 { 48 scanf("%d%d",&c,&d); 49 int ans; 50 if(c==0) ans=bomb(mx,my,d); 51 else ans=bomb(my,mx,d); 52 printf("%d\n",ans); 53 } 54 printf("\n"); 55 } 56 return 0; 57 }
下面这个是二分做的,更快一些
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=100010; 4 struct Node{ 5 int v,id; 6 bool operator < (const Node& a)const{ 7 return v<a.v; 8 } 9 }x[maxn],y[maxn]; 10 int hs[maxn]; 11 int n,m; 12 int bin(Node* x,int v){ 13 int L=0,R=n; 14 while(L<=R){ 15 int m=(L+R)>>1; 16 if(x[m].v>=v) R=m-1; 17 else L=m+1; 18 } 19 return L; 20 } 21 int main(){ 22 23 while(scanf("%d%d",&n,&m)&&(n||m)){ 24 memset(hs,0,sizeof(hs)); 25 int a,b; 26 for(int i=0;i<n;i++){ 27 scanf("%d%d",&a,&b); 28 x[i].v=a;y[i].v=b; 29 x[i].id=y[i].id=i; 30 } 31 sort(x,x+n); 32 sort(y,y+n); 33 for(int i=0;i<m;i++){ 34 scanf("%d%d",&a,&b); 35 int ans=0; 36 if(a==0){ 37 int bom=bin(x,b); 38 for(int i=bom;i<n;i++){ 39 if(x[i].v!=b) break; 40 if(hs[x[i].id]) continue; 41 hs[x[i].id]=1; 42 ans++; 43 } 44 45 }else{ 46 int bom=bin(y,b); 47 for(int i=bom;i<n;i++){ 48 if(y[i].v!=b) break; 49 if(hs[y[i].id]) continue; 50 hs[y[i].id]=1; 51 ans++; 52 } 53 } 54 printf("%d\n",ans); 55 } 56 puts(""); 57 } 58 return 0; 59 }