제출 #347128

#제출 시각아이디문제언어결과실행 시간메모리
347128wwddMergers (JOI19_mergers)C++14
100 / 100
1993 ms212440 KiB
#include <bits/stdc++.h> using namespace std; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int,int> ii; //lmao read limits const int MN = 500200; const int LOG = 19; class U { private: vi rk,p,lev,ro; public: U(const vi& w) { lev = w; rk.assign(w.size(),0); for(int i=0;i<w.size();i++) { p.push_back(i); ro.push_back(i); } } int find(int a) { if(a == p[a]) {return a;} return p[a] = find(p[a]); } bool same(int a, int b) { return find(a) == find(b); } bool un(int a, int b) { if(same(a,b)) {return false;} a = find(a);b = find(b); if(rk[a] < rk[b]) {swap(a,b);} if(rk[a] == rk[b]) {rk[a]++;} if(lev[a] > lev[b]) { ro[a] = ro[b]; } lev[a] = min(lev[a],lev[b]); p[b] = a; return true; } int rep(int u) { return ro[find(u)]; } }; vi lev; vvi g; int pa[MN][LOG]; int en[MN],ex[MN]; int dord; void dfa(int u, int p, int lu, vi& le) { pa[u][0] = p; lev[u] = lu; en[u] = dord;dord++; for(int i=0;i<g[u].size();i++) { int v = g[u][i]; if(v == p) {continue;} dfa(v,u,lu+1,le); } ex[u] = dord;dord++; } void proc() { for(int j=1;j<LOG;j++) { for(int i=0;i<g.size();i++) { pa[i][j] = pa[pa[i][j-1]][j-1]; } } } bool anc(int a, int b) { return en[a] <= en[b] && ex[a] >= ex[b]; } int lca(int a, int b) { if(anc(a,b)) {return a;} if(anc(b,a)) {return b;} for(int i=LOG-1;i>=0;i--) { if(!anc(pa[a][i],b)) { a = pa[a][i]; } } return pa[a][0]; } int main() { int n,k; cin >> n >> k; g.assign(n,vi()); lev.assign(n,0); dord = 0; vector<ii> eg; for(int i=1;i<n;i++) { int a,b; cin >> a >> b; a--;b--; g[a].push_back(b); g[b].push_back(a); eg.emplace_back(a,b); } dfa(0,0,0,lev); U bs(lev); proc(); vvi bob(k,vi()); for(int i=0;i<n;i++) { int co; cin >> co; co--; bob[co].push_back(i); } vi rob(n,0); for(int i=0;i<k;i++) { int sz = bob[i].size(); for(int j=0;j<bob[i].size();j++) { int u = bob[i][j]; int v = bob[i][(j+1)%sz]; int lu = lca(u,v); rob[u] = max(rob[u],lev[u]-lev[lu]); rob[v] = max(rob[v],lev[v]-lev[lu]); } } for(int i=0;i<n;i++) { int gol = lev[i]-rob[i]; int u = bs.rep(i); while(lev[u] > gol) { bs.un(u,pa[u][0]); u = bs.rep(u); } } vector<set<int>> ha(n); for(int i=0;i<eg.size();i++) { int a = bs.find(eg[i].first); int b = bs.find(eg[i].second); if(a != b) { ha[a].insert(b); ha[b].insert(a); } } int luf = 0; for(int i=0;i<n;i++) { if(ha[i].size() == 1) {luf++;} } int res = (luf+1)/2; cout << res << '\n'; }

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

mergers.cpp: In constructor 'U::U(const vi&)':
mergers.cpp:16:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   16 |    for(int i=0;i<w.size();i++) {
      |                ~^~~~~~~~~
mergers.cpp: In function 'void dfa(int, int, int, vi&)':
mergers.cpp:53:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |  for(int i=0;i<g[u].size();i++) {
      |              ~^~~~~~~~~~~~
mergers.cpp: In function 'void proc()':
mergers.cpp:62:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |   for(int i=0;i<g.size();i++) {
      |               ~^~~~~~~~~
mergers.cpp: In function 'int main()':
mergers.cpp:108:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |   for(int j=0;j<bob[i].size();j++) {
      |               ~^~~~~~~~~~~~~~
mergers.cpp:125:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |  for(int i=0;i<eg.size();i++) {
      |              ~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...