제출 #154813

#제출 시각아이디문제언어결과실행 시간메모리
154813popovicirobertBitaro’s Party (JOI18_bitaro)C++14
100 / 100
1807 ms167420 KiB
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long



#if 0
const int MOD = ;

inline int lgput(int a, int b) {
    int ans = 1;
    while(b > 0) {
        if(b & 1) ans = (1LL * ans * a) % MOD;
        b >>= 1;
        a = (1LL * a * a) % MOD;
    }
    return ans;
}

inline void mod(int &x) {
    if(x >= MOD)
        x -= MOD;
}

inline void add(int &x, int y) {
    x += y;
    mod(x);
}

inline void sub(int &x, int y) {
    x += MOD - y;
    mod(x);
}

inline void mul(int &x, int y) {
    x = (1LL * x * y) % MOD;
}

inline int inv(int x) {
    return lgput(x, MOD - 2);
}
#endif

#if 0
int fact[], invfact[];

inline void prec(int n) {
    fact[0] = 1;
    for(int i = 1; i <= n; i++) {
        fact[i] = (1LL * fact[i - 1] * i) % MOD;
    }
    invfact[n] = lgput(fact[n], MOD - 2);
    for(int i = n - 1; i >= 0; i--) {
        invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD;
    }
}

inline int comb(int n, int k) {
    if(n < k) return 0;
    return (1LL * fact[n] * (1LL * invfact[k] * invfact[n - k] % MOD)) % MOD;
}
#endif

using namespace std;

const int MAXN = (int) 1e5;
const int BUCK = 200;

vector <int> g[MAXN + 1];
pair <int, int> nodes[MAXN + 1][BUCK];
int sz[MAXN + 1];

int dp[MAXN + 1];
bool vis[MAXN + 1];

int main() {
#if 0
    ifstream cin("A.in");
    ofstream cout("A.out");
#endif
    int i, n, m, q;
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    cin >> n >> m >> q;
    for(i = 0; i < m; i++) {
        int x, y;
        cin >> x >> y;
        g[x].push_back(y);
    }

    for(i = 1; i <= n; i++) {
        nodes[i][0] = {0, i};
        sz[i] = 1;
    }

    auto combine = [&](int a, int b) -> void {

        vector < pair <int, int> > aux;

        int i = 0, j = 0;
        while(i < sz[a] && j < sz[b]) {
            if(nodes[a][i].first > nodes[b][j].first + 1) {
                if(vis[nodes[a][i].second] == 0) {
                    aux.push_back(nodes[a][i]);
                }
                vis[nodes[a][i].second] = 1;
                i++;
            }
            else {
                nodes[b][j].first++;
                if(vis[nodes[b][j].second] == 0) {
                    aux.push_back(nodes[b][j]);
                }
                vis[nodes[b][j].second] = 1;
                nodes[b][j].first--;
                j++;
            }
        }
        while(i < sz[a]) {
            if(vis[nodes[a][i].second] == 0) {
                aux.push_back(nodes[a][i]);
            }
            vis[nodes[a][i].second] = 1;
            i++;
        }
        while(j < sz[b]) {
            nodes[b][j].first++;
            if(vis[nodes[b][j].second] == 0) {
                aux.push_back(nodes[b][j]);
            }
            vis[nodes[b][j].second] = 1;
            nodes[b][j].first--;
            j++;
        }

        for(auto it : aux) {
            vis[it.second] = 0;
        }

        sz[a] = 0;
        for(i = 0; i < aux.size() && i < BUCK; i++) {
            nodes[a][sz[a]++] = aux[i];
        }


    };

    for(i = 1; i <= n; i++) {
        for(auto it : g[i]) {
            combine(it, i);
        }
    }

    while(q--) {
        int nod, num;
        cin >> nod >> num;

        vector <int> cur(num);
        for(i = 0; i < num; i++) {
            cin >> cur[i];
            vis[cur[i]] = 1;
        }

        int ans = -1;
        if(cur.size() < BUCK) {
            for(i = 0; i < sz[nod]; i++) {
                if(vis[nodes[nod][i].second] == 0) {
                    ans = nodes[nod][i].first;
                    break;
                }
            }
        }
        else {
            for(i = 1; i <= n; i++) {
                dp[i] = -1;
            }
            for(i = 1; i <= nod; i++) {
                if(vis[i] == 0) {
                    dp[i] = max(dp[i], 0);
                }
                if(dp[i] > -1) {
                    for(auto it : g[i]) {
                        dp[it] = max(dp[it], dp[i] + 1);
                    }
                }
            }
            ans = dp[nod];
        }

        cout << ans << "\n";
        for(auto it : cur) {
            vis[it] = 0;
        }
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bitaro.cpp: In lambda function:
bitaro.cpp:143:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i = 0; i < aux.size() && i < BUCK; i++) {
                    ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...