제출 #627429

#제출 시각아이디문제언어결과실행 시간메모리
627429MohamedFaresNebiliBread First Search (CCO21_day2problem2)C++14
25 / 25
231 ms14184 KiB
#include <bits/stdc++.h>

            using namespace std;

            using ll = long long;
            using ld = long double;
            using pi = pair<pair<int, int>, pair<int, int>>;

            #define ff first
            #define ss second
            #define pb push_back
            #define all(x) (x).begin(), (x).end()
            #define lb lower_bound
            #define int ll

            int N, M, ST[800005], lazy[800005], L[200005], R[200005];
            void prop(int v, int l, int r) {
                if(l == r) return;
                lazy[v * 2] += lazy[v];
                lazy[v * 2 + 1] += lazy[v];

                ST[v * 2] += lazy[v];
                ST[v * 2 + 1] += lazy[v];

                lazy[v] = 0; return;
            }
            void update(int v, int l, int r, int lo, int hi, int val) {
                prop(v, l, r);
                if(l > hi || r < lo) return;
                if(l >= lo && r <= hi) {
                    ST[v] += val; lazy[v] += val;
                    return;
                }
                update(v * 2, l, (l + r) / 2, lo, hi, val);
                update(v * 2 + 1, (l + r) / 2 + 1, r, lo, hi, val);
                ST[v] = min(ST[v * 2], ST[v * 2 + 1]);
            }
            int query(int v, int l, int r, int lo, int hi) {
                prop(v, l, r);
                if(l > hi || r < lo) return 1e9 + 7;
                if(l >= lo && r <= hi) return ST[v];
                return min(query(v * 2, l, (l + r) / 2, lo, hi),
                           query(v * 2 + 1, (l + r) / 2 + 1, r, lo, hi));
            }

            int32_t main() {
                ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
                cin >> N >> M;
                for(int l = 1; l <= N; l++) L[l] = l, R[l] = l;
                for(int l = 1; l <= M; l++) {
                    int U, V; cin >> U >> V;
                    L[V] = min(L[V], U); L[U] = min(L[U], V);
                    R[V] = max(R[V], U); R[U] = max(R[U], V);
                }
                int i = 1;
                for(int l = 2; l <= N; l++) {
                    while(i < l && R[i] <= l) i++;
                    update(1, 1, N, 1, L[l] - 1, 1);
                    int P = query(1, 1, N, 1, i - 1);
                    update(1, 1, N, l, l, P);
                }
                cout << ST[1] << "\n";
                return 0;
            }





#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...