Submission #128768

#TimeUsernameProblemLanguageResultExecution timeMemory
128768BTheroBitaro’s Party (JOI18_bitaro)C++17
0 / 100
15 ms10616 KiB
// Why am I so dumb? :c
// chrono::system_clock::now().time_since_epoch().count()

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

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

#define pb push_back
#define mp make_pair

#define all(x) (x).begin(), (x).end()

#define fi first
#define se second

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;   
typedef pair<int, int> pii;
template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int MAXN = (int)1e5 + 5;
const int INF = (int)1e9;
const int K = 300;

pair<int, vector<int> > req[MAXN];

vector<int> adj[MAXN], par[MAXN];

int ban[MAXN], d[MAXN];

pii best[MAXN][K + 5];

int n, m, q;

void solve() {
    scanf("%d %d %d", &n, &m, &q);

    for (int i = 1; i <= m; ++i) {
        int u, v;
        scanf("%d %d", &u, &v);
        adj[u].pb(v);
        par[v].pb(u);
    }

    for (int i = 1; i <= q; ++i) {
        int v, sz;
        scanf("%d %d", &v, &sz);
        vector<int> tmp(sz);

        for (int j = 0; j < sz; ++j) {
            scanf("%d", &tmp[j]);
        }

        req[i] = mp(v, tmp);
    }

    for (int i = 1; i <= n; ++i) {
        for (int j = 0; j <= K; ++j) {
            best[i][j] = mp(-INF, 0);
        }
    }

    for (int i = 1; i <= n; ++i) {
        best[i][0] = mp(-1, i);
        vector<pii> V(K + 1);

        for (int j : par[i]) {
            int a = 0, b = 0, ptr = 0;

            while (ptr <= K) {
                if (best[i][a] > best[j][b]) {
                    V[ptr++] = best[i][a++];
                }
                else {
                    V[ptr++] = best[j][b++];
                }
            }

            for (int k = 0; k <= K; ++k) {
                best[i][k] = V[k];
            }
        }

        for (int j = 0; j <= K; ++j) {
            ++best[i][j].fi;
        }
    }

    for (int i = 1; i <= q; ++i) {
        int v = req[i].fi, ans = -1;
        vector<int> V = req[i].se;

        for (int x : V) {
            ban[x] = 1;
        }

        if (V.size() >= K) {
            fill(d + 1, d + n + 1, -INF);

            if (!ban[v]) {
                d[v] = 0;
            }

            for (int j = v - 1; j > 0; --j) {
                for (int p : adj[j]) {
                    d[j] = max(d[j], d[p] + 1);
                }
            }

            for (int j = 1; j <= v; ++j) {
                if (!ban[j]) {
                    ans = max(ans, d[j]);
                }
            } 
        }
        else {
            for (int j = 0; j <= K; ++j) {
                if (!ban[best[v][j].se]) {
                    ans = max(ans, best[v][j].fi);
                }
            }
        }

        printf("%d\n", ans);

        for (int x : V) {
            ban[x] = 0;
        }
    }
}

int main() {
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);

    int tt = 1;

    while (tt--) {
        solve();
    }

    return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'void solve()':
bitaro.cpp:41: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:45:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &u, &v);
         ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:52:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d %d", &v, &sz);
         ~~~~~^~~~~~~~~~~~~~~~~~
bitaro.cpp:56:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d", &tmp[j]);
             ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...