제출 #1199319

#제출 시각아이디문제언어결과실행 시간메모리
1199319mychecksedadEvent Hopping 2 (JOI21_event2)C++20
100 / 100
169 ms26120 KiB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
#define ff first
#define ss second
#define pii pair<int,int>
#define vi vector<int>
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;


int sz, T[N];
void build(){
  for(int i = 0; i <= 2*sz + 1; ++i) T[i] = 0;
}
void upd(int v, int val){
  v += sz;
  T[v] = max(T[v], val);
  for(v >>= 1; v > 0; v >>= 1) T[v] = max(T[v<<1], T[v<<1|1]);
}
int get(int l, int r){
  l += sz;
  r += sz + 1;
  int res = 0;
  for(; l < r; l >>= 1, r >>= 1){
    if(l&1) res = max(res, T[l++]);
    if(r&1) res = max(res, T[--r]);
  }
  return res;
}
int n, k, go[N][20];
array<int, 3> a[N];

int gett(int l, int r){
  int ans = 0;
  int v = l;
  if(go[v][0] > r) return 0;
  for(int j = 19; j >= 0; --j){
    if(go[v][j] <= r){
      ans += (1<<j);
      v = go[v][j];
    }
  }
  return ans;
}

void solve(){
  cin >> n >> k;
  vi val;
  for(int i = 1; i <= n; ++i){
    cin >> a[i][0] >> a[i][1];
    a[i][2] = i;
    val.pb(a[i][0]);
    val.pb(a[i][1]);
  }
  sort(all(val));
  val.erase(unique(all(val)), val.end());
  for(int i = 1; i <= n; ++i){
    a[i][0] = lower_bound(all(val), a[i][0]) - val.begin() + 1;
    a[i][1] = lower_bound(all(val), a[i][1]) - val.begin() + 1;
  }

  int m = val.size();
  sort(a+1, a+1+n);
  sz = m;
  

  build();
  vector<int> dp(m + 37);
  for(int i = 1; i <= n; ++i){
    int L = a[i][0];
    int R = a[i][1];
    dp[R] = max(dp[R], get(1, L) + 1);
    upd(R, dp[R]);
  }
  for(int i = 1; i <= m; ++i) dp[i] = max(dp[i], dp[i - 1]);
  int max_sum = dp[m];

  int last = m + 1, cnt = n;
  for(int i = m; i >= 1; --i){
    while(cnt >= 1 && a[cnt][0] >= i){
      last = min(a[cnt][1], last);
      --cnt;
    }
    go[i][0] = last;
  }
  go[m + 1][0] = m + 1;
  for(int j = 1; j < 20; ++j){
    for(int i = 1; i <= m + 1; ++i){
      go[i][j] = go[go[i][j - 1]][j - 1];
    }
  }

      
  vi pos(n + 1);
  for(int i = 1; i <= n; ++i){
    pos[a[i][2]] = i;
  }

  vi res;
  set<array<int, 2>> S;
  S.insert({1, m});
  int num = k;
  for(int i = 1; i <= n; ++i){
    if(num == 0) break;
    int L = a[pos[i]][0];
    int R = a[pos[i]][1];
    auto it = S.upper_bound(array<int, 2>{R, -1});
    if(it != S.begin() && (*prev(it))[0] <= L){
      auto [l, r] = (*prev(it));
      if(!(l <= L && R <= r)) continue;
      int bef = gett(l, r);
      int aft = gett(l, L) + 1 + gett(R, r);
      // cout << L << ' ' << R << ' ' << l << ' ' << r << '\n'; 
      if(max_sum - bef + aft >= k){
        max_sum = max_sum - bef + aft;
        S.erase(prev(it));
        if(l < L)
          S.insert({l, L});
        if(R < r)
          S.insert({R, r});
        --num;
        res.pb(i);
      }
    }
  }

  // for(auto [l, r, ldp, rdp, i]: S) cout << val[l] << ' ' << val[r] << ' ' << l << ' ' << r << ' ' << i << '\n';

  if(res.size() < k){
    cout << -1;
    en;
    return;
  }

  sort(all(res));
  for(int x: res) cout << x << '\n';
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    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...