题意:在n*m的地图上,一只虫子找地方睡觉,它一睡就会把自己拉伸到碰到砖块,问它睡觉地方种数。
题解:两次sort,依次统计横着睡和竖着睡的种数。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct data 6 { 7 int x,y; 8 }po[140000]; 9 bool comp_x(data a,data b) 10 { 11 if(a.x!=b.x) 12 return a.x<b.x; 13 else 14 return a.y<b.y; 15 } 16 bool comp_y(data a,data b) 17 { 18 if(a.y!=b.y) 19 return a.y<b.y; 20 else 21 return a.x<b.x; 22 } 23 int main() 24 { 25 int T; 26 for(scanf("%d",&T);T;T--) 27 { 28 int r,c,n,ans=0; 29 scanf("%d%d%d",&r,&c,&n); 30 for(int i=0;i<n;i++) 31 scanf("%d%d",&po[i].x,&po[i].y); 32 sort(po,po+n,comp_x); 33 int i,lx,ly; 34 for(i=0,ly=0,lx=1;i<n;i++) 35 { 36 if(po[i].x==lx) 37 { 38 if(po[i].y-ly>2) 39 ans++; 40 } 41 else 42 { 43 ans+=po[i].x-lx-1; 44 if(c-ly>=2) 45 ans++; 46 if(po[i].y>2) 47 ans++; 48 } 49 lx=po[i].x,ly=po[i].y; 50 } 51 ans+=r-lx; 52 if(c-ly>=2) 53 ans++; 54 sort(po,po+n,comp_y); 55 for(i=0,ly=1,lx=0;i<n;i++) 56 { 57 if(po[i].y==ly) 58 { 59 if(po[i].x-lx>2) 60 ans++; 61 } 62 else 63 { 64 ans+=po[i].y-ly-1; 65 if(r-lx>=2) 66 ans++; 67 if(po[i].x>2) 68 ans++; 69 } 70 lx=po[i].x,ly=po[i].y; 71 } 72 ans+=c-ly; 73 if(r-lx>=2) 74 ans++; 75 printf("%d\n",ans); 76 } 77 return 0; 78 }