답안 #100601

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
100601 2019-03-12T18:27:27 Z ubiratan37 Pictionary (COCI18_pictionary) C++11
140 / 140
1315 ms 9924 KB
#include <bits/stdc++.h>

#define int long long
#define double long double
#define ff first
#define ss second
#define endl '\n'
#define ii pair<int, int>
#define mp make_pair
#define mt make_tuple
#define DESYNC ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define pb push_back
#define vi vector<int>
#define vii vector< ii >
#define EPS 1e-9
#define INF 1e18
#define ROOT 1
#define M 1000000007
const double PI = acos(-1);

using namespace std;

inline int mod(int n, int m){ int ret = n%m; if(ret < 0) ret += m; return ret; }

int gcd(int a, int b){
  if(a == 0) return b;
  else return gcd(b%a, a);
}

int uf[112345];
int sz[112345];
int mx[112345];
vector<int> g[112345];
int L[112345];

int find(int u){
  if(uf[u] == u) return u;
  else return find(uf[u]);
}

void init(int n, int m){
  for(int i=0; i<=n; i++){
    uf[i] = i;
    sz[i] = 1;
    mx[i] = 0;
  }
  for(int i=m, j = 1; i >= 1; i--, j++){
     mx[i] = j;
  }
}

int maxl = 0;

void merge(int x, int y){
  int a = find(x);
  int b = find(y);
  if(a == b) return;
  uf[b] = a;
  sz[a] += sz[b];
}
  
void go(int u, int l){
  L[u] = l;
  maxl = max(maxl, l);
  for(int v : g[u]){
    go(v, l+1);
  }
}

int32_t main(){
  DESYNC;
  int n,m;
  cin >> n >> m;
  init(n,m);
  for(int i=m; i>=1; i--){
    for(int j=i; j<=n; j+=i){
      merge(i, j);
    }
  }
  for(int i=1; i<=n; i++){
    //cout << "i + uf[i]" << i << " + " << uf[i] << endl;
    if(uf[i] != i){
      g[uf[i]].pb(i);
    }
  }
  go(find(1), 1);
  int q;
  cin >> q;
  while(q--){
    int ans = 0;
    int u,v;
    cin >> u >> v;
    while(u != v){
      if(L[u] > L[v]){
        ans = max(ans, mx[u]);
        u = uf[u];
      }
      else {
        ans = max(ans, mx[v]);
        v = uf[v];
      }
    }
    ans = max(ans, mx[u]);
    cout << ans << endl;
  }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 3072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 3328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 3832 KB Output is correct
2 Correct 25 ms 3872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 4264 KB Output is correct
2 Correct 31 ms 4216 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 120 ms 4836 KB Output is correct
2 Correct 118 ms 4856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 193 ms 5368 KB Output is correct
2 Correct 178 ms 5496 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 366 ms 6564 KB Output is correct
2 Correct 386 ms 6264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 7064 KB Output is correct
2 Correct 736 ms 8020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 875 ms 8504 KB Output is correct
2 Correct 1060 ms 8956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1315 ms 9924 KB Output is correct
2 Correct 1313 ms 9848 KB Output is correct