답안 #251970

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
251970 2020-07-23T10:00:52 Z Vladikus004 Pictionary (COCI18_pictionary) C++14
0 / 140
1500 ms 10372 KB
#include <bits/stdc++.h>
#define int long long
#define inf 2e9
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;

const int N = 100000 + 3;
int n, m, q, p[N], us[N], code[N], r[N], sz, ans[N];
vector <pii> a;
vector <int> d;
vector <vector <int> > v;

void init(){
    for (int i = 1; i <= n; i++) p[i] = i;
}

int get_anc(int x){
    if (p[x] == x) return x;
    return p[x] = get_anc(p[x]);
}

void unite(int x, int y){
    x = get_anc(x);
    y = get_anc(y);
    if (x == y) return;
    if (rand() & 1) swap(x, y);
    p[x] = y;
}

void fact(int x, int ind){
    for (int i = 2; i * i <= x; i++){
        if (x % i == 0){
            v[code[i]].push_back(ind);
        }
        while (x % i == 0) x /= i;
    }
    if (x != 1) v[code[x]].push_back(ind);
}

void resh(){
    for (int i = 2; i < N; i++){
        if (!r[i]){
            code[i] = sz;
            sz++;
            for (ll j = i * 1LL * i; j < N; j++){
                r[j] = 1;
            }
        }
    }
    v.resize(sz);
}

int lcm(int x, int y){
    return x / __gcd(x, y) * y;
}

void make_d(int x){
    d.clear();
    for (int i = 2; i * i <= x; i++){
        if (x % i == 0) d.push_back(i);
        while (x % i == 0) x/=i;
    }
    if (x != 1) d.push_back(x);
}

int32_t main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
    #endif // LOCAL
    cin >> n >> m >> q;
    init();
    resh();
    for (int i = 0; i < q; i++){
        int x, y;
        cin >> x >> y;
        fact(lcm(x, y), i);
        a.push_back({x, y});
        ans[i] = inf;
    }
    int cnt = 1;
    for (int i = m; i > 1; i--){
        for (int j = 2 * i; j <= n; j += i){
            unite(j, j - i);
        }
        make_d(i);
        for (auto u: d)
        for (int j = 0; j < v[code[u]].size(); j++){
            if (us[v[code[u]][j]]){
                swap(v[code[u]][j], v[code[u]][v[code[u]].size() - 1]);
                v[code[u]].pop_back();
                --j;
                continue;
            }
            if (get_anc(a[v[code[u]][j]].first)==get_anc(a[v[code[u]][j]].second)){
                us[v[code[u]][j]] = 1;
                ans[v[code[u]][j]] = min(ans[v[code[u]][j]], cnt);
            }
        }
        cnt++;
    }
    for (int i = 0; i < q; i++){
        cout << min(m,ans[i]) << "\n";
    }
}

Compilation message

pictionary.cpp: In function 'int32_t main()':
pictionary.cpp:93:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < v[code[u]].size(); j++){
                         ~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 39 ms 1728 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 232 ms 2704 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1581 ms 6560 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1591 ms 8468 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1592 ms 5152 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1584 ms 5148 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1575 ms 7064 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 969 ms 10372 KB Output is correct
2 Execution timed out 1584 ms 8852 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1592 ms 8920 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1587 ms 9160 KB Time limit exceeded
2 Halted 0 ms 0 KB -