关于时间复杂度
  • 板块P4178 Tree
  • 楼主JS_TZ_ZHR
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/3/24 22:39
  • 上次更新2023/11/5 01:39:21
查看原帖
关于时间复杂度
200044
JS_TZ_ZHR楼主2021/3/24 22:39

这么写时间复杂度是什么啊?

#include<bits/stdc++.h>
using namespace std;
int n,m,u,v,w,q[100005],root,Max[100005],sum,siz[100005],dis[100005],cnt,nod[100005];
long long ans,check[20005],vis[100005],res[100005];
queue<int>tag;
struct node{
    int to,dis;
};
vector<node>ve[100005];
node Node(int x,int y){
    node res;
    res.to=x,res.dis=y;
    return res;
}
void dfs1(int now,int fa){
    siz[now]=1;
    Max[now]=0;
    for(int i=0;i<ve[now].size();i++){
        int y=ve[now][i].to;
        if(y==fa||vis[y])continue;
        dfs1(y,now);
        Max[now]=max(Max[now],siz[y]);
        siz[now]+=siz[y];
    }
    Max[now]=max(Max[now],sum-siz[now]);
    if(Max[now]<Max[root])root=now;
}
void dfs3(int now,int fa){
    nod[++cnt]=dis[now];
    for(int i=0;i<ve[now].size();i++){
        int y=ve[now][i].to;
        if(y==fa||vis[y])continue;
        dis[y]=dis[now]+ve[now][i].dis;
        dfs3(y,now);
    }
}
void dfs2(int now,int fa){
    check[0]++;
    tag.push(0);
    vis[now]=1;
    for(int i=0;i<ve[now].size();i++){
        int y=ve[now][i].to;
        if(y==fa||vis[y])continue;
        dis[y]=ve[now][i].dis;
        dfs3(y,now);
        for(int j=1;j<=cnt;j++)
            for(int k=nod[j];k<=m;k++)res[k]+=check[q[k]-nod[j]];
        for(int j=1;j<=cnt;j++)if(nod[j]<=20005)tag.push(nod[j]),check[nod[j]]++;
        cnt=0;
    }
    while(!tag.empty())check[tag.front()]--,tag.pop();
    for(int i=0;i<ve[now].size();i++){
        int y=ve[now][i].to;
        if(y==fa||vis[y])continue;
        sum=siz[y],root=0,Max[0]=2e9;
        dfs1(y,now);
        dfs1(root,0);
        dfs2(root,now);
    }
}
int main(){
    cin>>n;
    for(int i=1;i<n;i++){
        cin>>u>>v>>w;
        ve[u].push_back(Node(v,w));
        ve[v].push_back(Node(u,w));
    }
    cin>>m;
    for(int i=0;i<=m;i++)q[i]=i;
    Max[0]=2e9,sum=n;
    dfs1(1,0);
    dfs1(root,0);
    dfs2(root,0);
    for(int i=0;i<=m;i++)ans+=res[i];
    cout<<ans<<endl;
}
2021/3/24 22:39
加载中...