求分析代码时间复杂度
  • 板块学术版
  • 楼主sunkuangzheng
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/16 16:45
  • 上次更新2023/11/2 13:27:05
查看原帖
求分析代码时间复杂度
679936
sunkuangzheng楼主2023/10/16 16:45
/**
 *    author: sunkuangzheng
 *    created: 16.10.2023 15:18:08
**/
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+5;
int t,n,u,v,T,dep[N],rt,sb,mk[N],dp[N];vector<int> g[N];
inline void dfs(int u,int fa,int &rt){
    if(u) dep[u] = dep[fa] + 1;if(dep[u] > dep[rt] && mk[u]) rt = u;
    for(int v : g[u]) if(v != fa) dfs(v,u,rt);
}inline bool ck(int ans,int le){
    int fg = 0;
    for(int i = 1;i <= n;i ++) mk[i] = (dp[i] > ans),fg |= mk[i];
    if(!fg) return 1;
    rt = 0,dfs(1,0,rt),sb = 0,dfs(rt,0,sb);
    return ((dep[sb] + 1) / 2 + le <= ans);
}int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> T;
    while(T --){
        cin >> n,dep[0] = -1;
        for(int i = 1;i <= n;i ++) g[i].clear();
        for(int i = 1;i < n;i ++) cin >> u >> v,g[u].push_back(v),g[v].push_back(u);
        dfs(1,0,rt);
        for(int i = 1;i <= n;i ++) dp[i] = dep[i];
        for(int i = 1;i <= n;i ++){
            int l = 1,r = n;
            while(l <= r){
                int mid = (l + r) / 2;
                if(ck(mid,i)) r = mid - 1; else l = mid + 1;
            }cout << r + 1 << " ";
        }cout << "\n";
    }
}

感觉 ck 函数会被调用 O(nlog⁡n)\mathcal O(n \log n) 次,ck 函数的时间复杂度是 O(n)\mathcal O(n),所以应该是 O(n2log⁡n)\mathcal O(n^2 \log n) 的。

但是不知道为什么 n=3000n = 3000 时就 T 飞了 /kk

2023/10/16 16:45
加载中...