下列代码时间复杂度应该是 O(n2) ,数据范围中说 n≤300 ,理论上应该刚好卡过,但实际运行后,最慢的点 29ms ,平均 [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 ;
}