Submission #1301054

#TimeUsernameProblemLanguageResultExecution timeMemory
1301054trandangquangEvent Hopping 2 (JOI21_event2)C++20
100 / 100
153 ms26852 KiB
#include<bits/stdc++.h>
using namespace std;

#define foru(i,a,b) for(int i=(a); i<=(b); ++i)
#define ford(i,a,b) for(int i=(a); i>=(b); --i)
#define rep(i,a) for(int i=0; i<(a); ++i)
#define sz(a) (int)(a).size()
#define all(a) (a).begin(),(a).end()
#define bit(s,i) (((s)>>(i))&1)
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define fi first
#define se second
#define ll long long
#define int long long
#define eb emplace_back
#define pb push_back
#define __builtin_popcount __builtin_popcountll
#define _ << " " <<

template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;}
template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;}

const int N=1e5+5;
const int INF=1e9;
const int LG=17;

int n,k,cntSeg,jump[N][LG+1];
ii seg[N],iniSeg[N],seg2[N];
set<ii> st;

void buildJump(){
    foru(i,1,cntSeg) jump[i][0]=lower_bound(seg2+1,seg2+1+cntSeg,ii(seg2[i].se,0))-seg2;
    foru(i,1,LG){
        foru(j,1,cntSeg){
            if(jump[j][i-1]>cntSeg) jump[j][i]=jump[j][i-1];
            else jump[j][i]=jump[jump[j][i-1]][i-1];
        }
    }
}

int numSeg(int l, int r){
    int s=lower_bound(seg2+1,seg2+1+cntSeg,ii(l,0))-seg2;
    if(seg2[s].se>r || s>cntSeg) return 0;

    int res=1;
    ford(i,LG,0){
        if(jump[s][i]<=cntSeg && seg2[jump[s][i]].se<=r){
            res+=1<<i;
            s=jump[s][i];
        }
    }
    return res;
}

void solve(){
    cin>>n>>k;
    foru(i,1,n){
        cin>>seg[i].fi>>seg[i].se;
        iniSeg[i]=seg[i];
    }
    sort(seg+1,seg+1+n,[](ii x, ii y){return x.se<y.se || (x.se==y.se && x.fi>y.fi);});
    foru(i,1,n){
        if(cntSeg!=0 && seg[i].fi<=seg2[cntSeg].fi && seg2[cntSeg].se<=seg[i].se) continue;
        seg2[++cntSeg]=seg[i];
    }

    buildJump();

    st.insert({-1,-1});
    st.insert({INF+1,INF+1});

    vi segAns;

    int curNum=numSeg(-1,INF+1);
    if(curNum<k){
        cout<<"-1\n";
        return;
    }

    foru(i,1,n){
        auto itL=st.lower_bound(iniSeg[i]);
        auto itR=itL; --itL;

        if(iniSeg[i].fi<itL->se || iniSeg[i].se>itR->fi) continue;
        int numAfter=curNum-numSeg(itL->se,itR->fi)+numSeg(itL->se,iniSeg[i].fi)+numSeg(iniSeg[i].se,itR->fi);

        if(k>0 && numAfter>=k-1){
            curNum=numAfter; --k;
            segAns.eb(i);
            st.insert(iniSeg[i]);
        }
    }

    for(int i:segAns) cout<<i<<'\n';
}

int32_t main(){
    #define task "test"
    if(fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    cin.tie(0)->sync_with_stdio(0);

    int tc=1; //cin>>tc;
    foru(i,1,tc){
        solve();
    }
}

Compilation message (stderr)

event2.cpp: In function 'int32_t main()':
event2.cpp:102:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  102 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
event2.cpp:103:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  103 |         freopen(task".out", "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...