Submission #944391

#TimeUsernameProblemLanguageResultExecution timeMemory
944391FucKanhRegions (IOI09_regions)C++14
0 / 100
1613 ms38764 KiB
#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; const int maxn = 2e5 + 2; const int maxr = 25002; int cnt[450][maxr], c[maxr], tin[maxn], tout[maxn], t, h[maxn], id[maxn], sz[maxr]; vector<int> a[maxn]; vector<pii> in[maxn]; void dfs(int u, int pa = -1) { tin[u] = ++t; if (!c[h[u]]) c[h[u]] = u; for (int i = 0; i < a[u].size(); i++) { int v = a[u][i]; if (v == pa) continue; dfs(v, u); } // cerr << "out " << u << " " << h[u] << " : " << c[h[u]] << endl; tout[u] = t; in[h[u]].push_back({tin[u], tout[u]}); } void dfsc(int u, int check, int pa = -1) { if (h[u] == check && c[check] == 0) c[check] = u; for (int i = 0; i < a[u].size(); i++) { int v = a[u][i]; if (v == pa) continue; dfsc(v, check, u); } if (c[check] == u) c[check] = 0; if (c[check]) cnt[id[check]][h[u]]++; } signed main() { cin.tie(0) -> sync_with_stdio(0); int n,r,q; cin >> n >> r >> q; cin >> h[1]; for (int i = 2; i <= n; i++) { int x; cin >> x >> h[i]; a[x].push_back(i); sz[h[i]]++; } for (int i = 1; i <= r; i++) { in[i].push_back({0,0}); } dfs(1); // for (int i = 1; i <= r; i++) { // cerr << i << ": " << endl; // for (int j = 1; j < in[i].size(); j++) { // cerr << in[i][j] << " " << out[i][j] << endl; // } // } int dem = 0; for (int i = 1; i <= r; i++) { sort(in[i].begin() + 1, in[i].end()); if (sz[i] >= 500) { id[i] = ++dem; c[i] = 0; dfsc(1, i); // cerr << i << ": " << endl; // for (int j = 1; j <= r; j++) { // cerr << cnt[dem][j] << " "; // } cerr << endl; } } cout << flush; for (int i =0; i < q; i++) { int r1, r2; cin >> r1 >> r2; if (sz[r1] >= 500) { cout << cnt[id[r1]][r2] << endl; } else { int pos = 1; int ans = 0; // cerr << r1 << ": "; // for (int i = 1; i < in[r1].size(); i++) { // cerr << in[r1][i].first << " " << in[r1][i].second << endl; // } // cerr << r2 << ": "; // for (int i = 1; i < in[r2].size(); i++) { // cerr << in[r2][i].first << " " << in[r2][i].second << endl; // } for (int i = 1; i < in[r1].size() && pos < in[r2].size(); i++) { while (pos < in[r2].size() && in[r2][pos].first < in[r1][i].first) pos++; while (pos < in[r2].size() && in[r2][pos].first >= in[r1][i].first && in[r2][pos].second <= in[r1][i].second) ans++, pos++; } cout << ans << endl; } } return 0; }

Compilation message (stderr)

regions.cpp: In function 'void dfs(int, int)':
regions.cpp:17:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for (int i = 0; i < a[u].size(); i++) {
      |                     ~~^~~~~~~~~~~~~
regions.cpp: In function 'void dfsc(int, int, int)':
regions.cpp:29:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     for (int i = 0; i < a[u].size(); i++) {
      |                     ~~^~~~~~~~~~~~~
regions.cpp: In function 'int main()':
regions.cpp:90: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]
   90 |             for (int i = 1; i < in[r1].size() && pos < in[r2].size(); i++) {
      |                             ~~^~~~~~~~~~~~~~~
regions.cpp:90:54: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |             for (int i = 1; i < in[r1].size() && pos < in[r2].size(); i++) {
      |                                                  ~~~~^~~~~~~~~~~~~~~
regions.cpp:91:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |                 while (pos < in[r2].size() && in[r2][pos].first < in[r1][i].first) pos++;
      |                        ~~~~^~~~~~~~~~~~~~~
regions.cpp:92:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |                 while (pos < in[r2].size() && in[r2][pos].first >= in[r1][i].first && in[r2][pos].second <= in[r1][i].second) ans++, pos++;
      |                        ~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...