记录编号 |
499228 |
评测结果 |
AAAAAAAAAAAAA |
题目名称 |
[USACO Hol10] 政党 |
最终得分 |
100 |
用户昵称 |
@@@ |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.221 s |
提交时间 |
2018-07-01 17:40:35 |
内存使用 |
96.07 MiB |
显示代码纯文本
- #include<iostream>
- #include "cstdio"
- #include <vector>
- #include <cmath>
- #include <queue>
- using namespace std;
- int n,k,N;
- int deep[200001];
- int mapa = 0;
- std::vector<int> e[200001],party[100001];
- int grand[200001][60],gw[200001][60];
- //void dfs(int r)
- //{
- // for (int i = 1; i <= N; ++i)
- // grand[r][i] = grand[grand[r][i-1]][i-1];
- // for (int i = 0; i < e[r].size(); ++i)
- // if(e[r][i] != grand[r][0])
- // {
- // deep[e[r][i]] = deep[r]+1;
- // dfs(e[r][i]);
- // }
- //}
- queue<int> q;
- void bfs(int r)
- {
- q.push(r);
- while(!q.empty())
- {
- int h = q.front();
- q.pop();
- for (int i = 1; (1<<i) <= deep[h]; ++i)
- grand[h][i] = grand[grand[h][i-1]][i-1];
- for (int i = 0; i < e[h].size(); ++i)
- {
- if(e[h][i] != grand[h][0])
- {
- deep[e[h][i]] = deep[h]+1;
- q.push(e[h][i]);
- }
- }
- }
- }
- int lca(int x,int y)
- {
- int ans = 0;
- if(deep[x] > deep[y])
- swap(x,y);
- for (int i = N; i >= 0; --i)
- if (deep[x]<deep[y]&&grand[y][i]&&deep[grand[y][i]] >= deep[x])
- {
- y = grand[y][i];
- ans+=(1<<i);
- }
- if(x == y)
- return ans;
- for (int i = N; i >= 0; --i)
- if (grand[x][i]!=grand[y][i])
- {
- ans+= 2*(1<<i);
- x = grand[x][i];y = grand[y][i];
- }
- if (x != y)
- ans+=2;
- return ans;
- }
- int main()
- {
-
- int start;
- freopen("cowpol.in","r",stdin);
- freopen("cowpol.out","w",stdout);
- cin >> n >> k;
- N = floor(log(n + 0.0) / log(2.0));
- for (int i = 1; i <= n; ++i)
- {
- int t;
- cin >> t >> grand[i][0];
- if (grand[i][0] == 0)
- start = i;
- party[t].push_back(i);
- e[i].push_back(grand[i][0]);
- e[grand[i][0]].push_back(i);
- }
- int nkanscanc;
- bfs(start);
- for (int i = 1; i <= k; ++i)
- {
- int deeep = 0,jb,ans = 0;
- for (int j = 0; j < party[i].size(); ++j)
- if(deeep<deep[party[i][j]])
- {
- deeep = deep[party[i][j]];
- jb = party[i][j];
- }
- for (int j = 0; j < party[i].size(); ++j)
- ans = max(ans,lca(jb,party[i][j]));
- cout << ans << endl;
- }
- return 0;
- }