Submission #859733

#TimeUsernameProblemLanguageResultExecution timeMemory
859733GenghizKhanBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1088 ms271160 KiB
// #pragma GCC optimize("O3") // #pragma GCC optimize("Ofast") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include "complex" using namespace std; using namespace __gnu_pbds; template <class T> using o_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; // order_of_key (val): returns the no. of values less than val // find_by_order (k): returns the kth largest element.(0-based) // #define int long long typedef pair<int, int> II; typedef vector<II> VII; typedef vector<int> VI; typedef vector<VI> VVI; typedef long long LL; #define PB push_back #define MP make_pair #define F first #define S second #define SZ(a) (int)(a.size()) #define ALL(a) a.begin(), a.end() #define SET(a, b) memset(a, b, sizeof(a)) #define FOR(i, a, b) for (int i = (a); i < (b); ++i) #define REP(i, n) FOR(i, 0, n) #define si(n) scanf("%d", &n) #define dout(n) printf("%d\n", n) #define sll(n) scanf("%lld", &n) #define lldout(n) printf("%lld\n", n) #define fast_io \ ios_base::sync_with_stdio(false); \ cin.tie(NULL) #define endl "\n" const long long mod = 1e9 + 7; auto seed = chrono::high_resolution_clock::now().time_since_epoch().count(); std::mt19937 mt(seed); // use mt()%mod void prec() { } void solve() { int n, m, q; cin >> n >> m >> q; vector<int> graph[n], revadj[n]; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; u--, v--; graph[u].PB(v); revadj[v].PB(u); } int bucket_sz = sqrt(n); vector<vector<pair<int, int>>> best(n); vector<bool> picked(n, false); for (int i = 0; i < n; i++) { int v = i; for (auto u : revadj[v]) { if (!best[v].size()) { best[v] = best[u]; } else { vector<pair<int, int>> new_best; int p1 = 0, p2 = 0; while (p1 < best[v].size() && p2 < best[u].size() && new_best.size() < bucket_sz) { if (picked[best[v][p1].first]) { p1++; continue; } if (picked[best[u][p2].first]) { p2++; continue; } if (best[v][p1].second >= best[u][p2].second) { new_best.PB(best[v][p1]); p1++; } else { new_best.PB(best[u][p2]); p2++; } picked[new_best.back().first] = true; } while (p1 < best[v].size() && new_best.size() < bucket_sz) { if (picked[best[v][p1].first]) { p1++; continue; } new_best.PB(best[v][p1]); picked[new_best.back().first] = true; p1++; } while (p2 < best[u].size() && new_best.size() < bucket_sz) { if (picked[best[u][p2].first]) { p2++; continue; } new_best.PB(best[u][p2]); picked[new_best.back().first] = true; p2++; } best[v] = new_best; for (auto z : best[v]) picked[z.first] = false; } } if (best[v].size() < bucket_sz) { best[v].PB({v, -1}); } for (int j = 0; j < best[v].size(); j++) { best[v][j].second++; } // for (int j = 0; j < best[i].size(); j++) { // cout << i << ": " << best[i][j].first << " " << best[i][j].second << endl; // } } vector<int> dist(n); unordered_map<int, bool> mm; while (q--) { int town; cin >> town; town--; int ct; cin >> ct; vector<int> busy(ct); for (int i = 0; i < ct; i++) { cin >> busy[i]; busy[i]--; mm[busy[i]] = true; } if (ct >= bucket_sz) { dist = vector<int>(n, -1); dist[town] = 0; for (int i = n - 1; i >= 0; i--) { int v = i; if (dist[v] == 0) continue; int maxi = -1; for (auto u : graph[v]) { if (dist[u] != -1) maxi = max(maxi, dist[u] + 1); } if (maxi != -1) dist[v] = maxi; } int max_dist = -1; for (int i = 0; i < n; i++) { if (dist[i] == -1 || mm[i]) continue; if (dist[i] > max_dist) max_dist = dist[i]; } cout << max_dist << endl; } else { int max_dist = -1; for (int i = 0; i < best[town].size(); i++) { int v = best[town][i].first; if (mm[v]) continue; max_dist = best[town][i].second; break; } cout << max_dist << endl; } for (int i = 0; i < busy.size(); i++) { mm[busy[i]] = false; } } } signed main() { fast_io; prec(); // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); int totalTests = 1; // cin >> totalTests / ; for (int testNo = 1; testNo <= totalTests; testNo++) { // cout << "Case #" << testNo << ": "; solve(); } return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'void solve()':
bitaro.cpp:67:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |                 while (p1 < best[v].size() && p2 < best[u].size() && new_best.size() < bucket_sz) {
      |                        ~~~^~~~~~~~~~~~~~~~
bitaro.cpp:67:50: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |                 while (p1 < best[v].size() && p2 < best[u].size() && new_best.size() < bucket_sz) {
      |                                               ~~~^~~~~~~~~~~~~~~~
bitaro.cpp:67:86: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   67 |                 while (p1 < best[v].size() && p2 < best[u].size() && new_best.size() < bucket_sz) {
      |                                                                      ~~~~~~~~~~~~~~~~^~~~~~~~~~~
bitaro.cpp:85:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |                 while (p1 < best[v].size() && new_best.size() < bucket_sz) {
      |                        ~~~^~~~~~~~~~~~~~~~
bitaro.cpp:85:63: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   85 |                 while (p1 < best[v].size() && new_best.size() < bucket_sz) {
      |                                               ~~~~~~~~~~~~~~~~^~~~~~~~~~~
bitaro.cpp:94:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   94 |                 while (p2 < best[u].size() && new_best.size() < bucket_sz) {
      |                        ~~~^~~~~~~~~~~~~~~~
bitaro.cpp:94:63: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   94 |                 while (p2 < best[u].size() && new_best.size() < bucket_sz) {
      |                                               ~~~~~~~~~~~~~~~~^~~~~~~~~~~
bitaro.cpp:107:28: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |         if (best[v].size() < bucket_sz) {
      |             ~~~~~~~~~~~~~~~^~~~~~~~~~~
bitaro.cpp:110:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |         for (int j = 0; j < best[v].size(); j++) {
      |                         ~~^~~~~~~~~~~~~~~~
bitaro.cpp:153:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  153 |             for (int i = 0; i < best[town].size(); i++) {
      |                             ~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:161:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  161 |         for (int i = 0; i < busy.size(); i++) {
      |                         ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...