[]の矩形のフットプリントNOIp2002

リンク

データ範囲は、検索を考慮すると、非常に小さいです。

私の最初の考えは、矩形、入力が与えられなければならない、明らかに各矩形指定点を列挙することです。

しかし、間違っているだけでなく、困難ではないだけの複雑さは、泥棒を書き込みます。

点矩形を挙げることができる矩形を含む点を列挙することはできない穏やかな分析は、属します。

各点(N-複雑Oように4例がある。4)、一定のチェックがあり、それはプローブ狂っTLEの縁に言うことができるが。

実際には、状況にそれほど不満はいくつかの剪定を追加し、実行することです、渡すことができます。

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include < ストリング >
 4の#include <CStringの>
 5の#include <cstdlib>
 6  使って 名前空間STD。
7  
8インラインint型リード(){
 9      INT X = 0チャー CH = GETCHAR()。
10      一方(CH < ' 0 ' || CH> ' 9 ')CH = GETCHAR()。
11      一方(CH> = ' 0 '&& CH <= ' 9 ' ){
 12          、X = X * 10 + CH- ' 0 ' ; CH = GETCHAR()。
13      }
 14      リターンX。
15  }
 16  
17  のconst  int型の N = 55 18  
19  構造体POI {
 20      のint X、Y。
21  } P [N]。
22  
23  構造体MTRX {
 24      のint L、R、U、D。
25      ブールFL;
26 } M [ 5 ]。
27  
28  
29  int型N、K。
30  
31  INT ANS = 1E9 + 7 32  
33のインラインブール(INS int型int型のx、int型のY){
 34      場合は(X <= M [A] .R && X> = M [A] .L && Y <= M [A] .U && Y> = M [A] .D)を返す 35      リターン はfalse ;
36 } // 判断(x、y)の是否在矩形中
37  
38インラインブールチェック(INT A、INT B){
 39      であれば(INS(、mは[B] .L、M [B] .U))返す ;
40      であれば(INS(M [B] .L、Mは、[B] .D))を返す 41      であれば(INS(M [B]・R、M [B] .U))を返す 42      であれば(INS(M [B] .R、mは[B] .D))を返す 43      リターン はfalse ;
44 } // 判断A、B矩形是否相交
45の 
46インラインボイド DFS(INT 今){
 47      のintヴァル= 0 48      のためには、int型 i = 1 ; iが= Kを<; ++I){
 49          IF (m個の[I]の.Fl){
 50              のためのint型 Jは=私は+ 1、J <= K; ++ J){
 51が                 IF(M [J]の.Fl &&チェック(I、J))リターン// 別の矩形と交差した場合
52である             }
 53れる         }
 54である          ヴァル+ =(M [I] .rmの[I] .L)*(M [I] .u- ; M [I] 2.D)
 55      } // 最初の電流波形に回答を求める
56はある     IF(ヴァル> ANS)のリターン;
 57である     IF(N + ==今。1 ){
 58の          ANS = ;分(ANS、ヴァル)
 59          リターン;
 60      }
 61である     ためINT I = 1 ; Iは= K <; ++ I)の{
 62が          MTRX SHEP = Mの[I]; // 状態復元する
63である         IF(!は、{M [I]の.Fl)  
 64              Mを[I] .L = M [I] .R = P [今] .X;
 65              M [I] .U = M [I] 2.D = P [今] .Y;
 66              M [I] =の.Fl 。1 ;
 67              (今+ DFS 1。);
 68              M [I] = SHEP;
 69              ブレーク;
 70          } // ここで、矩形以外の空の長方形に、ので、確かに悪くないを破ります。
71          {
 72              M [i]は.L = 分(M [i]が.L、P [今] .X)。
73              M [I] .R = MAX(M [I] .R、P [今] .X)。
74              M [i]は.D = 分(M [i]の.D、P [今] .Y)。
75              M [i]は.U = MAX(M [i]が.U、P [今] .Y)。
76の              DFS(今+ 1 )。
77              M [I] = SHEP。
78          }
 79      }
 80  }
 81  
82  INT メイン(){
 83      N =読み取る(); K = 読み取ります()。
84      のためのint型 I = 1; iは= N <; ++ I){
 85          Pは、[i]は.X =読み取る(); P [i]が.Y = read()は、
86      }
 87の      DFS(1 )。
88      coutの<< ANS;
89 }

 

おすすめ

転載: www.cnblogs.com/chiyo/p/11230978.html