POJ 1974

题意:在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 }

你可能感兴趣的:(poj)