제출 #679667

#제출 시각아이디문제언어결과실행 시간메모리
679667keta_tsimakuridzeMergers (JOI19_mergers)C++14
0 / 100
159 ms34752 KiB
#include<bits/stdc++.h> #define f first #define s second #define int long long #define pii pair<int,int> using namespace std; const int N = 2e5 + 5, mod = 1e9 + 7; // ! int t, p[N], P[N][20], X[N], in[N], out[N]; int ans = 0, timer = 0; vector<int> V[N], x[N]; bool cmp(int u, int v) { return (in[u] < in[v]); } int find(int x) { return (p[x] == x ? x : p[x] = find(p[x])); } void dfs0(int u) { in[u] = ++timer; for(int i = 1; i <= 18; i++) P[u][i] = P[P[u][i - 1]][i - 1]; for(int i = 0; i < V[u].size(); i++) { if(V[u][i] == P[u][0]) continue; P[V[u][i]][0] = u; dfs0(V[u][i]); } out[u] = timer; } bool check(int u, int v) { return (in[u] <= in[v] && out[v] <= out[u]); } int lca(int u, int v) { if(check(u, v)) return u; if(check(v, u)) return v; for(int i = 18; i >= 0; i--) { if(P[u][i] && !check(P[u][i], v)) u = P[u][i]; } return P[u][0]; } void up(int u, int v, int lca) { int cur = u; while(true) { cur = find(cur); if(cur == 1 || find(cur) == find(lca)) break; p[cur] = find(P[cur][0]); cur = p[cur]; } } void dfs(int u) { for(int i = 0; i < V[u].size(); i++) { dfs(V[u][i]); X[u] += X[V[u][i]]; } ans += ((int)V[u].size() == 1); } main(){ int n, m; cin >> n >> m; for(int i =1; i <= n; i++) p[i] = i; for(int i = 2; i <= n; i++) { int u, v; cin >> u >> v; V[u].push_back(v); V[v].push_back(u); } dfs0(1); for(int i = 1; i <= n; i++) { int a; cin >> a; x[a].push_back(i); } for(int i = 1; i <= m; i++) { sort(x[i].begin(), x[i].end(), cmp); for(int j = 1; j < x[i].size(); j++) { int u = x[i][j - 1], v = x[i][j]; int l = lca(u, v); up(u, v, l); up(v, u, l); } } for(int i = 1; i <= n; i++) V[i].clear(); for(int i = 2; i <= n; i++) if(find(i) != find(P[i][0])) V[find(P[i][0])].push_back(find(i)); dfs(1); cout << (ans + 1) /2; }

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

mergers.cpp: In function 'void dfs0(long long int)':
mergers.cpp:21:22: 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]
   21 |     for(int i = 0; i < V[u].size(); i++) {
      |                    ~~^~~~~~~~~~~~~
mergers.cpp: In function 'void dfs(long long int)':
mergers.cpp:51:22: 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]
   51 |     for(int i = 0; i < V[u].size(); i++) {
      |                    ~~^~~~~~~~~~~~~
mergers.cpp: At global scope:
mergers.cpp:57:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   57 | main(){
      | ^~~~
mergers.cpp: In function 'int main()':
mergers.cpp:76:26: 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]
   76 |         for(int j = 1; j < x[i].size(); j++) {
      |                        ~~^~~~~~~~~~~~~
#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...