QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#173028#2065. Cyclic DistanceKLPP#WA 37ms11764kbC++202.5kb2023-09-09 21:41:172023-09-09 21:41:17

Judging History

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

  • [2023-09-09 21:41:17]
  • 评测
  • 测评结果:WA
  • 用时:37ms
  • 内存:11764kb
  • [2023-09-09 21:41:17]
  • 提交

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 tt[1000000];
int exc;
lld test(int node){
	exc=-1;
	st(node);
	V.clear();
	rep(i,0,n)cnt[i]=0,tt[i]=0;
	rep(i,0,n){
		V.push_back({-dist[i],lab[i]});
		if(lab[i]>0)tt[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 && n-1-tt[v]>=cnt[v]+1){
			cnt[v]++;
			tot++;
			ans+=2*D;
			//cout<<D<<" "<<v<<" "<<tt[v]<<" "<<cnt[v]<<" "<<k<<endl;
		}else{
			exc=v;
		}
	}//cout<<endl;
	return ans;
}
void solve(){
	cin>>n>>k;
	if(k==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;
	rep(i,0,n)ans=max(ans,test(i));
	//if(ans!=44 && k>4)assert(false);
	cout<<ans<<"\n";
	//~ int ver=0;
	//~ while(true){
		//~ if(bl[ver])break;
		//~ 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();
	}
}

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 11764kb

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
Wrong Answer
time: 37ms
memory: 11660kb

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:

1962986
0
1732662
3482488
4689260
3823636
0
3740590
0
0
4780220
5026562
0
1885106
0
3050630
0
3102076
2380932
3076270
4288682
7258020
879020
2500212
3613854
0
0
2273662
2331560
1681964
8917452
2373066
3163042
3104226
3642898
2579674
5058442
3669186
626772
2283820
0
2100966
2385474
6693120
1347566
0
...

result:

wrong answer 2nd lines differ - expected: '617612', found: '0'