求分析时间复杂度
查看原帖
求分析时间复杂度
947202
wangruize88楼主2025/7/24 14:31

下列代码时间复杂度应该是 O(n2)O(n^2) ,数据范围中说 n300n \leq 300 ,理论上应该刚好卡过,但实际运行后,最慢的点 29ms29ms ,平均 [3,4]ms[3,4]ms,为啥这么快?
C++14,开了O2

#include <bits/stdc++.h>
using namespace std ;
typedef long long ll ;
vector <pair<long long,long long> > tree[310] ;
long long n , s ;
pair<long long, long long> DIA() {
    long long l, r;
    long long maxn = -1;
    stack<pair<long long, long long>> s;
    bitset<310> vis;
    s.push(make_pair(1, 0));
    while (s.size()) {
        auto x = s.top();
        s.pop();
        if (maxn < x.second) {
            l = x.first;
            maxn = x.second;
        }
        for (auto i : tree[x.first]) {
            if (!vis[i.first]) {
                s.push(make_pair(i.first, x.second + i.second));
                vis[i.first] = 1;
            }
        }
    }
    maxn = -1;
    for (long long i = 0; i < 309; i++) vis[i] = 0;
    s.push(make_pair(l, 0));
    while (s.size()) {
        auto x = s.top();
        s.pop();
        if (maxn < x.second) {
            r = x.first;
            maxn = x.second;
        }
        for (auto i : tree[x.first]) {
            if (!vis[i.first]) {
                s.push(make_pair(i.first, x.second + i.second));
                vis[i.first] = 1;
            }
        }
    }
    return make_pair(l, r);
}
long long fa[310] , fas[310] ;
void dfs ( long long x ) {
	for ( auto i : tree[x] ) {
		if ( fa[x] != i.first ) {
			fa[i.first] = x , fas[i.first] = i.second ;
			dfs(i.first) ;
		}
	}
}
vector <long long> dia , len ;
void get_dia ( long long x ) {
	while ( fa[x] != 0 ) {
		dia.push_back(x) , len.push_back(fas[x]) ;
		x = fa[x] ;
	}
	dia.push_back(x) ;
}
bool mark[310] ;
long long get_len ( long long x ) {
	queue <pair<long long,long long> > q ;
	bitset <310> vis ;
	long long ans = 1e18 ;
	for ( auto i : tree[x] ) q.push(i) , vis[i.first] = 1 ;
	while ( q.size() ) {
		long long node = q.front().first , val = q.front().second ;
		q.pop() ;
		if ( mark[node] ) {
			ans = min ( ans , val ) ;
		} else {
			for ( auto i : tree[node] ) {
				if ( !vis[i.first] ) {
					q.push(make_pair(i.first,val+i.second)) ;
				}
			}
		}
	}
	return ans ;
}
long long now () {
	long long res = 0 ;
	for ( int i = 1 ; i <= n ; i ++ ) {
		if ( !mark[i] ) {
			res = max(res,get_len(i)) ;
		}
	}
	return res ;
}
int main () {
	ios::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ;
	cin >> n >> s ;
	for ( long long i = 1 , u , v , w ; i < n ; i ++ ) {
		cin >> u >> v >> w ;
		tree[u].push_back(make_pair(v,w)) ;
		tree[v].push_back(make_pair(u,w)) ;
	}
	pair<long long,long long> p ;
	p = DIA() ;
	long long l = p.first , r = p.second ;
	dfs(l) , get_dia(r) ;
	mark[dia[0]] = 1 ;
	long long ans = 1e18 , i = 0 ;
	for ( long long j = 0 , tot = 0 ; j < dia.size() ; j++ , mark[j] = 1 ) {
		if ( j > 0 ) {
			tot += len[j-1] ;
		}
		while ( tot > s ) {
			tot -= len[i] , mark[i] = 0 , i ++ ;
		}
		ans = min(ans,now()) ;
	}
	cout << ans ;
	return 0 ;
}
2025/7/24 14:31
加载中...