답안 #256913

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
256913 2020-08-03T11:52:30 Z Pankin Pictionary (COCI18_pictionary) C++14
126 / 140
1500 ms 11840 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

/*
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("-O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
*/

#define mp make_pair
#define ll long long
#define ld long double
#define pb push_back
#define fast_io ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define fs first
#define sc second
#define getfiles ifstream cin("input.txt"); ofstream cout("output.txt");
#define endl '\n'
#define pii pair<int, int>

const int INF = 2000000005;
const ll BIG_INF = 2000000000000000005;
const int mod = 1000000007;
const int P = 31;
const ld PI = 3.141592653589793238462643;
const double eps = 1e-9;

using namespace std;
using namespace __gnu_pbds;

bool valid(int x, int y, int n, int m) {
    return x >= 0 && y >= 0 && x < n && y < m;
}

mt19937 rng(1999999973);

typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int N = 100000 + 50;

vector<int> del[N];
int n, m, q, ans[N], p[N], sz[N];

struct query {
    int u, v, ind;
    query(){}
    query(int u, int v, int ind) {
        this->u = u;
        this->v = v;
        this->ind = ind;
    }
};

vector<query> req[N];

int find_set(int v) {
    if (p[v] == v)
        return v;
    p[v] = find_set(p[v]);
    return p[v];
}

inline void add_edge(int u, int v, int day) {
    u = find_set(u), v = find_set(v);
    if (u == v)
        return;

    if (sz[u] > sz[v])
        swap(u, v);
    p[u] = v;
    sz[v] += sz[u];
    for (int i = 0; i < req[v].size(); i++) {
        if (find_set(req[v][i].u) == find_set(req[v][i].v)) {
            ans[req[v][i].ind] = day;
            swap(req[v][i], req[v].back());
            req[v].pop_back();
            i--;
        }
    }
    for (int i = 0; i < req[u].size(); i++) {
        if (find_set(req[u][i].u) == find_set(req[u][i].v)) {
            ans[req[u][i].ind] = day;
            swap(req[u][i], req[u].back());
            req[u].pop_back();
            i--;
        }
    }
    for (int i = 0; i < req[u].size(); i++) {
        req[v].pb(req[u][i]);
    }
    req[u].clear();
}

signed main() {
    fast_io;


    cin >> n >> m >> q;

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

    for (int i = 0; i < q; i++) {
        int u, v;
        cin >> u >> v;
        req[u].pb(query(u, v, i));
    }
    for (int i = m; i >= 1; i--) {
        for (int j = i + i; j <= n; j += i) {
            add_edge(i, j, m - i + 1);
        }
    }
    for (int i = 0; i < q; i++)
        cout << ans[i] << endl;

    return 0;
}

Compilation message

pictionary.cpp: In function 'void add_edge(int, int, int)':
pictionary.cpp:74:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < req[v].size(); i++) {
                     ~~^~~~~~~~~~~~~~~
pictionary.cpp:82:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < req[u].size(); i++) {
                     ~~^~~~~~~~~~~~~~~
pictionary.cpp:90:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < req[u].size(); i++) {
                     ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 5376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 6272 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 44 ms 9140 KB Output is correct
2 Correct 53 ms 8116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 71 ms 10884 KB Output is correct
2 Correct 67 ms 9484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 104 ms 7800 KB Output is correct
2 Correct 105 ms 7800 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 141 ms 8184 KB Output is correct
2 Correct 491 ms 7672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 232 ms 9336 KB Output is correct
2 Correct 152 ms 8056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1578 ms 9208 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 419 ms 11128 KB Output is correct
2 Correct 466 ms 11000 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 556 ms 11840 KB Output is correct
2 Correct 540 ms 11640 KB Output is correct