제출 #128813

#제출 시각아이디문제언어결과실행 시간메모리
128813BTheroBitaro’s Party (JOI18_bitaro)C++17
14 / 100
910 ms177756 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 = 200;
 
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 ((a <= K || b <= K) && ptr <= K) {
                if (b <= K && ban[best[j][b].se]) {
                    ++b;
                    continue;
                }
 
                if (a <= K && ban[best[i][a].se]) {
                    ++a;
                    continue;
                }
 
                if (a > K) {
                    V[ptr++] = best[j][b++];
                }
                else if (b > K) {
                    V[ptr++] = best[i][a++];
                }
                else {
                    if (best[i][a] > best[j][b]) {
                        V[ptr++] = best[i][a];
                        ban[best[i][a++].se] = 1;
                    }
                    else {
                        V[ptr++] = best[j][b];
                        ban[best[j][b++].se] = 1;
                    }
                }
            }
 
            for (int k = 0; k <= ptr; ++k) {
                best[i][k] = V[k];
                ban[best[i][k].se] = 0;
            }
        }
 
        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);
            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;
}

컴파일 시 표준 에러 (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...