P2680 [NOIP2015 提高组] 运输计划TLE求调
查看原帖
P2680 [NOIP2015 提高组] 运输计划TLE求调
1053324
__yuanhaoran楼主2025/1/4 19:57

这哪里TLE了啊,求大佬帮忙看一下(P2680运输计划)

#include<bits/stdc++.h>
using namespace std;
int n,m,bs,he[300005],ne[600005],f[300005],s[300005],gs[300005],zr[300005],tf[300005],df[300005],l,r,mid,cc,l1[300005],ss,sss,q[300005];
struct node{int x,y,z;}a[300005],d[300005],g[600005];
void hi(int x,int y,int z)
{
    f[x]=y,s[x]=z;int zd=0,w=0;
    df[++cc]=x;
    for(int i=he[x];i;i=ne[i])
    {
        if(g[i].x!=y)
        {
            l1[g[i].x]=l1[x]+g[i].y;
            hi(g[i].x,x,z+1),gs[x]+=gs[g[i].x];
            if(zd<gs[g[i].x])zd=gs[g[i].x],w=g[i].x;
        }
    }
    zr[x]=w;
}
int lca(int x,int y)
{
    while(tf[x]!=tf[y])
    {
        if(s[tf[x]]<s[tf[y]])swap(x,y);
        x=f[tf[x]];
    }
    return s[x]<s[y]?x:y;
}
int check(int x)
{
    int cnt=0,an=0;
	memset(q,0,sizeof(q));
    for(int i=1;i<=m;i++)
    {
        if(l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]>x)
        {
            q[d[i].x]++;
            q[d[i].y]++;
            q[d[i].z]-=2;
            an=max(an,l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]-x);
            cnt++;
        }
        else continue;
    }
    if(cnt==0)return 1;
    for(int i=n;i>=1;i--)q[f[df[i]]]+=q[df[i]];
    for(int i=2;i<=n;i++)if(q[i]==cnt&&l1[i]-l1[f[i]]>=an)return 1;
    return 0;
}
int main()
{
    freopen("transport.in","r",stdin);
    freopen("transport.out","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>m;
    l1[1]=0;
    for(int i=1;i<n;i++)
    {
        cin>>a[i].x>>a[i].y>>a[i].z;
        ne[++bs]=he[a[i].x];
        he[a[i].x]=bs;
        g[bs].x=a[i].y;
        g[bs].y=a[i].z;
        ne[++bs]=he[a[i].y];
        he[a[i].y]=bs;
        g[bs].x=a[i].x;
        g[bs].y=a[i].z;
        sss=max(sss,a[i].z);
    }
    hi(1,1,1);
    tf[1]=1;
    for(int i=2;i<=n;i++)
    {
        tf[df[i]]=df[i]==zr[f[df[i]]]?tf[f[df[i]]]:df[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>d[i].x>>d[i].y;
        d[i].z=lca(d[i].x,d[i].y);
        ss=max(ss,l1[d[i].x]+l1[d[i].y]-2*l1[d[i].z]);
    }
    l=ss-sss,r=ss;
    while(l<r)
    {
        mid=(l+r)>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<l;
    return 0;
}
2025/1/4 19:57
加载中...