Submission #117574

#TimeUsernameProblemLanguageResultExecution timeMemory
117574PeppaPigBitaro’s Party (JOI18_bitaro)C++14
14 / 100
2069 ms415068 KiB
#include <bits/stdc++.h>

#define pii pair<int, int>
#define x first
#define y second

using namespace std;

const int N = 1e5+5;
const int B = 320;

int n, m, q;
vector<int> g[N];

int dp[N], chk[N];

void bruteforce(vector<int>& block) {
    fill_n(dp, N, -1e9);
    for(int i : block) chk[i] = 1;
    for(int u = 1; u <= n; u++) {
        if(!chk[u]) dp[u] = max(dp[u], 0);
        if(dp[u] == -1e9) continue;
        for(int v : g[u]) dp[v] = max(dp[v], dp[u] + 1);
    }
    for(int i : block) chk[i] = 0;
}

int mx[N];
vector<pii> pre[N];

void pre_process() {
    fill_n(mx, N, -1);
    for(int i = 1; i <= n; i++) pre[i].emplace_back(0, i);

    for(int u = 1; u <= n; u++) {
        vector<pii> tmp;
        for(pii p : pre[u]) tmp.emplace_back(p.x + 1, p.y);
        for(int v : g[u]) {
            vector<pii> ret;
            for(pii p : tmp) mx[p.y] = max(mx[p.y], p.x);
            for(pii p : pre[v]) mx[p.y] = max(mx[p.y], p.x);

            int l = 0, r = 0;
            while(l < tmp.size() && r < pre[v].size()) {
                pii a = tmp[l], b = pre[v][r];
                if(a > b) ret.emplace_back(a), l++;
                else ret.emplace_back(b), r++;
            }
            while(l < tmp.size()) {
                pii a = tmp[l];
                ret.emplace_back(a), l++;
            }
            while(r < pre[v].size()) {
                pii b = pre[v][r];
                ret.emplace_back(b), r++;
            }
            pre[v].clear();
            for(pii p : ret) if(p.x == mx[p.y]) {
                mx[p.y] = -1;
                pre[v].emplace_back(p);
            }
            while(pre[v].size() > B) pre[v].pop_back();
        }     
    }
}

int main() {
    scanf("%d %d %d", &n, &m, &q);
    for(int i = 1, a, b; i <= m; i++) {
        scanf("%d %d", &a, &b);
        g[a].emplace_back(b);
    }
    pre_process();
    for(int x = 1, t, y; x <= q; x++) {
        vector<int> block;
        scanf("%d %d", &t, &y);
        for(int i = 1, a; i <= y; i++) {
            scanf("%d", &a);
            block.emplace_back(a);
        }
        if(y >= B) {
            bruteforce(block);
            if(dp[t] == -1e9) printf("-1\n");
            else printf("%d\n", dp[t]);
        } else {
            bool valid = false;
            for(int i : block) chk[i] = 1;
            for(pii p : pre[t]) if(!chk[p.y]) {
                printf("%d\n", p.x);
                valid = true;
                break;
            }
            if(!valid) printf("-1\n");
            for(int i : block) chk[i] = 0;
        }
    }    

    return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'void pre_process()':
bitaro.cpp:44:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size() && r < pre[v].size()) {
                   ~~^~~~~~~~~~~~
bitaro.cpp:44:39: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size() && r < pre[v].size()) {
                                     ~~^~~~~~~~~~~~~~~
bitaro.cpp:49:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(l < tmp.size()) {
                   ~~^~~~~~~~~~~~
bitaro.cpp:53:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(r < pre[v].size()) {
                   ~~^~~~~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %d", &n, &m, &q);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:70:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &a, &b);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:76:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &t, &y);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:78:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &a);
             ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...