码迷,mamicode.com
首页 > 其他好文 > 详细

[Usaco2017 Dec] A Pie for a Pie

时间:2018-10-16 02:02:59      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:while   c++   signed   back   problem   cto   sig   printf   pen   

[题目链接]

        https://www.lydsy.com/JudgeOnline/problem.php?id=5140

[算法]

         最短路

         时间复杂度 : O(N^2)

[代码]

         

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;

struct info
{
        int x , y , id;
} a[MAXN << 1] , b[MAXN << 1];

int n , d;
int dist[MAXN << 1];
vector< int > G[MAXN << 1];
queue< int > q;

template <typename T> inline void chkmax(T &x,T y) { x = max(x,y); }
template <typename T> inline void chkmin(T &x,T y) { x = min(x,y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == -) f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - 0;
    x *= f;
}
inline bool cmpA(info a,info b)
{
        return a.x < b.x;
}
inline bool cmpB(info a,info b)
{
        return a.y < b.y;
}

int main()
{
        
        read(n); read(d);
        for (int i = 1; i <= n; i++)
        {
                read(a[i].x);
                read(a[i].y);
        }
        for (int i = 1; i <= n; i++)
        {
                read(b[i].x); 
                read(b[i].y);        
        }
        memset(dist,255,sizeof(dist));
        for (int i = 1; i <= n; i++)
        {
                if (a[i].y == 0)
                {
                        q.push(i);
                        dist[i] = 1;
                }        
                a[i].id = i;
        }
        for (int i = 1; i <= n; i++)
        {
                if (b[i].x == 0)
                {
                        q.push(i + n);
                        dist[i + n] = 1;        
                }    
                b[i].id = i + n;    
        }
        sort(a + 1,a + n + 1,cmpA);
        sort(b + 1,b + n + 1,cmpB);
        for (int i = 1; i <= n; i++)
        {
                int l = 1 , r = n , pos = -1;
                while (l <= r)    
                {
                        int mid = (l + r) >> 1;
                        if (b[mid].y >= a[i].y)
                        {
                                pos = mid;
                                r = mid - 1;
                        } else l = mid + 1;
                }
                if (pos == -1) continue;
                for (int j = pos; j <= n; j++)
                {
                        if (b[j].y > a[i].y + d) break;
                        G[b[j].id].push_back(a[i].id);
                }
        }
        for (int i = 1; i <= n; i++)
        {
                int l = 1 , r = n , pos = -1;
                while (l <= r)
                {
                        int mid = (l + r) >> 1;
                        if (a[mid].x >= b[i].x)
                        {
                                pos = mid;
                                r = mid - 1;
                        } else l = mid + 1;
                }
                if (pos == -1) continue;
                for (int j = pos; j <= n; j++)
                {
                        if (a[j].x > b[i].x + d) break;
                        G[a[j].id].push_back(b[i].id);
                }
        }
        while (!q.empty())
        {
                int cur = q.front();
                q.pop();
                for (unsigned i = 0; i < G[cur].size(); i++)
                {
                        int v = G[cur][i];
                        if (dist[v] != -1) continue;
                        dist[v] = dist[cur] + 1;
                        q.push(v);        
                }        
        }
        for (int i = 1; i <= n; i++) printf("%d\n",dist[i]);
        
        return 0;
    
}

 

[Usaco2017 Dec] A Pie for a Pie

标签:while   c++   signed   back   problem   cto   sig   printf   pen   

原文地址:https://www.cnblogs.com/evenbao/p/9795119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!