计蒜客 青云的机房组网方案

本文介绍了一种算法,用于解决含特定数量结点的树中,点权互质的点之间的距离之和的问题。该算法通过深度优先搜索、虚树构建等技术实现,并考虑了边权和点权的影响。

n(10w)个结点的树。边权为1,点权ai[1,10w]。求点权互质的点之间的距离之和。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define rep(x,st,en) for(int x=st;x<=en;x++)
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int M=100005;
const int Num=100000;
typedef long long ll;
int nxt[M][18],bin[20];
int dep[M];
struct Edge{
    int to,nxt;
}edge[M<<2];
//虚树中的边可以利用深度O(1)获得 
int last[M];
int head[M];
int prv,allc;
int mul[M];
int id[M],n;
ll ans,val;
void ins(int u,int v){
    edge[++allc]=(Edge){v,last[u]};
    last[u]=allc;
}
void ins_(int u,int v){
    edge[++allc]=(Edge){v,head[u]};
    head[u]=allc;
}
bool cmp(int x,int y){
    return id[x]<id[y];
}
int a[M+5];
int tot,top,dfs_clock;
int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    int d=dep[u]-dep[v];
    for(int i=0;i<18;i++)
        if(bin[i]&d)
            u=nxt[u][i];
    if(u==v)return u;
    for(int i=17;i>=0;i--)
        if(nxt[u][i]!=nxt[v][i]){
            u=nxt[u][i];
            v=nxt[v][i];
        }
    return nxt[u][0];
}
int stk[M];
int sz[M];
void dfs1(int x,int f){
    for(int i=last[x];i;i=edge[i].nxt){
        int y=edge[i].to;
        if(y!=f){
            dfs1(y,x);
            sz[x]+=sz[y];
        }
    }
    if(f)val+=1ll*abs(dep[x]-dep[f])*sz[x]*(tot-sz[x]);
}
void clear(int x,int f){
    for(int i=last[x];i;i=edge[i].nxt){
        int y=edge[i].to;
        if(y!=f)clear(y,x);
    }
    last[x]=sz[x]=0;
}
void solve(int K){
    tot=top=0;
    for(int i=K;i<=Num;i+=K)
        for(int j=head[i];j;j=edge[j].nxt)
            a[tot++]=edge[j].to;
    if(tot<=1)return;
    val=0;
    allc=prv;
    sort(a,a+tot,cmp);
    for(int i=0;i<tot;i++)sz[a[i]]=1;
    for(int i=0;i<tot;i++){
        int f=0,s=a[i];
        while(top>0){
            f=lca(stk[top],s);
            if(top>1&&dep[f]<dep[stk[top-1]]){
                ins(stk[top],stk[top-1]);
                ins(stk[top-1],stk[top]);
                top--;
            }
            else if(dep[f]<dep[stk[top]]){
                ins(stk[top],f);
                ins(f,stk[top]);
                top--;
                break;
            }
            else break;
        }
        if(stk[top]!=f)stk[++top]=f;
        stk[++top]=s;
    }
    while(top>1){
        ins(stk[top],stk[top-1]);
        ins(stk[top-1],stk[top]);
        top--;
    }
    dfs1(a[0],0);
    ans+=val*mul[K];
    clear(a[0],0);
//  printf("%I64d\n",val);
}
void dfs(int x,int f){
    id[x]=++dfs_clock;
    nxt[x][0]=f;
    dep[x]=dep[f]+1;
    for(int i=0;nxt[x][i];i++)
        nxt[x][i+1]=nxt[nxt[x][i]][i];
    for(int i=last[x];i;i=edge[i].nxt){
        int y=edge[i].to;
        if(y!=f)dfs(y,x);
    }
}
char mark[M];
int prm[M];
void pre(){
    int cnt=0;
    mul[1]=1;
    for(int i=2;i<=Num;i++){
        if(!mark[i]){
            prm[cnt++]=i;
            mul[i]=-1;
        }
        for(int j=0;j<cnt&&i*prm[j]<=Num;j++){
            mark[i*prm[j]]=true;
            if(i%prm[j]==0){
                mul[i*prm[j]]=0;
                break;
            }
            else mul[i*prm[j]]=-mul[i];
        }
    }
}
int main(){
    scanf("%d",&n);
    pre();
    for(int i=0;i<20;i++)bin[i]=1<<i;

    for(int v,i=1;i<=n;i++){
        scanf("%d",&v);
        ins_(v,i);
    }
    prv=allc;
    for(int u,v,i=1;i<n;i++){
        scanf("%d%d",&u,&v);
        ins(u,v);ins(v,u);
    }
    //这里的边得到dfs序和深度以后就用不到了 

    dfs_clock=0;
    dfs(1,0);

    ans=0;
    for(int i=1;i<=n;i++)
        last[i]=0;
    for(int i=1;i<=Num;i++)
        if(mul[i])solve(i);
    cout<<ans<<endl;
    return 0;
}
MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值