pku3168 Barn Expansion 排序+区间重叠判断

pku3168 Barn Expansion 排序+区间重叠判断

MS好久不写blog了,现在好忙,又是GRE,又是考研,又是ACM。。蛋疼
言归正传
题意:
给出一些长方形,不重叠,但可以擦边或擦角。问有多少个长方形是完全不和别的长方形沾边的

给力条件:不重叠

方法:经典的排序+区间合并

代码:
 1  # include  < cstdio >
 2  # include  < cstring >
 3  # include  < cstdlib >
 4  # define max(a,b) ((a) > (b) ? (a):(b))
 5  using   namespace  std;
 6  struct  line
 7  {
 8      int  s,e,p,id;
 9  }tmp[ 60000 ];
10  int  cmp( const   void   * a, const   void   * b)
11  {
12      line  * aa = (line  * )a, * bb = (line  * )b;
13       if (aa -> p != bb -> p)  return  aa -> p - bb -> p;
14       else   return  aa -> s - bb -> s;
15  }
16  int  data[ 30000 ][ 4 ],n;
17  bool  used[ 30000 ];
18  void  solve()
19  {
20       int  end = tmp[ 0 ].e,last = 0 ;
21       for ( int  i = 1 ;i < 2 * n;i ++ )
22         if (tmp[i].p == tmp[i - 1 ].p && tmp[i].s <= end)
23           end = max(end,tmp[i].e);
24         else
25        {
26            if (last != i - 1 )
27             for ( int  j = last;j < i;j ++ )
28              used[tmp[j].id] = false ;
29            end = tmp[i].e;
30            last = i;
31        }
32        if (last != 2 * n - 1 )
33        for ( int  j = last;j < 2 * n;j ++ )
34          used[tmp[j].id] = false ;
35  }
36  int  main()
37  {
38      scanf( " %d " , & n);
39      memset(used, true , sizeof (used));
40       for ( int  i = 0 ;i < n;i ++ )
41        scanf( " %d%d%d%d " , & data[i][ 0 ], & data[i][ 1 ], & data[i][ 2 ], & data[i][ 3 ]);
42       for ( int  i = 0 ;i < n;i ++ )
43      {
44         tmp[ 2 * i].s = data[i][ 0 ];
45         tmp[ 2 * i].e = data[i][ 2 ];
46         tmp[ 2 * i].p = data[i][ 1 ];
47         tmp[ 2 * i].id = i;
48         tmp[ 2 * i + 1 ] = tmp[ 2 * i];
49         tmp[ 2 * i + 1 ].p = data[i][ 3 ];
50      }
51      qsort(tmp, 2 * n, sizeof (line),cmp);
52      /*  printf("\n");
53      for(int i=0;i<2*n;i++)
54        printf("%d %d %d %d\n",tmp[i].id,tmp[i].p,tmp[i].s,tmp[i].e);
55      printf("\n"); */
56      solve();
57       for ( int  i = 0 ;i < n;i ++ )
58      {
59         tmp[ 2 * i].s = data[i][ 1 ];
60         tmp[ 2 * i].e = data[i][ 3 ];
61         tmp[ 2 * i].p = data[i][ 0 ];
62         tmp[ 2 * i].id = i;
63         tmp[ 2 * i + 1 ] = tmp[ 2 * i];
64         tmp[ 2 * i + 1 ].p = data[i][ 2 ];
65      }
66      qsort(tmp, 2 * n, sizeof (line),cmp);
67      /*  for(int i=0;i<2*n;i++)
68        printf("%d %d %d %d\n",tmp[i].id,tmp[i].p,tmp[i].s,tmp[i].e);
69      printf("\n"); */
70      solve();
71       int  c = 0 ;
72       for ( int  i = 0 ;i < n;i ++ )
73        c += used[i];
74      printf( " %d\n " ,c);
75       // system("pause");
76       return   0 ;
77  }
78 

你可能感兴趣的:(pku3168 Barn Expansion 排序+区间重叠判断)