社区讨论
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 条回复,欢迎继续交流。
正在加载回复...