社区讨论

65WA求助

P2680[NOIP 2015 提高组] 运输计划参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo31xxxu
此快照首次捕获于
2023/10/23 23:28
2 年前
此快照最后确认于
2023/10/23 23:28
2 年前
查看原帖
大佬帮帮忙吧,谢谢!
CPP
#include<bits/stdc++.h>
using namespace std;
struct EDGE{int to,nxt,num;}edge[600005];
int head[300005],tot;
void Add(int x,int y,int z){edge[++tot].to=y;edge[tot].num=z;edge[tot].nxt=head[x];head[x]=tot;}
int fa[300005][21],dep[300005],f[300005],dfs,in[300005],out[300005],Log[300005],n,m;
int timy[300005];
void DFS(int x,int fat)
{
	fa[x][0]=fat;dep[x]=dep[fat]+1;in[x]=++dfs;
	for(int i=1;i<=Log[dep[x]-1];i++)fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=head[x];i;i=edge[i].nxt)
		if(edge[i].to!=fat)f[edge[i].to]=f[x]+edge[i].num,timy[edge[i].to]=edge[i].num,DFS(edge[i].to,x);
	out[x]=dfs;
}
int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(;dep[x]>dep[y];x=fa[x][Log[dep[x]-dep[y]]]);
	if(x==y)return x;
	for(int i=Log[dep[x]-1];i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
struct QUEST{int fr,ed,sum;}q[300005];
bool cmp(QUEST x,QUEST y){return x.sum>y.sum;}	//
int tr[300005];
int lb(int x){return x&(-x);}
void update(int x,int y){for(int i=x;i<=n;i+=lb(i))tr[i]+=y;}
int query(int x){int res=0;for(int i=x;i>=1;i-=lb(i))res+=tr[i];return res;}
bool check(int T)
{
	memset(tr,0,sizeof(tr));
	int film;
	for(film=1;film<=m&&q[film].sum>T;film++)
		update(q[film].fr,1),update(q[film].ed,1),update(lca(q[film].fr,q[film].ed),-2);	//
	for(int i=2;i<=n;i++)
	{
		int t=query(out[i])-query(in[i]-1);
		if(t!=film-1||q[1].sum-timy[i]>T)continue;
		return 1;
	}
	return 0;
}
int main()
{
	scanf("%d%d",&n,&m);
	Log[0]=-1;for(int i=1;i<=n;i++)Log[i]=Log[i>>1]+1;
	for(int i=1;i<n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);Add(a,b,c);Add(b,a,c);}	
	DFS(1,0);
	for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&q[i].fr,&q[i].ed);q[i].sum=f[q[i].fr]+f[q[i].ed]-f[lca(q[i].fr,q[i].ed)]*2;}
	sort(q+1,q+m+1,cmp);
	int l=0,r=300000000;
	while(l<r)
	{
		int mid=l+r>>1;
		if(check(mid))r=mid;else l=mid+1;
	}
	printf("%d\n",r);
}

回复

2 条回复,欢迎继续交流。

正在加载回复...