zoukankan      html  css  js  c++  java
  • Manhattan Positioning System --- Gym

    题目

      https://vjudge.net/problem/Gym-101490G

    题意

      给出 n 个信标的二维坐标 ( X,Y ) 以及唯一接收器距离每个信标的曼哈顿距离 D ( ( x1, y1 ) 和 ( x2, y2 ) 的曼哈顿距离为 | x1 - x2 | + | y1 - y2 | ),问是否能确定接收器的位置。

    题解

      每个信标用曼哈顿距离可以构建出一个旋转 45° 的正方形,取随意一个正方形,用 ( x1, y1 ),( x2, y2 ) 来表示每条边构成边集,将该边集与每个正方形的边集求交集,看剩余的边集是否为唯一一个点。

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 #define ull unsigned long long
     4 #define met(a, b) memset(a, b, sizeof(a))
     5 #define rep(i, a, b) for(int i = a; i <= b; i++)
     6 #define bep(i, a, b) for(int i = a; i >= b; i--)
     7 #define lowbit(x) (x&(-x))
     8 #define MID (l + r) / 2
     9 #define ls pos*2
    10 #define rs pos*2+1
    11 #define pb push_back
    12 #define ios() ios::sync_with_stdio(0)
    13 
    14 using namespace std;
    15 
    16 const int maxn = 1e6 + 1010;
    17 const int inf = 0x3f3f3f3f;
    18 const ll INF = 0x3f3f3f3f3f3f3f3f;
    19 const ll mod = 123456789;
    20 
    21 struct NODE {
    22     ll x, y, w;
    23 }arr[1010];
    24 struct node {
    25     ll x1, y1, x2, y2, k, b;
    26     node () {}
    27     node (ll t1, ll t2, ll t3, ll t4) {
    28         x1 = t1, y1 = t2, x2 = t3, y2 = t4;
    29         if(x1 == x2) k = 1;
    30         else k = (y2 - y1) / (x2 - x1);
    31         b = y1 - k*x1;
    32     }
    33 }t[5];
    34 
    35 map<pair<ll, ll>, ll> tran;
    36 queue<node> que[2];
    37 ll tail;
    38 
    39 void func(ll op) {
    40     tran.clear();
    41     ll now = (op + 1) % 2;
    42     while(!que[op].empty()) {
    43         node p = que[op].front();
    44         que[op].pop();
    45         ll mp1 = p.x1 + p.y1*10000000;
    46         ll mp2 = p.x2 + p.y2*10000000;
    47         rep(k, 1, 4) {
    48             ll x1 = inf, y1 = inf, x2 = inf, y2 = inf;
    49             if(p.k == t[k].k) {
    50                 ll t1, tt1, t2, tt2;
    51                 if(p.x1 > t[k].x1) t1 = p.x1, tt1 = p.y1;
    52                 else t1 = t[k].x1, tt1 = t[k].y1;
    53                 if(p.x2 < t[k].x2) t2 = p.x2, tt2 = p.y2;
    54                 else t2 = t[k].x2, tt2 = t[k].y2;
    55                 if(p.b != t[k].b || t1 > t2) continue;
    56                 x1 = t1, y1 = tt1;
    57                 x2 = t2, y2 = tt2;
    58             }
    59             else {
    60                 double tt = 1.0 * (p.b - t[k].b) / (t[k].k - p.k);
    61                 if((ll)tt != tt || tt < p.x1 || tt > p.x2 || tt < t[k].x1 || tt > t[k].x2) continue;
    62                 x1 = x2 = tt;
    63                 y1 = y2 = p.k*x1 + p.b;
    64             }
    65             mp1 = x1 + y1*10000000;
    66             mp2 = x2 + y2*10000000;
    67             pair<ll, ll> pr = make_pair(mp1, mp2);
    68             if(!tran[pr]) {
    69                 que[now].push((node){x1, y1, x2, y2});
    70                 tran[pr] = 1;
    71             }
    72         }
    73     }
    74 }
    75 int main() {
    76     ios();
    77     ll n;
    78     cin >> n;
    79     rep(i, 1, n) cin >> arr[i].x >> arr[i].y >> arr[i].w;
    80     que[1].push((node){arr[1].x - arr[1].w, arr[1].y, arr[1].x, arr[1].y + arr[1].w});
    81     que[1].push((node){arr[1].x, arr[1].y + arr[1].w, arr[1].x + arr[1].w, arr[1].y});
    82     que[1].push((node){arr[1].x, arr[1].y - arr[1].w, arr[1].x + arr[1].w, arr[1].y});
    83     que[1].push((node){arr[1].x - arr[1].w, arr[1].y, arr[1].x, arr[1].y - arr[1].w});
    84     rep(i, 1, n) {
    85         t[1] = {arr[i].x - arr[i].w, arr[i].y, arr[i].x, arr[i].y + arr[i].w};
    86         t[2] = {arr[i].x, arr[i].y + arr[i].w, arr[i].x + arr[i].w, arr[i].y};
    87         t[3] = {arr[i].x, arr[i].y - arr[i].w, arr[i].x + arr[i].w, arr[i].y};
    88         t[4] = {arr[i].x - arr[i].w, arr[i].y, arr[i].x, arr[i].y - arr[i].w};
    89         func(i % 2);
    90     }
    91     ll tail = que[(n+1) % 2].size();
    92     if(tail == 0) cout << "impossible" << endl;
    93     else {
    94         node p = que[(n+1) % 2].front();
    95         if(tail > 1 || p.x1 != p.x2) cout << "uncertain" << endl;
    96         else cout << p.x1 << ' ' << p.y1 << endl;
    97     }
    98     return 0;
    99 }
  • 相关阅读:
    hdu 3289 Magic tree (最大生成树 + dfs +树状数组)
    hdu 3294 Girls' research
    hdu 3639 HawkandChicken (强连通 + 反图 + 缩点) && hdu1827 Summer Holiday && hdu 1269 迷宫城堡 && hdu3072 Intelligence System
    hdu 3288 Resource Allocation
    hdu3038 How Many Answers Are Wrong
    单项式
    我的新博客开通了.
    svn服务器中实现自动备份(postcommit钩子,linux系统)
    校验和
    SVNPath 与 SVNParentPath 的区别注意
  • 原文地址:https://www.cnblogs.com/Ruby-Z/p/12181919.html
Copyright © 2011-2022 走看看