Submission #1339566

#TimeUsernameProblemLanguageResultExecution timeMemory
1339566SemicolonPictionary (COCI18_pictionary)C++20
140 / 140
129 ms10292 KiB
/**
 *     Author: Lưu Diệp Thành (Save Diệp Thành)
 *     Le Hong Phong High School for the Gifted (i2528)
**/
#include<bits/stdc++.h>
using namespace std;
#define int long long
//#define ll long long
#define ushort unsigned short
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORN(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define endl '\n'
#define sz(x) (int)x.size()
#define fi first
#define se second
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
#define ins insert
#define segleft (id<<1)
#define segright (id<<1|1)
#define TIME  (1.0 * clock() / CLOCKS_PER_SEC)
const int MOD = 1e9+7;

struct info {
    int a,b;
};

struct DSU {
    vector<int> par, num;
    int n;

    DSU() {}

    void init(int _n) {
        n = _n;
        par.assign(n+5, 0);
        num.assign(n+5, 0);
        iota(all(par), 0);
        fill(all(num), 1);
    }

    int findpar(int u) {
        return (par[u] == u ? u : par[u] = findpar(par[u]));
    }

    bool unite(int u, int v) {
        u = findpar(u);
        v = findpar(v);
        if (u==v) return false;

        if (num[u] < num[v]) swap(u,v);
        par[v] = u;
        num[u] += num[v];
        return true;
    }
};

const int N = 1e5+5;
vector<info> query(N);
vector<int> canMid[N];
int n,q,m;

void Semicolon() {
    cin >> n >> m >> q;
    FOR(i, 1, q) {
        cin >> query[i].a >> query[i].b;
    }

    vector<int> l(q+5,1), r(q+5,m), ans(q+5);
    bool flag = true;
    DSU dsu;
    dsu.init(n);

    FOR(i, 1, q) {
        if (query[i].a==query[i].b) {
            l[i] = m+1;
            r[i] = 0;
            ans[i] = 0;
        }
    }

    while(flag) {
        flag = false;
        FOR(i, 1, q) {
            if (l[i] > r[i]) continue;
            int mid = (l[i] + r[i])>>1;
            flag = true;
            canMid[mid].pb(i);
        }
        if (!flag) break;

        FOR(day, 1, m) {
            int t = m-day+1;
            for(int j = 2*t; j <= n; j+=t) {
                dsu.unite(j, j - t);
            }

            for(int index : canMid[day]) {
                auto[a,b] = query[index];
                if (dsu.findpar(a) == dsu.findpar(b)) {
                    ans[index] = day;
                    r[index] = day-1;
                } else {
                    l[index] = day+1;
                }
            }
            vector<int>().swap(canMid[day]);
        }
        dsu.init(n);
    }

    FOR(i, 1, q) {
        cout << ans[i] << endl;
    }
}

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    //freopen("", "r", stdin);
    //freopen("", "w", stdout);
    if (fopen("input.txt", "r")) freopen("input.txt", "r", stdin);
    int t = 1;
    //cin >> t;
    while(t--) Semicolon();

    cerr << endl;
    cerr << "Time elapsed: " << TIME << " s.\n ";
    return (0 ^ 0);
}

Compilation message (stderr)

pictionary.cpp: In function 'int main()':
pictionary.cpp:123:41: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |     if (fopen("input.txt", "r")) freopen("input.txt", "r", stdin);
      |                                  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...