90求助
查看原帖
90求助
173397
取啥名好楼主2019/9/25 14:00

loj75,洛谷90,求大佬查错

#include<bits/stdc++.h>
using namespace std;
int   cnt=0,n,m,pd=0,cnt_w=0,cnt_c=0,num=0;
int head[600010]={0},army[300100]={0},grand[300100][21]={0},who[300100]={0};
int   mark[300100]={0},jl[300100]={0},used[300100]={0},slove[300100]={0},city_can[300100],city_will[300100];
long long deep[300100]={0},l=0,r=0,ans=0;
struct node{
	int   to,next,val;
}tu[600100];
inline bool cmp(int x,int y){
	return deep[x]>deep[y];
}
inline void add(int u,int v,int c){
	cnt++;
	tu[cnt].to=v;
	tu[cnt].val=c;
	tu[cnt].next=head[u];
	head[u]=cnt;
}
void pre_dfs(int  x,int  fa,int kk){
	r=max(r,deep[x]);
	who[x]=kk;
	for(int  i=1;i<=19;i++)	grand[x][i]=grand[ grand[x][i-1] ][i-1];
	for(int  i=head[x];i;i=tu[i].next){
		if(tu[i].to==fa)	continue;
		deep[tu[i].to]=deep[x]+tu[i].val;
		grand[tu[i].to][0]=x;
		pre_dfs(tu[i].to,x,kk);	
	}
}
bool re_dfs(int  x,int  fa){
	if(mark[x])	return 1;
	for(int i=head[x];i;i=tu[i].next){
		if(tu[i].to==fa)	continue;
		if(!re_dfs(tu[i].to,x))		return 0;	
	}
	if(!tu[head[x]].next)	return 0;
	return 1;
}
bool check(long long limit){
	cnt_w=cnt_c=0;
	memset(mark,0,sizeof(mark));
	memset(jl,0,sizeof(jl));
	memset(used,0,sizeof(used));
	for(int  i=1;i<=m;i++){
		int xx=army[i];
		if(deep[xx]>limit){
			for(int  j=19;j>=0;j--)
				if(grand[xx][j]>1&&deep[xx]-deep[grand[xx][j]]<=limit)
					xx=grand[xx][j];
			mark[xx]=1;
		}
		else{
			cnt_c++;
			city_can[cnt_c]=i;
			if(!jl[who[xx]]||deep[xx]>deep[ army[jl[who[xx]]] ])
				jl[who[xx]]=i;
		}
	}
	for(int  i=1;i<=num;i++){
		if(!re_dfs(slove[i],1))	{
			cnt_w++;
			city_will[cnt_w]=slove[i];
		}
	}
//	if(limit==28132){
//		cout<<endl;
//		for(int i=1;i<=cnt_c;i++)	cout<<deep[army[city_can[i]]]<<" ";
//		cout<<endl;
//		for(int i=1;i<=cnt_w;i++)	cout<<deep[city_will[i]]<<" ";
//	}
	
	if(!cnt_w)	return 1;
	if(cnt_c<cnt_w)	return 0;	
	used[0]=1;
	for(int  i=1;i<=cnt_w;i++){		
		if( !used[ jl[ city_will[i] ] ] ){
			used[ jl[ city_will[i] ] ]=1;
			continue;
		}					
		while(cnt_c&&used[city_can[cnt_c]])	cnt_c--;
		if(!cnt_c)	return 0;
		if(limit-deep[ army[ city_can[cnt_c] ] ]<deep[ city_will[i] ])	return 0;
		used[city_can[cnt_c]]=1;							
	}
	
	return 1;
}
int  main(){
	freopen("blockade.in","r",stdin);
	freopen("blockade.out","w",stdout);
	cin>>n;
	for(int  i=1,a,b,c;i<n;i++){
		cin>>a>>b>>c;
		add(a,b,c);
		add(b,a,c);
	}
	for(int  i=head[1];i;i=tu[i].next){
		deep[tu[i].to]=tu[i].val;
		grand[tu[i].to][0]=1;
		num++;
		slove[num]=tu[i].to;
		pre_dfs(tu[i].to,1,tu[i].to);
	}
	cin>>m;
	if(m<slove[0]){	cout<<-1;	return 0;}
	for(int  i=1;i<=m;i++)	cin>>army[i];
	sort(army+1,army+1+m,cmp);
	sort(slove+1,slove+1+num,cmp);
	r*=2;
	while(l<=r){
		long long  mid=(l+r)>>1;
		if(check(mid))	ans=mid,r=mid-1;
		else	l=mid+1;
	}
	cout<<ans;
	return 0;
}

2019/9/25 14:00
加载中...