제출 #1095836

#제출 시각아이디문제언어결과실행 시간메모리
1095836mohammad86Bitaro’s Party (JOI18_bitaro)C++17
14 / 100
1620 ms419404 KiB
// https://oj.uz/problem/view/JOI18_bitaro

#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> pii;
const int maxn = 1e5 + 100;
const int sqrtn = 320;
int n, m, q;
vector<int> adj[maxn];
vector<int> readj[maxn];
vector<pii> fv[maxn];
bool mark[maxn];

int main () {
    ios_base::sync_with_stdio(false);

    cin >> n >> m >> q;

    for (int i = 1; i <= m; i++) {
        int s, e;
        cin >> s >> e;
        adj[s].push_back(e);
        readj[e].push_back(s);
    }

    for (int i = 1; i <= n; i++) {
        vector<pii> tmp;
        tmp.push_back({0, i});
        for (int k = 0 ; k <= sqrtn; k++) {
            for (int j : readj[i]) {
                if (fv[j].size() > k) {
                    tmp.push_back({fv[j][k].first+1, fv[j][k].second});
                }
            }
            if (tmp.size() > sqrtn) {
                break;
            }
        }
        sort(tmp.begin(), tmp.end(), greater<pii>());
        for (int j = 0; j < min(int(tmp.size()), sqrtn); j++) {
            fv[i].push_back({tmp[j].first, tmp[j].second});
        }
    }

    for (int i = 1; i <= q; i++) {
        int t, y;
        cin >> t >> y;
        if (y < sqrtn) {
            vector<int> tmp;
            for (int i = 1; i <= y; i++) {
                int c;
                cin >> c;
                tmp.push_back(c);
            }
            bool is_find = false;
            for (pii i : fv[t]) {
                if (!binary_search(tmp.begin(), tmp.end(), i.second)) {
                    cout << i.first << endl;
                    is_find = true;
                    break;
                }
            }
            if (!is_find) {
                cout << -1 << endl;
            }
        } else {
            for (int i = 1; i <= n; i++) {
                mark[i] = false;
            }
            for (int i = 1; i <= y; i++) {
                int c;
                cin >> c;
                mark[c] = true;
            }

            vector<int> dis(t+2, -1);

            int maximum = -1;

            dis[t] = 0;

            if (!mark[t]) {
                maximum = 0;
            }

            for (int i = t-1; i >= 1; i--) {
                for (int j : adj[i]) {
                    if (j > t || dis[j] == -1) {
                        continue;
                    }

                    dis[i] = max(dis[i], dis[j] +1);
                }
                if (!mark[i])
                    maximum = max(maximum, dis[i]);
            }

            cout << maximum << endl;
        }
    }
}

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

bitaro.cpp: In function 'int main()':
bitaro.cpp:32:34: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   32 |                 if (fv[j].size() > k) {
      |                     ~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...