社区讨论

展示超长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 条回复,欢迎继续交流。

正在加载回复...