社区讨论
展示超长if else
P3258[JLOI2014] 松鼠的新家参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mm24qons
- 此快照首次捕获于
- 2026/02/25 22:28 2 周前
- 此快照最后确认于
- 2026/02/27 11:55 2 周前
CPP
#include <iostream>
#include <vector>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=4e5;
vector<int> g[MAXN];
int d[MAXN],cf[MAXN],n,m,a[MAXN],up[32][MAXN],ans;
void dfs(int u,int fa) {
up[0][u]=fa;
d[u]=d[fa]+1;
for(int k=1;k<31;k++)up[k][u]=up[k-1][up[k-1][u]];
for(int v:g[u]){
if(v!=fa)dfs(v,u);
}
}
int lca(int u,int v){
if(d[u]<d[v])swap(u,v);
int diff=d[u]-d[v];
for(int k=0;k<31;k++){
if(diff&(1<<k))u=up[k][u];
}
if(u==v)return u;
for(int k=31;k>=0;k--){
if(up[k][u]!=up[k][v]){
u=up[k][u];
v=up[k][v];
}
}
return up[0][u];
}
int G(int u,int fa){
for(int i:g[u]){
if(i==fa)continue;
cf[u]+=G(i,u);
//cf[u]+=cf[i];
}
return cf[u];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1,0);
int u;
for(int i=1;i<n;i++){
u=lca(a[i],a[i+1]);
if(u==a[i]){//这里开始
if(i==1){
cf[a[i+1]]++;
cf[up[0][a[i]]]--;
}else if(i==n-1){
cf[up[0][a[i+1]]]++;
cf[a[i]]--;
}else{
cf[a[i+1]]++;
cf[a[i]]--;
}
}else if(u==a[i+1]){
if(i==1){
cf[a[i]]++;
cf[up[0][a[i+1]]]--;
}else if(i==n-1){
cf[up[0][a[i]]]++;
cf[a[i+1]]--;
}else{
cf[up[0][a[i]]]++;
cf[up[0][a[i+1]]]--;
}
}else{
if(i==1){
cf[a[i]]++;
cf[u]--;
cf[a[i+1]]++;
cf[up[0][u]]--;
}else if(i==n-1){
cf[up[0][a[i]]]++;
cf[u]--;
cf[up[0][a[i+1]]]++;
cf[up[0][u]]--;
}else{
cf[up[0][a[i]]]++;
cf[u]--;
cf[a[i+1]]++;
cf[up[0][u]]--;
}
}//这里结束
}
G(1,0);
for(int i=1;i<=n;i++){
cout<<cf[i]<<"\n";
}
}
谁能帮我在保证仍然AC的情况下简化代码
回复
共 1 条回复,欢迎继续交流。
正在加载回复...