Topic links: https://vjudge.net/problem/UVA-511
Title translation from "classical algorithm banned entry"
Subject to the effect
N-maps (known name and a coordinates of two endpoints of the diagonal) and m names (the name and coordinates are known), and q queries. Rectangle, each map is defined as the proportion sides parallel to the axis of the height divided by the width value. Each query contains a place name and level of detail i. The same area of the map always belong to the level of detail of the same . This map names assumed to contain a total of k different areas, the level of detail is legitimate 1 ~ k (wherein detailed least 1, k most detailed, the smaller the area of detail). If the level of detail of the map is more than a i, the output center of the map and query names the closest one; if still tied, the map should be as close to the aspect ratio of 0.75 (which is the ratio of a Web browser); if there is parallel query names and coordinates of the lower right corner of the map should be the farthest (corresponding to the minimum scroll bar); if there are side by side, the output x coordinate of the smallest one. If the names of the query does not exist or it does not contain maps, queries should report illegal. If it contains detailed maps highest level of less than i, the query should report illegal (the most detailed map output includes its name and, if present).
analysis
code show as below
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (n); ++i) 6 #define For(i,s,t) for (int i = (s); i <= (t); ++i) 7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i) 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) 12 13 #define pr(x) cout << #x << " = " << x << " " 14 #define prln(x) cout << #x << " = " << x << endl 15 16 #define LOWBIT(x) ((x)&(-x)) 17 18 #define ALL(x) x.begin(),x.end() 19 #define INS(x) inserter(x,x.begin()) 20 #define UNIQUE(x) x.erase(unique(x.begin(), x.end()), x.end()) 21 #define REMOVE(x, c) x.erase(remove(x.begin(), x.end(), c), x.end());22deleting all x c// #define TOLOWER(x) transform(x.begin(), x.end(), x.begin(),::tolower); 23 #define TOUPPER(x) transform(x.begin(), x.end(), x.begin(),::toupper); 24 25 #define ms0(a) memset(a,0,sizeof(a)) 26 #define msI(a) memset(a,inf,sizeof(a)) 27 #define msM(a) memset(a,-1,sizeof(a)) 28 29 #define MP make_pair 30 #define PB push_back 31 #define ft first 32 #define sd second 33 34 template<typename T1, typename T2> 35 istream &operator>>(istream &in, pair<T1, T2> &p) { 36 in >> p.first >> p.second; 37 return in; 38 } 39 40 template<typename T> 41 istream &operator>>(istream &in, vector<T> &v) { 42 for (auto &x: v) 43 in >> x; 44 return in; 45 } 46 47 template<typename T1, typename T2> 48 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 49 out << "[" << p.first << ", " << p.second << "]" << "\n"; 50 return out; 51 } 52 53 inline int gc(){ 54 static const int BUF = 1e7; 55 static char buf[BUF], *bg = buf + BUF, *ed = bg; 56 57 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 58 return *bg++; 59 } 60 61 inline int ri(){ 62 int x = 0, f = 1, c = gc(); 63 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 64 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 65 return x*f; 66 } 67 68 template<class T> 69 inline string toString(T x) { 70 ostringstream sout; 71 sout << x; 72 return sout.str(); 73 } 74 75 inline int toInt(string s) { 76 int v; 77 istringstream sin(s); 78 sin >> v; 79 return v; 80 } 81 82 //min <= aim <= max 83 template<typename T> 84 inline bool BETWEEN(const T aim, const T min, const T max) { 85 return min <= aim && aim <= max; 86 } 87 88 typedef long long LL; 89 typedef unsigned long long uLL; 90 typedef pair< double, double > PDD; 91 typedef pair< int, int > PII; 92 typedef pair< int, PII > PIPII; 93 typedef pair< string, int > PSI; 94 typedef pair< int, PSI > PIPSI; 95 typedef set< int > SI; 96 typedef set< PII > SPII; 97 typedef vector< int > VI; 98 typedef vector< double > VD; 99 typedef vector< VI > VVI; 100 typedef vector< SI > VSI; 101 typedef vector< PII > VPII; 102 typedef map< int, int > MII; 103 typedef map< int, string > MIS; 104 typedef map< int, PII > MIPII; 105 typedef map< PII, int > MPIII; 106 typedef map< string, int > MSI; 107 typedef map< string, string > MSS; 108 typedef map< PII, string > MPIIS; 109 typedef map< PII, PII > MPIIPII; 110 typedef multimap< int, int > MMII; 111 typedef multimap< string, int > MMSI; 112 //typedef unordered_map< int, int > uMII; 113 typedef pair< LL, LL > PLL; 114 typedef vector< LL > VL; 115 typedef vector< VL > VVL; 116 typedef priority_queue< int > PQIMax; 117 typedef priority_queue< int, VI, greater< int > > PQIMin; 118 const double EPS = 1e-8; 119 const LL inf = 0x7fffffff; 120 const LL infLL = 0x7fffffffffffffffLL; 121 const LL mod = 1e9 + 7; 122 const int maxN = 1e4 + 7; 123 const LL ONE = 1; 124 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 125 const LL oddBits = 0x5555555555555555; 126 127 int sgn(double x) { 128 if(fabs(x) < EPS) return 0; 129 return x > 0 ? 1 : -1; 130 } 131 132 double dist(PDD a,PDD b) { 133 return sqrt((a.ft - b.ft) * (a.ft - b.ft) + (a.sd - b.sd) * (a.sd - b.sd)); 134 } 135 136 struct MAP{ 137 Double the U-, D, L, R & lt, Area, ratio; // vertical and horizontal aspect ratio and area, and 138 the PDD Center; // center point 139 String name; 140 141 is the MAP () {} 142 the MAP ( String S) { 143 the stringstream SiN (S); 144 Double X1, Y1, X2, Y2; 145 146 SiN name >> >> >> X2 Y1 X1 >> >> Y2; 147 L = min (X1, X2); 148 R & lt = max (X1, X2); 149 the U-= max (Y1, Y2); 150 D = min(y1, y2); 151 center = MP((L + R) / 2, (U + D) / 2); 152 Area = (R - L) * (U - D); 153 ratio = fabs((R - L) / (U - D) - 0.75); 154 } 155 156 bool cover(PDD x) { 157 return x.ft >= L && x.ft <= R && x.sd >= D && x.sd <= U; 158 } 159 160 bool operator< (const MAP &x) const { 161 return Area > x.Area; 162 } 163 }; 164 vector< MAP > maps; 165 166 string tmp; 167 map< string, PDD > loc; 168 string target; 169 int level; 170 171 struct MyCmp{ 172 bool operator() (const MAP &x, const MAP &y) const { 173 PDD tar = loc[target]; 174 175 if(sgn(x.Area - y.Area) == 0) { 176 double a = dist(tar, x.center); 177 double b = dist(tar, y.center); 178 179 if(sgn(a - b) == 0) { 180 if(sgn(x.ratio - y.ratio) == 0) { 181 a = dist(tar, MP(x.R, x.D)); 182 b = dist(tar, MP(y.R, y.D)); 183 184 if(sgn(a - b) == 0) return x.L < y.L; 185 return a > b; 186 } 187 return x.ratio < y.ratio; 188 } 189 return a < b; 190 } 191 return x.Area > y.Area; 192 } 193 }; 194 195 int main(){ 196 //freopen("MyOutput.txt","w",stdout); 197 //freopen("input.txt","r",stdin); 198 //INIT(); 199 getline(cin, tmp); 200 while(getline(cin, tmp)) { 201 if(tmp == "LOCATIONS") break; 202 maps.PB(MAP(tmp)); 203 } 204 205 while(getline(cin, tmp)) { 206 if(tmp == "REQUESTS") break; 207 stringstream sin(tmp); 208 double x, y; 209 210 sin >> tmp >> x >> y; 211 loc[tmp] = MP(x, y); 212 } 213 214 while(getline(cin, tmp)) { 215 if(tmp == "END") break; 216 stringstream sin(tmp); 217 218 sin >> target >> level; 219 printf("%s at detail level %d ", target.c_str(), level); 220 221 if(loc.find(target) == loc.end()) printf("unknown location\n"); 222 else { 223 set< MAP, MyCmp > sm; 224 // 找出所有包含target地点的map 225 foreach(i, maps) if(i->cover(loc[target])) sm.insert(*i); 226 227 if(sm.size() == 0) printf("no map contains that location\n"); 228 else { 229 auto it = sm.begin(); 230 double t = 0; 231 232 while(it != sm.end()) { 233 if(it->Area != t) { 234 t = it->Area; 235 if(!--level) break; 236 } 237 ++it; 238 } 239 240 if(level) printf("no map at that detail level; using %s\n", sm.rbegin()->name.c_str()); 241 else printf("using %s\n", it->name.c_str()); 242 } 243 } 244 } 245 return 0; 246 }