QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#172948#2065. Cyclic DistanceKLPP#TL 1ms13988kbC++202.2kb2023-09-09 21:23:212023-09-09 21:23:21

Judging History

你现在查看的是最新测评结果

  • [2023-09-09 21:23:21]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:13988kb
  • [2023-09-09 21:23:21]
  • 提交

answer

#include<iostream>
#include<vector>
#include<algorithm>
 #include<cassert>
using namespace std;
typedef long long int lld;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
#pragma GCC optimize("-O3","unroll-loops")
#pragma GCC optimize("-Ofast")
vector<vector<pair<int,lld> > >nei;
lld dist[1000000];
bool vis[1000000];
int lab[1000000];
int n,k;
void DFS(int node, lld d=0, int label=-1){
	dist[node]=d;
	lab[node]=label;
	trav(a,nei[node]){
		if(dist[a.first]==-1){
			if(label==-1)DFS(a.first,d+a.second,a.first);
			else DFS(a.first,d+a.second,label);
		}
	}
}
void st(int node){
	rep(i,0,n)dist[i]=-1;
	DFS(node);
}
int sz[1000000];
bool bl[1000000];
void getsz(int node){
	vis[node]=true;
	sz[node]=1;
	trav(a,nei[node]){
		if(!vis[a.first] && !bl[a.first]){
			getsz(a.first);
			sz[node]+=sz[a.first];
		}
	}
}
int getcent(int node, int treesz){
	trav(a,nei[node]){
		if(!bl[a.first] && sz[node]>sz[a.first] && sz[a.first]*2>treesz){
			return getcent(a.first,treesz);
		}
	}
	return node;
}
void res(int node){
	vis[node]=false;
	trav(a,nei[node]){
		if(!vis[a.first] && !bl[a.first]){
			res(a.first);
		}
	}
}
int cnt[1000000];
vector<pair<lld,int> >V;
int exc;
lld test(int node){
	exc=-1;
	st(node);
	V.clear();
	rep(i,0,n)cnt[i]=0;
	rep(i,0,n){
		V.push_back({-dist[i],lab[i]});
	}
	sort(V.begin(),V.end());
	int tot=0;
	lld ans=0;
	trav(a,V){
		if(tot==k)continue;
		lld D=-a.first;
		int v=a.second;
		if(2*(cnt[v]+1)<=k){
			cnt[v]++;
			tot++;
			ans+=2*D;
		}else{
			exc=v;
		}
	}
	return ans;
}
void solve(){
	cin>>n>>k;
	nei.clear();
	nei.resize(n);
	rep(i,0,n)bl[i]=false;
	rep(i,0,n-1){
		int x,y;
		lld c;
		cin>>x>>y>>c;
		x--;y--;
		nei[x].push_back({y,c});
		nei[y].push_back({x,c});
	}
	lld ans=0;
	int ver=0;
	if(n>100)assert(false);
	while(true){
		rep(i,0,n)vis[i]=false;
		getsz(ver);
		int S=sz[ver];
		int cen=getcent(ver,S);
		res(cen);
		ans=max(ans,test(cen));
		if(exc==-1){
			cout<<ans<<"\n";
			return;
		}
		bl[cen]=true;
		ver=exc;
	}
	cout<<ans<<"\n";
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int tt=1;
	cin>>tt;
	while(tt--){
		solve();
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 13988kb

input:

1
5 3
1 2 4
1 3 1
1 4 8
4 5 9

output:

44

result:

ok single line: '44'

Test #2:

score: -100
Time Limit Exceeded

input:

57206
3 2
1 2 574927
2 3 406566
2 2
1 2 308806
4 3
1 2 312588
2 3 500141
2 4 53602
3 3
1 2 797183
2 3 944061
5 3
1 2 624010
2 3 488613
3 4 734514
4 5 497493
5 4
1 2 540278
2 3 488655
2 4 228989
2 5 653896
2 2
1 2 569117
4 2
1 2 821764
2 3 499471
1 4 549060
2 2
1 2 991159
2 2
1 2 482941
5 4
1 2 30462...

output:


result: