제출 #657017

#제출 시각아이디문제언어결과실행 시간메모리
657017rafatoaRegions (IOI09_regions)C++17
30 / 100
6863 ms131072 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; typedef long double ld; #pragma GCC optimize ("Ofast") #define double ld #define F first #define S second #define vi vector<int> #define vvi vector<vi> #define pi pair<int, int> #define vpi vector<pi> #define vb vector<bool> #define vvb vector<vb> #define pb push_back #define ppb pop_back #define read(a) for(auto &x:a) cin >> x; #define print(a) for(auto x:a) cout << x << " "; cout << "\n"; #define rs resize #define as assign #define vc vector<char> #define vvc vector<vc> #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() #define MP make_pair #define int long long const int inf = 2e9; const int INF = 4e18; void solve(){ int n, r, q; cin >> n >> r >> q; vvi adj(n+1), R(r+1); vi h(n+1); cin >> h[1]; R[h[1]].pb(1); for(int i=2; i<=n; i++){ int p; cin >> p; adj[p].pb(i); cin >> h[i]; R[h[i]].pb(i); } vi in(n+1), sub(n+1); int time = 0; function<void(int)> dfs = [&](int s){ in[s] = time++; sub[s] = 1; for(auto u:adj[s]){ dfs(u); sub[s] += sub[u]; } }; dfs(1); for(int i=1; i<=r; i++) sort(all(R[i]), [&](int a, int b){ return in[a] < in[b]; }); int sq = 0; map<int, int> mp; map<pi, int> ans, ans2; function<void(int)> dfs2 = [&](int s){ if(R[h[s]].size() > sq) for(auto &[el, ti]:mp) if(el != h[s]) ans[{el, h[s]}] += ti; mp[h[s]]++; for(auto u:adj[s]) dfs2(u); mp[h[s]]--; if(mp[h[s]] == 0) mp.erase(h[s]); }; dfs2(1); for(int i=1; i<=r; i++){ if(R[i].size() <= sq) continue; function<void(int, int)> dfs3 = [&](int s, int cnt){ if(h[s] == i) cnt++; else if(cnt > 0) ans2[{i, h[s]}] += cnt; for(auto u:adj[s]) dfs3(u, cnt); }; dfs3(1, 0); } while(q--){ int r1, r2; cin >> r1 >> r2; if(r2 > sq) cout << ans[{r1, r2}] << endl; else if(r1 > sq) cout << ans2[{r1, r2}] << endl; else { int sum = 0; for(int i=0; i<R[r1].size(); i++) for(int j=0; j<R[r2].size(); j++) if(in[R[r1][i]] <= in[R[r2][j]] && in[R[r2][j]] < in[R[r1][i]]+sub[R[r1][i]]) sum++; cout << sum << endl; } } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); solve(); return 0; }

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

regions.cpp: In lambda function:
regions.cpp:68:21: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   68 |   if(R[h[s]].size() > sq)
      |      ~~~~~~~~~~~~~~~^~~~
regions.cpp: In function 'void solve()':
regions.cpp:82:18: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   82 |   if(R[i].size() <= sq) continue;
      |      ~~~~~~~~~~~~^~~~~
regions.cpp:99:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |    for(int i=0; i<R[r1].size(); i++)
      |                 ~^~~~~~~~~~~~~
regions.cpp:100:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |    for(int j=0; j<R[r2].size(); j++)
      |                 ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...