zoukankan      html  css  js  c++  java
  • UVA 511 Do You Know the Way to San Jose?

    题目链接:https://vjudge.net/problem/UVA-511

    题目翻译摘自《算法禁赛入门经典》

    题目大意

      有 n 张地图(已知名称和两个对角线端点的坐标)和 m 个地名(已知名称和坐标), 还有 q 个查询。每张地图都是边平行于坐标轴的矩形,比例定义为高度除以宽度的值。每个查询包含一个地名和详细等级 i。面积相同的地图总是属于同一个详细等级。假定包含此地名的地图中一共有 k 种不同的面积,则合法的详细等级为 1~k(其中 1 最不详细,k 最详细, 面积越小越详细)。如果详细等级 i 的地图不止一张,则输出地图中心和查询地名最接近的一张;如果还有并列的,地图长宽比应尽量接近 0.75(这是Web浏览器的比例);如果还有并列,查询地名和地图右下角的坐标应最远(对应最少的滚动条移动);如果还有并列,则输出x坐标最小的一个。如果查询的地名不存在或者没有地图包含它,应报告查询非法。如果包含它的地图最高详细等级小于 i,应报告查询非法(并输出包含它的最详细地图名称,如果存在)。

    分析

      对于每个询问,找出所有相关区域,然后用自定义比较器排一下序即可。

    代码如下

      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()); // 删去 x 中所有 c 
     22 #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 << "]" << "
    ";
     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 U, D, L, R, Area, ratio; // 上下左右和面积以及长宽比 
    138     PDD center; // 中心点 
    139     string name; 
    140     
    141     MAP() {}
    142     MAP(string s) {
    143         stringstream sin(s);
    144         double x1, y1, x2, y2;
    145         
    146         sin >> name >> x1 >> y1 >> x2 >> y2;
    147         L = min(x1, x2);
    148         R = max(x1, x2);
    149         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
    ");
    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
    ");
    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
    ", sm.rbegin()->name.c_str());
    241                 else printf("using %s
    ", it->name.c_str());
    242             }
    243         }
    244     }
    245     return 0;
    246 }
    View Code
  • 相关阅读:
    蓝桥杯基础 算法训练 图形显示 (简单模拟,坑)
    越喜欢村上春树,就越懂得生活
    HTML 基础 之 列表标签 () 学习笔记
    HTML 基础 之 段落标签() 学习笔记
    《Norwegain Wood》—— The Beatles
    蓝桥杯基础 算法训练 前缀表达式 (基础语法)
    Python3 使用 urllib 包访问Web网站
    蓝桥杯 算法提高 队列操作 (STL基本操作)
    蓝桥杯 算法提高 11-1 实现strcmp函数 (C语言实现,指针实现)
    蓝桥杯基础 算法训练 矩阵乘法 (模板题)
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/11077277.html
Copyright © 2011-2022 走看看