社区讨论
90分,走投无路了,请求帮助
P3258[JLOI2014] 松鼠的新家参与者 3已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi6v70o8
- 此快照首次捕获于
- 2025/11/20 11:21 4 个月前
- 此快照最后确认于
- 2025/11/20 11:21 4 个月前
90分,走投无路了,请求帮助
CPP#include<bits/stdc++.h>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define NM 600005
using namespace std;
queue<int> q;
int ver[NM],head[NM],nex[NM],tot,d[NM],n,m,Q,t,a[NM],f[NM][20],cnt[NM];
void add(int x,int y){
ver[++tot]=y; nex[tot]=head[x]; head[x]=tot;
}
void bfs(int x){
q.push(x); d[x]=1;
while(q.size()){
int x=q.front(); q.pop();
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(d[y]) continue;
d[y]=d[x]+1;
f[y][0]=x;
FOR(j,1,t){
f[y][j]=f[f[y][j-1]][j-1];
}
q.push(y);
}
}
}
int lca(int x,int y){
if(d[x]>d[y]) swap(x,y);
DOR(i,t,0) if(d[f[y][i]]>=d[x]) y=f[y][i];
if(x==y) return x;
DOR(i,t,0) if(f[y][i]!=f[x][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}
void dfs(int x){
for(int i=head[x];i;i=nex[i]){
int y=ver[i];
if(y!=f[x][0]){
dfs(y);
cnt[x]+=cnt[y];
}
}
}
int main(){
// freopen("data.out","r",stdin);
// freopen("std.out","w",stdout);
scanf("%d",&n);
tot=0; t=(int)log(n)/log(2);
FOR(i,1,n){
scanf("%d",&a[i]);
}
FOR(i,1,n-1){
int a,b;
scanf("%d%d",&a,&b);
add(a,b); add(b,a);
}
bfs(a[1]);
FOR(i,1,n-1){
int tmp=lca(a[i],a[i+1]);
cnt[a[i]]++; cnt[a[i+1]]++;
cnt[tmp]--; cnt[f[tmp][0]]--;
}
// FOR(i,1,n) printf("%d ",cnt[i]); return 0;
dfs(a[1]);
FOR(i,2,n) cnt[a[i]]--;
FOR(i,1,n) printf("%d\n",cnt[i]);
// fclose(stdin); fclose(stdout);
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...