Висока будівля#12300

Висока будівля (Розбір)

Автор проблеми:

De3b0o

Підготовлено:

De3b0o

Редагував:

Hasan Saleh (MathModel)

Рішення

Якщо на початку дві людини ділять один і той же поверх, то відповідь одразу НІ. В іншому випадку ми завжди можемо зробити так, щоб усі люди досягли своєї мети, починаючи з особи на найвищому поверсі, якщо тільки не існує двох людей , де l_i \le l_j і r_j \ge r_i.

Отже, достатньо перевірити, чи є пара , де l_i \le l_j і r_j \ge r_i, ми можемо це зробити, відсортувавши людей за l_i і перевіривши, чи значення r_i відсортовані.

Складність \mathcal{O}(n \cdot \log(n)).


#include <bits/stdc++.h>
#define ll long long
#define F first
#define S second
#define in insert
#define pb push_back
#define d3 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define cans cout << ans << "\n";
#define yes cout << "YES" << "\n";
#define no cout << "NO" << "\n";
#define pll pair<ll, ll>
#define lin cout << "\n";
#define mid ((l + r) / 2)
#define lc (2 * x)
#define rc (2 * x + 1)
#define double long double

using namespace std;

mt19937 rnd(time(0));

const ll N = 2e6+9;

ll n;
pll a[N];

int main()
{
    d3
    ll T = 1;
    cin >> T;
    while(T--)
    {
        cin >> n;
        for(int i = 1 ; n>=i ; i++)
            cin >> a[i].F;
        for(int i = 1 ; n>=i ; i++)
            cin >> a[i].S;
        sort(a+1,a+n+1);
        a[0]={-1e10,-1e10};
        bool g = 1;
        for(int i = 1 ; n>=i ; i++)
        {
            if(a[i].F==a[i-1].F||a[i].S<=a[i-1].S)
                g=0;
        }
        if(g)
            yes
        else
            no
    }
}