Submission #1128913

#TimeUsernameProblemLanguageResultExecution timeMemory
1128913nhanhoang510Fire (BOI24_fire)C++20
27 / 100
175 ms2000 KiB
#include <bits/stdc++.h>
#define F first
#define S second

using namespace std;

const int maxn = 2 * 1e5 + 7;
const int LOG = 20;
const long long MOD = (long long)(1e9) + 7;
const long long base = 311;
const int ALP_BET = 26;

typedef pair<int, int> ii;
typedef pair<int, long long> il;
typedef pair<long long, int> li;
typedef pair<long long, long long> ll;

struct RANGE{
    int l, r;
};

bool cmp_RANGE(RANGE a, RANGE b){
    return a.l < b.l;
}

int n, m;
RANGE a[maxn];

namespace SUB1{

struct ITEM{
    int id, l, r;
};

bool cmp(ITEM a, ITEM b){
    return a.l < b.l;
}

const int maxN = 20 + 7;
ii getid[maxN];
bool ok[maxN];
int nn; ITEM arr[2 * maxN];

int N; RANGE b[maxN];

void solve(){
    nn = 0;
    for(int i = 1; i <= n; ++i) if(a[i].l <= a[i].r){
        ++nn;
        arr[nn] = {i, a[i].l, a[i].r};
    } else{
        ++nn;
        arr[nn] = {i, 1, a[i].r};
        ++nn;
        arr[nn] = {i, a[i].l, m};
    }
    sort(arr + 1, arr + nn + 1, cmp);
    for(int i = 1; i <= n; ++i) getid[i] = {-1, -1};
    for(int i = 1; i <= nn; ++i){
        int pos = arr[i].id;
        if(getid[pos].F == -1)
            getid[pos].F = i;
        else{
            getid[pos].S = getid[pos].F;
            getid[pos].F = i;
        }
    }

//    cerr << "--------------\n";
//    cerr << nn << "\n";
//    for(int i = 1; i <= nn; ++i){
//        cerr << arr[i].id << " " << arr[i].l << " " << arr[i].r << "\n";
//    }
//    cerr << "--------------\n";
//    for(int i = 1; i <= n; ++i){
//        cerr << getid[i].F << " " << getid[i].S << "\n";
//    }

    int ans = n + 1;
    int max_state = (1 << n);
    for(int state = 1; state < max_state; ++state){
        memset(ok, false, sizeof(ok));
        for(int i = 0; i < n; ++i) if(state & (1 << i)){
            ok[getid[i + 1].F] = true;
            if(getid[i + 1].S != -1)
                ok[getid[i + 1].S] = true;
        }
        N = 0;
        for(int i = 1; i <= nn; ++i) if(ok[i]){
            ++N;
            b[N] = {arr[i].l, arr[i].r};
        }
        bool check = true;
        int Max = 0;
        for(int i = 1; i <= N; ++i){
            int l = b[i].l, r = b[i].r;
            if(l - Max > 1){
                check = false;
                break;
            }
            Max = max(Max, r);
        }
        if(Max != m) check = false;
        if(check == true){
            ans = min(ans, __builtin_popcount(state));
        }
    }
    if(ans == n + 1)
        ans = -1;
    cout << ans << "\n";
    return;
}

}

int solve_st(RANGE a[]){
    sort(a + 1, a + n + 1, cmp_RANGE);
    int Maxx = 0; bool ok = true;
    for(int i = 1; i <= n; ++i){
        int l = a[i].l, r = a[i].r;
        if(l - Maxx > 1){
            ok = false;
            break;
        }
        Maxx = max(Maxx, r);
    }
    if(Maxx != m) ok = false;
    if(!ok){
        return -1;
    }
    int ans = 0, Max = 0, MaxAll = 0;
    for(int i = 1; i <= n; ++i){
        int l = a[i].l, r = a[i].r;
        if(l > Max + 1){
            ++ans;
            Max = MaxAll;
        }
        MaxAll = max(MaxAll, r);
        if(MaxAll == m){
            ++ans;
            break;
        }
    }
    return ans;
}

namespace SUB4{

void solve(){
    int ans = solve_st(a);
    cout << ans << "\n";
    return;
}

}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= n; ++i){
        int l, r; cin >> l >> r;
        r = (r - 1 + m) % m;
        l = l + 1, r = r + 1;
        a[i] = {l, r};
    }
    if(n <= 20){
        SUB1::solve();
    } else
        SUB4::solve();
    return 0;
}
#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...