社区讨论

这个代码的复杂度为什么会TLE

CF1900C Anji's Binary Tree参与者 4已保存回复 7

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@lqchkfnj
此快照首次捕获于
2023/12/19 23:14
2 年前
此快照最后确认于
2023/12/20 14:15
2 年前
查看原帖
遍历每个叶子结点,顺着路径遍历到根节点,最坏情况下即叶子结点最多为 n/2n/2,层数为 lognlogn,那么时间复杂度为 O(n/2logn)O(n/2*logn),但为什么提交会超时?
CPP
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
typedef pair<int,int> PII;

void sol(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    vector<PII> G;
    vector<int> fG;
    int h[n+10] = {0};
    G.resize(n+10);
    fG.resize(n+10);
    vector<int> ye;
    for(int i = 1;i<=n;i++){
        int l,r;
        scanf("%d %d",&l,&r);
        G[i].first = l;
        G[i].second = r;
        fG[l] = i;
        fG[r] = i;
        if(!l && !r) ye.push_back(i);
    }
    
    // cout << "ye = " << ye.size() << endl;
    int ans = 0x3f3f3f3f;
    int res = 0;
    for(auto u : ye){ 
        int cnt = 0;
        int v = u;
        while(v != 1){
            res++;
            if(G[fG[v]].first == v){
                //左儿子
                if(s[fG[v]-1] != 'L') cnt++;
            }else{
                if(s[fG[v]-1] != 'R') cnt++;
            }
            v = fG[v];
            if(v == 0) break;
        }
        ans = min(cnt,ans);
    }
    cout << res << endl;
    cout << ans << endl;

}

int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        sol();
    }
    
    system("pause");
    return 0;
}

回复

7 条回复,欢迎继续交流。

正在加载回复...