全局数组RE局部AC
查看原帖
全局数组RE局部AC
218405
_CHO楼主2020/11/5 14:42

RT,开成全局数组都是R

在dfs函数里开就是AC+TLE

分别是f[],g[]f[],g[]

#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e+4+100;
struct Edge{
	int u,v,w;
};
int n,m;
int l,r,cnt;
int he[maxn],ne[maxn<<1],_cnt=1;
Edge G[maxn<<1];
int g[maxn];

int V[maxn],f[maxn];

void add_Edge(int u,int v,int w){
	G[_cnt].v = v;
	G[_cnt].w = w;
	ne[_cnt] = he[u];
	he[u] = _cnt++;
}
inline void dfs(int u,int fa,int k){
	//vector <int> V,f;
	for(int i=he[u];i;i=ne[i]){
		int v=G[i].v;
		int w=G[i].w;
		if(v==fa) continue;
		dfs(v,u,k);
		//V.push_back(w+g[v]);
		//f.push_back(0);
	}

	int ccnt=0,i;
	
	for(int i=he[u];i;i=ne[i]){
		int v=G[i].v;
		int w=G[i].w;
		if(v==fa) continue;
		V[++ccnt] = g[v]+w;
		f[ccnt] = 1;
	}
	sort(V+1,V+ccnt+1);
	for(i=ccnt;i>=1;--i){
		if(V[i]>=k){
			//printf("bug\n");
			f[i]=0;
			++cnt;
		}else break;
	}
	for(register int j=1;j<=ccnt;++j){
		if(f[j]){
			int t=lower_bound(V+1,V+ccnt+1,k-V[j])-V;
			while(j==t||!f[t])++t;
			if(t<=ccnt){
				//printf("bug %d %d\n",V[i],V[t]);
				f[t]=f[j]=0;
				++cnt;
			}
		}
	}
	g[u]=0;
	for(int j=ccnt;j>=1;--j){
		if(f[j]){
			g[u] = V[j];
			break;
		}
	}
	//printf("dfs %d %d %d g[%d] = %d   %d\n",l,r,k,u,g[u],cnt);
	return ;
}
inline bool check(int k){
	cnt=0;
	dfs(1,0,k);
	//printf("check %d\n",cnt);
	return cnt>=m;
}
int binary_search(){
	int res,mid;
	while(l<=r){
		mid = l+r>>1;
		if(check(mid)){
			res = mid;
			l=mid+1;
		}else{
			r=mid-1;
		}
	}
	return res;
}
int main(){
	cin>>n>>m;
	for(register int i=1;i<n;++i){
		int u,v,w;cin>>u>>v>>w;
		add_Edge(u,v,w);
		add_Edge(v,u,w);
		r+=w;
	}
	printf("%d",binary_search());
	return 0;
}
2020/11/5 14:42
加载中...