UVA 511 Do You Know the Way to San Jose?

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

  For each inquiry, to find all the relevant areas, and then discharge it with a custom comparator to order.

code show as below

  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 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/11077277.html