제출 #1131475

#제출 시각아이디문제언어결과실행 시간메모리
1131475YelarysFire (BOI24_fire)C++20
100 / 100
529 ms68340 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
#define int long long
#define pb push_back
#define F first
#define S second
#define mp make_pair
#define sz(x)(int) x.size()
#define ins insert
#define speed ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define rep(i, a, b) for (int i = a; i < b; i++)
#define pf push_front
#define pb push_back
#define all(x) x.begin(), x.end()
#define pii pair < int, int >
#define pll pair < ll, ll >
#define vi vector < int >
#define vll vector < long long >
#define vpii vector < pair < int, int >>
#define vpll vector < pair < long long, long long >>
#define mem memset
#define debug cerr << "OK\n";
 
 mt19937 bruh(chrono::steady_clock::now().time_since_epoch().count());
 mt19937_64 rofl(chrono::steady_clock::now().time_since_epoch().count());
 
const int inf = 2e9;
const ll INF = (ll)1e18;
const ll INF1 = (ll) 1e14 + 1;
const int N = (int) 2e5 + 5;
const ll mod = (int)1e9 + 7;
const ll mod1 = (ll) 1e9 + 9;
const ll MAX = (ll) 1e7 + 5;
const int P = 331, B = 300;

ll binpow(ll a, ll n) {
    if (n == 0) return 1;
    if (n == 1) return a;
    ll r = binpow(a, n / 2);
    if (n & 1) return (((r * r) % mod) * a) % mod;
    return (r * r) % mod;
}

void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}

int dx[4] = {
    0,
    -1,
    0,
    1
};

int dy[4] = {
    1,
    0,
    -1,
    0
};

ll mul(ll a, ll b) {
    return (a * b) % mod;
}

int n, m;
pii t[N << 2];
bool used[N];
vector<int> g[N];

struct sch {
    int l, r, id;
    bool operator<(const sch& other) const { // Pass by const reference and mark as const
        return l < other.l;
    }
} a[N];

void build(int v = 1, int tl = 1, int tr = n) {
    if (tl == tr) {
        t[v] = {a[tl].r, a[tl].id};
        return;
    }
    int tm = (tl + tr) / 2;
    build(v * 2, tl, tm);
    build(v * 2 + 1, tm + 1, tr);
    t[v] = max(t[v * 2], t[v * 2 + 1]);
}

pii get(int l, int r, int v = 1, int tl = 1, int tr = n) {
    if (tr < l || tl > r) return {0, 0};
    if (l <= tl && tr <= r) {
        return t[v];
    }
    int tm = (tl + tr) / 2;
    return max(get(l, r, v * 2, tl, tm), get(l, r, v * 2 + 1, tm + 1, tr));
}

int up[N][20], timer = 0;

void dfs(int v, int p = 0) {
    up[v][0] = p;
    for (int i = 1; i < 20; i++) {
        up[v][i] = up[up[v][i - 1]][i - 1];
    }
    for (int u : g[v]) {
        if (u == p) continue;
        dfs(u, v);
    }
}

pii b[N];

int ANS(int u) {
    int l = 1, r = n, ans = inf;
    while (l <= r) {
        int mid = (l + r) / 2;
        int cur = 1, x = mid - 1, v = u;
        for (int i = 19; i >= 0; --i) {
            if ((1 << i) <= x && up[v][i] != 0) {
                x -= (1 << i);
                v = up[v][i];
            }
        }
        if(b[v].S >= b[u].F + m) {
            ans = mid;
            r = mid - 1;
        } else l = mid + 1;
    }
    return ans;
}

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int l, r;
        cin >> l >> r;
        if (r < l) {
            r += m;
        }
        a[i] = {l, r, i};
        b[i] = {l, r};
    }
    sort(a + 1, a + n + 1);
    build();
    for (int i = n - 1; i > 0; --i) {
        auto [l, r, id] = a[i];
        sch R = {r, 0, 0};
        int j = (int)(upper_bound(a + 1, a + n + 1, R) - a);
        int nx = get(i, j - 1).S;
        if (nx != id && b[nx].S > r) {
            g[nx].pb(id);
            used[id] = 1;
        }
    }
    for (int i  = 1; i <= n; i++) {
        if (!used[i]) {
            dfs(i);
        }
    }
    int ans = inf;
    for (int i = 1; i <= n; i++) {
        ans = min(ans, ANS(i));
    }
    if (ans >= inf) {
        cout << "-1\n";
        return;
    }
    cout << ans;
}

signed main() {
    speed;
    int T = 1;
    //cin >> T;
    for (int i = 1; i <= T; i++) {
        solve();
    }
    #ifdef ONPC
    cerr << endl << "finished in " << clock() * 1.0 / CLOCKS_PER_SEC << " sec" << endl;
    #endif
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void setIO(std::string)':
Main.cpp:50:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:51:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   51 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...