Submission #1010173

#TimeUsernameProblemLanguageResultExecution timeMemory
1010173UnforgettableplEvent Hopping 2 (JOI21_event2)C++17
39 / 100
1623 ms6104 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve1(int n){
    int k;
    cin >> k;
    vector<pair<int,int>> ranges(n);
    vector<int> maxchoose(n+1);
    for(auto&[a,b]:ranges)cin>>a>>b;
    int last = 1e10;
    for(int i=n-1;i>=0;i--){
        if(ranges[i].second<=last){
            last = ranges[i].first;
            maxchoose[i]=maxchoose[i+1]+1;
        } else maxchoose[i]=maxchoose[i+1];
    }
    if(maxchoose[0]<k){
        cout << "-1\n";
        return;
    }
    vector<int> ans;
    int curr = 0;
    for(int i=0;i<n;i++){
        if(curr==k)break;
        int idx = lower_bound(ranges.begin(),ranges.end(),make_pair(ranges[i].second,0ll))-ranges.begin();
        if(curr+1+maxchoose[idx]>=k){ans.emplace_back(i);i=idx-1;curr++;}
    }
    for(int&i:ans)cout<<++i<<'\n';
}

void solve2(int n){
    int k;
    cin >> k;
    vector<pair<int,int>> ranges(n);
    vector<int> maxchoose(n+1);
    map<int,vector<int>> right,left;
    vector<int> val;
    val.emplace_back(0);
    val.emplace_back(1e10);
    int g = 0;
    for(auto&[a,b]:ranges){
        cin>>a>>b;
        left[b].emplace_back(g);
        right[a].emplace_back(g);
        val.emplace_back(a);
        val.emplace_back(b);
        g++;
    }
    sort(val.begin(),val.end());
    val.erase(unique(val.begin(),val.end()),val.end());
    vector<bool> taken(n);
    vector<int> ans;
    map<int,int> lookup;
    int uq = val.size();
    for(int i=0;i<uq;i++)lookup[val[i]]=i;
    vector<int> DPleft(uq),DPright(uq);
    auto calcL = [&](){
        int last = 0;
        for(int i=1;i<uq;i++){
            DPleft[i]=DPleft[i-1];
            for(int&x:left[val[i]])if(!taken[x]){
                if(last<=ranges[x].first){
                    last = ranges[x].second;
                    DPleft[i]++;
                }
            }
        }
    };
    auto calcR = [&](){
        int last = 1e10;
        for(int i=uq-2;i>=0;i--){
            DPright[i]=DPright[i+1];
            for(int&x:right[val[i]])if(!taken[x]){
                if(ranges[x].second<=last){
                    last = ranges[x].first;
                    DPright[i]++;
                }
            }
        }
    };
    calcL();
    if(DPleft[uq-1]<k){
        cout << "-1\n";
        return;
    }
    for(int c=0;c<k;c++){
        calcL();calcR();
        for(int x=0;x<n;x++)if(!taken[x]){
            if(c+1+DPleft[lookup[ranges[x].first]]+DPright[lookup[ranges[x].second]]>=k){
                taken[x]=true;
                ans.emplace_back(x);
                for(int j=0;j<n;j++)if(min(ranges[x].second,ranges[j].second)-max(ranges[x].first,ranges[j].first)>0)taken[j]=true;
                break;
            }
        }
    }
    for(int&i:ans)cout<<++i<<'\n';
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;cin>>n;
    if(n<=5000)solve2(n);
    else solve1(n);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...