답안 #603828

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
603828 2022-07-24T12:10:37 Z DanerZein Event Hopping (BOI22_events) C++14
20 / 100
1500 ms 40896 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
typedef pair<ii,int> iii;
typedef vector<ii> vii;
typedef vector<int> vi;
const int MIN_N=5010;
const int MAX_N=1e5+10;
const int MAX=1e9;
vector<vi> G;
vii ev;
int dis[MIN_N][MIN_N];
int ans[MAX_N];
int n;
bool isq[MAX_N];
void bfs(int u){
  for(int i=0;i<n;i++) dis[u][i]=MAX;
  dis[u][u]=0; isq[u]=1;
  queue<int> q; q.push(u);
  while(!q.empty()){
    int x=q.front(); q.pop();
    isq[x]=0;
    for(auto &v:G[x]){
      if(dis[u][v]>dis[u][x]+1){
	dis[u][v]=dis[u][x]+1;
	if(!isq[v]){
	  isq[v]=1;
	  q.push(v);
	}
      }
    }
  }
}
int in[MAX_N];
int pa[MAX_N][32];
int le[MAX_N];
void dfs(int u,int p){
  pa[u][0]=p;
  for(int i=1;i<=20;i++){
    pa[u][i]=pa[pa[u][i-1]][i-1];
  }
  for(auto &v:G[u]){
    if(v!=p) {
      le[v]=le[u]+1;
      dfs(v,u);
    }
  }
}
int father(int u,int v){
  int dif=le[u]-le[v];
  if(dif<0) return -1;
  for(int i=0;i<=20;i++){
    if(dif&(1<<i)) u=pa[u][i];
  }
  if(u!=v) return -1;
  return dif;
}
int con[MAX_N];
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);
  int q; cin>>n>>q;
  bool t2=0;
  if(n<=5001) t2=1;
  vii enp;
  for(int i=0;i<n;i++){
    int a,b; cin>>a>>b;
    ev.push_back(ii(a,b));
    enp.push_back(ii(b,i));
    con[i]=i;
  }
  G.resize(n+1);
  if(t2){
    for(int i=0;i<n;i++){
      for(int j=0;j<n;j++){
	if(ev[j].first<=ev[i].second && ev[i].second<=ev[j].second){
	  G[i].push_back(j);
	}
      }
    }
    for(int i=0;i<n;i++) bfs(i);
  }
  else{
    sort(enp.begin(),enp.end());
    for(int i=0;i<n-1;i++){
      if(enp[i].first==enp[i+1].first){
	con[enp[i].second]=enp[i+1].second;
	con[enp[i+1].second]=enp[i].second;
      }
    }
    for(int i=0;i<n;i++){
      auto it=lower_bound(enp.begin(),enp.end(),ii(ev[i].first,0));
      int l=it-enp.begin();
      it=upper_bound(enp.begin(),enp.end(),ii(ev[i].second+1,0));
      int r=it-enp.begin();
      for(int j=l;j<r;j++){
	if(i!=enp[j].second){
	  G[i].push_back(enp[j].second);
	  in[enp[j].second]=1;
	}
      }
    }
    for(int i=0;i<n;i++){
      if(!in[i] || con[i]!=i){
	dfs(i,i);
      }
    }
  }
  while(q--){
    int s,e; cin>>s>>e;
    s--; e--;
    if(t2){
      if(dis[s][e]>=MAX) cout<<"impossible\n";
      else cout<<dis[s][e]<<endl;
    }
    else{
      int ans=father(s,e);
      if(ans!=-1) cout<<ans<<endl;
      else{
	int ca=father(s,con[e])+1;
	if(ca!=0) cout<<ca<<endl;
	else
	  cout<<"impossible\n";
      }
    }
  }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 269 ms 27896 KB Output is correct
