답안 #714298

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
714298 2023-03-24T08:11:54 Z vjudge1 Event Hopping (BOI22_events) C++17
0 / 100
1500 ms 24412 KB
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
const int N=100'010;
const int LG=20;
struct event {
  int s, e, idx;
};
event es[N];
struct Binary_Lifting {
  int up[N][LG];
  void add(int node, int par) {
    up[node][0]=par;
    for(int i = 1;i<LG;i++) {
      up[node][i]=up[up[node][i-1]][i-1];
    }
  }
  int get(int start, int num) {
    if(es[start].e>=num)return 1;
    int res=1;
    for(int i = LG-1;i>=0;i--) {
      if(es[up[start][i]].e<num) {
        start=up[start][i];
        res+=(1<<i);
      }
    }
    if(es[up[start][0]].e>=num)return res+1;
    return -1;
  }
};
bool operator<(const event &a, const event &b) {
  return a.e>b.e;
}
Binary_Lifting bl;
vector<int> child[N];
int out[N];
void dfs(int at) {
  for(int to:child[at]){ 
    bl.add(to,at);  
    dfs(to);
  }
}
int main () {
  cin.tie(0)->sync_with_stdio(0);
  int n, q;
  cin >> n >> q;
  map<int,int> cc;
  for(int i = 0;i<n;i++) {
    cin >> es[i].e >> es[i].s;
    es[i].s*=-1;
    es[i].e*=-1;
    cc[es[i].s]=1;
    cc[es[i].e]=1;
    es[i].idx=i;
  }
  vector<event> on[2*n], off[2*n];
  {
    int cnt=0;
    for(auto &i:cc) {
      i.second=cnt++;
    }
    for(int i = 0;i<n;i++) {
      es[i].s=cc[es[i].s];
      es[i].e=cc[es[i].e];
    }
  }
  for(int i = 0;i<n;i++) {
    on[es[i].e].push_back(es[i]);
    off[es[i].s].push_back(es[i]);
  }
  multiset<event, less<>> ms;
  for(int i = 0;i<n;i++) {
    int mx=i;
    for(int j = 0;j<n;j++) {
      if(i==j)continue;
      if(es[i].s<=es[j].s and es[mx].e<es[j].e and es[j].s <= es[i].e) {
        mx=j;
      }
    }
    if(i!=mx) {
      out[i]++;
      child[mx].push_back(i);
    }
  }
  for(int i = 0;i<n;i++) {
    if(out[i]==0){
      bl.add(i,i);
      dfs(i);
    }
  }
  while(q--) {
   int s, e;
   cin >> s >> e;
   swap(s,e);
   if(es[s-1].s>es[e-1].s){
     cout << -1 << "\n";
     continue;
   }
   if(s==e) {
     cout << 0 << "\n";
     continue;
   }
   int res=bl.get(s-1,es[e-1].s);
   if(res>=0)cout << res << "\n";
   else cout << "impossible\n";
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Execution timed out 1565 ms 24412 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2644 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2644 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 2644 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1547 ms 24376 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2644 KB Output is correct
2 Execution timed out 1565 ms 24412 KB Time limit exceeded
3 Halted 0 ms 0 KB -