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 }

 

你可能感兴趣的:(count)