这样
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e4+10;
multiset<int> g[MAXN];
vector<pair<int,int> > gg[MAXN];
int n,m,ret;
void dfs(int u,int p,int fr,int minn){
for(pair<int,int> e:gg[u]){
int v=e.second;
if(v==p)continue;
dfs(v,u,e.first,minn);
}
for(auto it=g[u].lower_bound(minn);it!=g[u].end();it++,ret++)g[u].erase(it);
for(auto it=g[u].begin();it!=g[u].end();){
auto pos=g[u].lower_bound(minn-(*it));
if(pos==it)pos++;
if(pos!=g[u].end()){
g[u].erase(pos);
auto is=it;
it++;
g[u].erase(is);
ret++;
}
else it++;
}
if(!g[u].empty()){
auto lst=g[u].end();
lst--;
fr+=*lst;
}
g[p].insert(fr);
}
int main(){
scanf("%d%d", &n, &m);
int sum=0;
for(int i=1;i<n;i++){
int u,v,val;
scanf("%d%d%d", &u, &v, &val);
gg[u].push_back(make_pair(val,v));
gg[v].push_back(make_pair(val,u));
sum+=val;
}
int l=1,r=sum,mid;
while(l<r){
mid=(l+r+1)/2;
for(int i=0;i<=n;i++)g[i].clear();
ret=0;
dfs(1,0,0,mid);
if(ret>=m)l=mid;
else r=mid-1;
}
printf("%d", l);
return 0;
}
就15pts,RE了
但将13行,26~32行改为
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 5e4+10;
multiset<int> g[MAXN];
vector<pair<int,int> > gg[MAXN];
int n,m,ret;
void dfs(int u,int p,int fr,int minn){
for(pair<int,int> e:gg[u]){
int v=e.second;
if(v==p)continue;
dfs(v,u,e.first,minn);
}
//for(auto it=g[u].lower_bound(minn);it!=g[u].end();it++,ret++)if(it!=g[u].end())g[u].erase(it);
for(auto it=g[u].begin();it!=g[u].end();){
auto pos=g[u].lower_bound(minn-(*it));
if(pos==it)pos++;
if(pos!=g[u].end()){
g[u].erase(pos);
auto is=it;
it++;
g[u].erase(is);
ret++;
}
else it++;
}
if(!g[u].empty()){
auto lst=g[u].end();
lst--;
fr+=*lst;
}
if(fr>=minn)ret++;
else g[p].insert(fr);
}
int main(){
scanf("%d%d", &n, &m);
int sum=0;
for(int i=1;i<n;i++){
int u,v,val;
scanf("%d%d%d", &u, &v, &val);
gg[u].push_back(make_pair(val,v));
gg[v].push_back(make_pair(val,u));
sum+=val;
}
int l=1,r=sum,mid;
while(l<r){
mid=(l+r+1)/2;
for(int i=0;i<=n;i++)g[i].clear();
ret=0;
dfs(1,0,0,mid);
if(ret>=m)l=mid;
else r=mid-1;
}
printf("%d", l);
return 0;
}
就过了
?