3 Correct 256 ms 27940 KB Output is correct
4 Correct 274 ms 27928 KB Output is correct
5 Correct 262 ms 27048 KB Output is correct
6 Correct 228 ms 26144 KB Output is correct
7 Correct 275 ms 25892 KB Output is correct
8 Correct 110 ms 19844 KB Output is correct
9 Correct 84 ms 18428 KB Output is correct
10 Correct 179 ms 25224 KB Output is correct
11 Correct 181 ms 23224 KB Output is correct
12 Correct 82 ms 22160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 19 ms 8276 KB Output is correct
4 Correct 15 ms 8264 KB Output is correct
5 Correct 20 ms 8276 KB Output is correct
6 Correct 49 ms 9096 KB Output is correct
7 Correct 119 ms 9920 KB Output is correct
8 Correct 141 ms 10892 KB Output is correct
9 Correct 834 ms 12256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 19 ms 8276 KB Output is correct
4 Correct 15 ms 8264 KB Output is correct
5 Correct 20 ms 8276 KB Output is correct
6 Correct 49 ms 9096 KB Output is correct
7 Correct 119 ms 9920 KB Output is correct
8 Correct 141 ms 10892 KB Output is correct
9 Correct 834 ms 12256 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 0 ms 340 KB Output is correct
12 Correct 19 ms 8260 KB Output is correct
13 Correct 14 ms 8276 KB Output is correct
14 Correct 20 ms 8272 KB Output is correct
15 Correct 47 ms 9044 KB Output is correct
16 Correct 167 ms 9892 KB Output is correct
17 Correct 146 ms 10888 KB Output is correct
18 Correct 762 ms 12236 KB Output is correct
19 Execution timed out 1589 ms 40896 KB Time limit exceeded
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 19 ms 8276 KB Output is correct
4 Correct 15 ms 8264 KB Output is correct
5 Correct 20 ms 8276 KB Output is correct
6 Correct 49 ms 9096 KB Output is correct
7 Correct 119 ms 9920 KB Output is correct
8 Correct 141 ms 10892 KB Output is correct
9 Correct 834 ms 12256 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 0 ms 340 KB Output is correct
12 Correct 20 ms 8276 KB Output is correct
13 Correct 14 ms 8240 KB Output is correct
14 Correct 21 ms 8328 KB Output is correct
15 Correct 46 ms 9040 KB Output is correct
16 Correct 121 ms 9836 KB Output is correct
17 Correct 148 ms 10900 KB Output is correct
18 Correct 766 ms 12336 KB Output is correct
19 Correct 105 ms 27248 KB Output is correct
20 Execution timed out 1586 ms 21400 KB Time limit exceeded
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 251 ms 28016 KB Output is correct
2 Correct 243 ms 28084 KB Output is correct
3 Correct 276 ms 27976 KB Output is correct
4 Correct 84 ms 18436 KB Output is correct
5 Correct 194 ms 25052 KB Output is correct
6 Execution timed out 1572 ms 38304 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 269 ms 27896 KB Output is correct
3 Correct 256 ms 27940 KB Output is correct
4 Correct 274 ms 27928 KB Output is correct
5 Correct 262 ms 27048 KB Output is correct
6 Correct 228 ms 26144 KB Output is correct
7 Correct 275 ms 25892 KB Output is correct
8 Correct 110 ms 19844 KB Output is correct
9 Correct 84 ms 18428 KB Output is correct
10 Correct 179 ms 25224 KB Output is correct
11 Correct 181 ms 23224 KB Output is correct
12 Correct 82 ms 22160 KB Output is correct
13 Correct 0 ms 340 KB Output is correct
14 Correct 1 ms 340 KB Output is correct
15 Correct 19 ms 8276 KB Output is correct
16 Correct 15 ms 8264 KB Output is correct
17 Correct 20 ms 8276 KB Output is correct
18 Correct 49 ms 9096 KB Output is correct
19 Correct 119 ms 9920 KB Output is correct
20 Correct 141 ms 10892 KB Output is correct
21 Correct 834 ms 12256 KB Output is correct
22 Correct 0 ms 340 KB Output is correct
23 Correct 0 ms 340 KB Output is correct
24 Correct 19 ms 8260 KB Output is correct
25 Correct 14 ms 8276 KB Output is correct
26 Correct 20 ms 8272 KB Output is correct
27 Correct 47 ms 9044 KB Output is correct
28 Correct 167 ms 9892 KB Output is correct
29 Correct 146 ms 10888 KB Output is correct
30 Correct 762 ms 12236 KB Output is correct
31 Execution timed out 1589 ms 40896 KB Time limit exceeded
32 Halted 0 ms 0 KB -