UVALive - 3211 - теперь или позже (2-СБ, 二 分)

Ссылка:

https://vjudge.net/problem/UVALive-3211

Значение вопросов:

Как вы , наверное, испытали вместо посадки сразу, самолет иногда ждет в холдинге
петлю близко к взлетно - посадочной полосе. Этот механизм удержания требуется авиадиспетчеры пространства , кроме
воздушных суден в максимально возможной степени на ВППАХ ( в то время задержки поддержания низкой). Это формально определяется как
«холдинг шаблон» и является заранее определенным маневром разработан , чтобы держать воздушное судно в пределах указанного
воздушного пространства (см рисунок 1 для примера).
Рисунок 1: Простой холдинг шаблон , как описано в пилотном текста книги.
Джим Тарьян, контроллер воздушного движения, попросил своего брата Роберта , чтобы помочь ему улучшить
поведение аэропорта.
Область TRACON
Терминал Radar подход к контролю (TRACON) управление самолетом приближаясь и удаляясь ,
когда они находятся в возрасте от 5 до 50 миль от аэропорта. В этом последнем процессе планирования, воздушное движение
диспетчеры делают некоторые самолеты ждать перед посадкой. К сожалению , это «ожидание» процесс является сложным ,
как самолет последующих заранее определенным маршрутам и их скорость не может быть изменена. Для того, чтобы достичь какой - то степени
гибкости в процессе, основная процедура затягивание, чтобы сделать самолет следовать схеме ожидания , который
был разработан для области Tracon. Такие модели генерировать постоянную заданную задержку на
самолет (см рисунок 1 для примера). Несколько моделей холдинговых могут существовать в одной и той же TRACON.
В дальнейших мы предполагаем , что существует единственная взлетно - посадочная полоса , и что , когда самолет входит в
зону Tracon, он назначается раннее время посадки, поздно время посадки и возможный тип удержания.
Ранние время посадки соответствует ситуациям , когда воздушное судно не ждет и земель , как
можно скорее. Поздние время посадки соответствует ситуациям , когда воздушное судно ожидает в
установленном режиме ожидания , а затем приземляется в то время. Мы предполагаем , что самолет входит в большинстве
шаблона один холдинга. Таким образом, ранние и поздние времена посадки единственные два возможных раза для
посадки.
Зазор безопасности минимальное время , прошедшее между последовательными посадками. Цель состоит в том, чтобы
увеличить разрыв безопасности. Роберт считает , что вы можете помочь.
Пример
Предположим , есть 10 самолетов в районе Tracon. В таблице 1 приведена соответствующие ранние и
поздние посадки раз (столбцы «Ранний» и «Конец»).
Самолеты раннего позднего Решение
А1 44 156 Раннее
А2 153 182 Раннее
А3 48 109 Поздний
А4 160 201 Поздний
А5 55 186 Конец
A6 54 207 Раннее
А7 55 165 Поздний
A8 17 58 Раннее
А9 132 160 Раннее
А10 87 197 Раннее
Таблица 1: самолеты 10 экземпляр этой проблемы.
Разрыв максимальной безопасности 10 и соответствующий раствор представлен в таблице 1 (колонка
"Решение"). В этом решении, самолет земли в следующем порядке: A8, A1, A6, A10, A3, A9, A2, A7,
A5, A4. Зазор безопасности осуществляется на самолете A1 и A6.

Идеи:

Рассмотрим первую половину, каждый раз перестроена карту. Рисунок построен на учебном пособии передается в двух или отношениях, или действительно хочет встретиться , чтобы встретиться с 2-СБ является.
Эта проблема с учетом двух условий времени посадки воздушного судна не удовлетворены, добавив фигуру.

Код:

//#include<bits/stdc++.h>
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<string.h>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<map>
#include<stack>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int MOD = 20071027;
const int MAXN = 2e3+10;
int Next[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};

vector<int> G[MAXN*2];
stack<int> St;
int dfn[MAXN*2], low[MAXN*2], sccnum[MAXN*2];
int a[MAXN][2];
int dfn_clock, scc_cnt;
int n, m;

void tarjan(int u)
{
    dfn[u] = low[u] = ++dfn_clock;
    St.push(u);
    for (int i = 0;i < (int)G[u].size();i++)
    {
        int v = G[u][i];
        if (!dfn[v])
        {
            tarjan(v);
            low[u] = min(low[v], low[u]);
        }
        else if (!sccnum[v])
            low[u] = min(dfn[v], low[u]);
    }
    if (low[u] == dfn[u])
    {
        ++scc_cnt;
        while(true)
        {
            int x = St.top();
            St.pop();
            sccnum[x] = scc_cnt;
            if (x == u)
                break;
        }
    }
}

bool solve()
{
    memset(dfn, 0, sizeof(dfn));
    memset(low, 0, sizeof(low));
    memset(sccnum, 0, sizeof(sccnum));
    dfn_clock = scc_cnt = 0;
    for (int i = 0;i < 2*n;i++)
        if (!dfn[i]) tarjan(i);
    for (int i = 0;i < 2*n;i+=2)
        if (sccnum[i] == sccnum[i+1]) return false;
    return true;
}

void add_edge(int x, int xval, int y, int yval)
{
    x = x*2+xval;
    y = y*2+yval;
    G[x^1].push_back(y);
    G[y^1].push_back(x);
}

bool check(int mid)
{
    for (int i = 0;i < 2*n;i++)
        G[i].clear();
    for (int i = 0;i < n;i++) for (int p1 = 0;p1 < 2;p1++)
    {
        for (int j = i+1;j < n;j++) for (int p2 = 0;p2 < 2;p2++)
        {
            if (abs(a[i][p1]-a[j][p2]) < mid)
                add_edge(i, p1^1, j, p2^1);
        }
    }
    return solve();
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    while(cin >> n)
    {
        int l = 0, r = 0;
        for (int i = 0;i < n;i++)
        {
            cin >> a[i][0] >> a[i][1];
            r = max(r, max(a[i][0], a[i][1]));
        }
        int ans = 0;
        while(l <= r)
        {
            int mid = (l+r)/2;
            if (check(mid))
            {
                ans = max(ans, mid);
                l = mid+1;
            }
            else
                r = mid-1;
        }
        cout << ans << endl;
    }

    return 0;
}

рекомендация

отwww.cnblogs.com/YDDDD/p/12141894.html