URAL 1097 Square Country 2 离散化

一共才100个正方形,将所有正方形左下角和右上角的X坐标和Y坐标离散化,直接枚举新建公园的点的坐标即可。

O(n^3)的时间复杂度。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 
  6 using namespace std;
  7 
  8 const int MAXN = 110;
  9 const int INF = 255;
 10 
 11 struct Land
 12 {
 13     int x, y;
 14     int len;
 15     int import;
 16 };
 17 
 18 int N, K, M;
 19 int cnt;
 20 Land land[MAXN];
 21 int cntX, cntY;
 22 int X[ MAXN << 1 ];
 23 int Y[ MAXN << 1 ];
 24 
 25 bool InPark( Land park, Land d )
 26 {
 27     int stx = park.x, sty = park.y;
 28     int edx = park.x + park.len, edy = park.y + park.len;
 29 
 30     //printf("%d %d %d %d\n", stx, sty, edx, edy );
 31     //printf("%d %d %d %d\n---\n", d.x, d.y, d.x + d.len, d.y + d.len );
 32 
 33     if ( d.x >= stx && d.x < edx )
 34     {
 35         if ( d.y >= sty && d.y < edy ) return true;
 36         if ( d.y + d.len > sty && d.y + d.len <= edy ) return true;
 37     }
 38 
 39     if ( d.x + d.len > stx && d.x + d.len <= edx )
 40     {
 41         if ( d.y >= sty && d.y < edy ) return true;
 42         if ( d.y + d.len > sty && d.y + d.len <= edy ) return true;
 43     }
 44     return false;
 45 }
 46 
 47 void solved()
 48 {
 49     int ans = INF;
 50     for( int i = 0; i < cntX; ++i )
 51         for( int j = 0; j < cntY; ++j )
 52         {
 53             Land park;
 54             park.x = X[i], park.y = Y[j];
 55             park.len = K;
 56 
 57             if ( park.x + park.len <= 1 + N && park.y + park.len <= 1 + N )
 58             {
 59                 int influence = 1;
 60                 for ( int k = 0; k < M; ++k )
 61                 {
 62                     if ( InPark( park, land[k] ) )
 63                     {
 64                         //puts("***");
 65                         influence = max( influence, land[k].import );
 66                     }
 67                 }
 68                 ans = min( ans, influence );
 69             }
 70         }
 71 
 72     if ( ans <= 100 ) printf( "%d\n", ans );
 73     else puts("IMPOSSIBLE");
 74 
 75     return;
 76 }
 77 
 78 int main()
 79 {
 80     //freopen( "s.out", "w", stdout );
 81     while ( ~scanf( "%d%d", &N, &K ) )
 82     {
 83         scanf( "%d", &M );
 84         cntX = cntY = 0;
 85         for ( int i = 0; i < M; ++i )
 86         {
 87             scanf("%d%d%d%d", &land[i].import, &land[i].len, &land[i].x, &land[i].y );
 88             X[cntX++] = land[i].x;
 89             X[cntX++] = land[i].x + land[i].len;
 90             Y[cntY++] = land[i].y;
 91             Y[cntY++] = land[i].y + land[i].len;
 92         }
 93 
 94         X[cntX++] = 1;
 95         X[cntX++] = 1 + N;
 96         Y[cntY++] = 1;
 97         Y[cntY++] = 1 + N;
 98 
 99         sort( X, X + cntX );
100         sort( Y, Y + cntY );
101         cntX = unique( X, X + cntX ) - X;
102         cntY = unique( Y, Y + cntY ) - Y;
103 
104         solved();
105     }
106     return 0;
107 }

 

posted @ 2013-08-04 10:12  冰鸮  阅读(272)  评论(0编辑  收藏  举报