记录编号 | 232389 | 评测结果 | AAAAAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [USACO Hol10] 政党 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 2.558 s | ||
提交时间 | 2016-03-01 07:05:13 | 内存使用 | 39.23 MiB | ||
#include<cstdio> #include<vector> #include<cmath> #include<iostream> using namespace std; const int SIZEN=200010; vector<pair<int,int> > s[SIZEN]; vector<int> C[SIZEN]; int dep[SIZEN],dfn[SIZEN*2],dfslist=0,first[SIZEN]; int pos[SIZEN]; int ST[SIZEN*2][20]; int N,M; int K; void add(int fr,int to,int lo) { s[fr].push_back(make_pair(to,lo)); s[to].push_back(make_pair(fr,lo)); } void dfs(int x,int fa) { dfn[++dfslist]=x; first[x]=dfslist; for(int i=0;i<s[x].size();i++) { int v=s[x][i].first,w=s[x][i].second; if(v==fa) continue; dep[v]=dep[x]+w; pos[v]=pos[x]+1; dfs(v,x); dfn[++dfslist]=x; } } void make_ST() { int t=int(log2(dfslist+0.0)); for(int i=1;i<=dfslist;i++) ST[i][0]=dfn[i]; for(int i=1;i<=t;i++) { for(int j=1;j<=dfslist;j++) { if(j+(1<<i)-1>dfslist) break; if(pos[ST[j][i-1]]<pos[ST[j+(1<<(i-1))][i-1]]) ST[j][i]=ST[j][i-1]; else ST[j][i]=ST[j+(1<<(i-1))][i-1]; } } } void prepare() { dep[1]=0;pos[1]=0; dfs(1,0); make_ST(); } int LCA(int x,int y) { int l=first[x],r=first[y]; if(l>r) swap(l,r); int m=int(log2(r-l+1.0)); int a=ST[l][m],b=ST[r-(1<<m)+1][m]; if(pos[a]<pos[b]) return a; return b; } int main() { freopen("cowpol.in","r",stdin); freopen("cowpol.out","w",stdout); scanf("%d%d",&N,&K); int c,p; for(int i=1;i<=N;i++) { scanf("%d%d",&c,&p); C[c].push_back(i); if(p!=0) add(p,i,1); } prepare(); for(int i=1;i<=K;i++) { int st=0,u=C[i][0],best=0; for(int j=1;j<C[i].size();j++) { int v=C[i][j]; int a=LCA(u,v); int tem=dep[u]+dep[v]-2*dep[a]; if(tem>best) { best=tem; st=v; } } for(int j=0;j<C[i].size();j++) { int v=C[i][j]; int a=LCA(st,v); int tem=dep[st]+dep[v]-2*dep[a]; if(tem>best) { best=tem; } } printf("%d\n",best); } return 0; }