QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#286598#7961. 一棵树ucup-team1004WA 359ms53864kbC++141.8kb2023-12-18 07:34:262023-12-18 07:34:27

Judging History

This is the latest submission verdict.

  • [2023-12-18 07:34:27]
  • Judged
  • Verdict: WA
  • Time: 359ms
  • Memory: 53864kb
  • [2023-12-18 07:34:26]
  • Submitted

answer

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#ifdef DEBUG
template<class T>
ostream& operator << (ostream &out,vector<T> a){
	out<<'[';
	for(T x:a)out<<x<<',';
	return out<<']';
}
ostream& operator << (ostream &out,pair<ll,int> a){
	return out<<'('<<a.first<<','<<a.second<<')';
}
template<class T>
vector<T> ary(T *a,int l,int r){
	return vector<T>{a+l,a+1+r};
}
template<class T>
void debug(T x){
	cerr<<x<<endl;
}
template<class T,class...S>
void debug(T x,S...y){
	cerr<<x<<' ',debug(y...);
}
#else
#define debug(...) void()
#endif
const int N=5e5+10;
const ll INF=1e12;
int n,k;
vector<int>to[N];
ll ans=INF;
int m,rt,siz[N],mx[N],vis[N];
void dfs1(int u,int fa=0){
	m++;
	for(int v:to[u])if(v^fa&&!vis[v])dfs1(v,u);
}
void dfs2(int u,int fa=0){
	siz[u]=1,mx[u]=0;
	for(int v:to[u])if(v^fa&&!vis[v]){
		dfs2(v,u);
		siz[u]+=siz[v];
		mx[u]=max(mx[u],siz[v]);
	}
	mx[u]=max(mx[u],m-siz[u]);
	if(mx[u]<mx[rt])rt=u;
}
int dep[N],cnt[N],cur[N],top[N];
void dfs3(int u,int t=0,int fa=0){
	dep[u]=fa?dep[fa]+1:0,top[u]=t;
	for(int v:to[u])if(v^fa){
		dfs3(v,t?t:v,u);
	}
}
void solve(int u){
	m=rt=0,dfs1(u),dfs2(u),vis[u=rt]=1,dfs3(u);
	for(int i=1;i<=n;i++)cnt[dep[i]]++;
	for(int i=1;i<=n;i++)cnt[i]+=cnt[i-1];
	for(int i=1;i<=n;i++)cur[cnt[dep[i]]--]=i;
	fill(cnt,cnt+1+n,0);
	int nex=0,now=0;
	ll sum=(n-1ll)*k;
	for(int x=n;x>=1&&now<k;x--){
		int i=cur[x];
		if(i==u){now++;continue;}
		if(++cnt[top[i]]*2>k)nex=top[i];
		else now++,sum-=2*dep[i];
	}
	// debug(u,now,ary(cnt,1,n));
	if(now==k)ans=min(ans,sum);
	fill(cnt,cnt+1+n,0);
	if(nex&&!vis[nex])solve(nex);
}
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1,u,v;i<n;i++){
		scanf("%d%d",&u,&v);
		to[u].push_back(v),to[v].push_back(u);
	}
	mx[0]=n+1;
	solve(1);
	cout<<ans<<endl;
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 346ms
memory: 43372kb

input:

499991 31473
1 2
2 3
1 4
2 5
4 6
4 7
6 8
4 9
8 10
6 11
9 12
10 13
10 14
1 15
14 16
3 17
14 18
12 19
13 20
11 21
16 22
16 23
20 24
5 25
16 26
18 27
8 28
15 29
27 30
27 31
26 32
21 33
3 34
27 35
33 36
25 37
22 38
11 39
11 40
17 41
25 42
3 43
3 44
2 45
35 46
25 47
5 48
6 49
41 50
42 51
1 52
39 53
14 54...

output:

15734930984

result:

ok single line: '15734930984'

Test #2:

score: 0
Accepted
time: 347ms
memory: 53864kb

input:

499993 461706
1 2
2 3
3 4
1 5
3 6
3 7
7 8
5 9
5 10
7 11
10 12
9 13
13 14
12 15
13 16
15 17
14 18
17 19
16 20
15 21
16 22
17 23
22 24
20 25
23 26
25 27
27 28
28 29
25 30
29 31
30 32
31 33
33 34
33 35
32 36
36 37
35 38
33 39
34 40
35 41
41 42
40 43
42 44
39 45
40 46
41 47
43 48
44 49
46 50
49 51
50 52...

output:

195357165512

result:

ok single line: '195357165512'

Test #3:

score: 0
Accepted
time: 352ms
memory: 53824kb

input:

499993 170472
1 2
1 3
1 4
4 5
5 6
4 7
6 8
5 9
8 10
6 11
6 12
10 13
13 14
11 15
14 16
15 17
14 18
16 19
16 20
17 21
17 22
20 23
19 24
21 25
23 26
22 27
27 28
24 29
24 30
28 31
31 32
30 33
29 34
29 35
35 36
33 37
34 38
36 39
36 40
36 41
41 42
40 43
41 44
39 45
45 46
42 47
47 48
44 49
45 50
46 51
50 52...

output:

65062419628

result:

ok single line: '65062419628'

Test #4:

score: -100
Wrong Answer
time: 359ms
memory: 53748kb

input:

499994 801
1 2
2 3
1 4
2 5
2 6
1 7
7 8
4 9
6 10
10 11
7 12
7 13
10 14
13 15
15 16
14 17
16 18
18 19
15 20
17 21
18 22
19 23
21 24
23 25
21 26
26 27
27 28
24 29
28 30
29 31
27 32
30 33
28 34
29 35
35 36
31 37
36 38
36 39
38 40
36 41
36 42
38 43
38 44
42 45
41 46
41 47
47 48
46 49
45 50
49 51
49 52
48...

output:

285905395

result:

wrong answer 1st lines differ - expected: '285905307', found: '285905395'