TLE90求调
查看原帖
TLE90求调
353976
Yuzu_Soft楼主2023/5/3 08:05
#include<bits/stdc++.h>
#define pii pair<int,int>
using namespace std;
inline int read(){int s=0,w=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+(c^48);c=getchar();}return s*w;}
inline void print(int x){if(x<0){putchar('-');x=-x;}if(x>=10)print(x/10);putchar(x%10+'0');}
int n,m,dep[300005],f[300005][20],mid,c[300005],a[300005],b[300005],sum[300005],cnt,ma;
int head[300005],to[600005],nxt[600005],v[600005],edgenum;
void addedge(int x,int y,int z)
{
    to[++edgenum]=y;
    v[edgenum]=z;
    nxt[edgenum]=head[x];
    head[x]=edgenum;
}
bool flag=false;
void dfs(int x,int fa)
{
    dep[x]=dep[fa]+1;
    f[x][0]=fa;
    for(int i=head[x];i;i=nxt[i])
    {
        int u=to[i],w=v[i];
        if(u!=fa)
        {
            sum[u]=sum[x]+w;
            dfs(u,x);
        }
    }
}
int lca(int x,int y)
{
    if(dep[x]<dep[y])swap(x,y);
    while(dep[x]>dep[y])
    {
        int k=(int)log2(dep[x]-dep[y]);
        x=f[x][k];
    }
    if(x==y)return x;
    for(int i=(int)log2(dep[x]);i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
    return f[x][0];
}
void dfs2(int x,int fa)
{
    for(int i=head[x];i;i=nxt[i])
    {
        int u=to[i],w=v[i];
        if(u!=fa)
        {
            dfs2(u,x);
            c[x]+=c[u];
            if(c[u]==cnt)if(w>=ma)flag=true;
        }
    }
}
int main()
{
//    freopen("P2680_9.in","r",stdin);
    n=read(),m=read();
    int l=0,r=0;
    for(int x,y,z,i=2;i<=n;i++)x=read(),y=read(),z=read(),addedge(x,y,z),addedge(y,x,z),r+=z;
    dfs(1,0);
    for(int i=1;i<=17;i++)
        for(int x=1;x<=n;x++)f[x][i]=f[f[x][i-1]][i-1];
    for(int i=1;i<=m;i++)a[i]=read(),b[i]=read();
    while(l<r)
    {
//      printf("%d %d\n",l,r);
        mid=(l+r)/2;
        for(int i=0;i<=n;i++)c[i]=0;
        cnt=0;
        ma=0;
        flag=false;
        for(int i=1;i<=m;i++)
        {
            int fa=lca(a[i],b[i]),len=sum[a[i]]+sum[b[i]]-sum[fa]*2;
            if(len>mid)
            {
                cnt++;
                ma=max(ma,len-mid);
                c[fa]-=2;
                c[a[i]]++;
                c[b[i]]++;
            }
        }
        if(cnt!=0)dfs2(1,0);
        else flag=true;
        if(flag)r=mid;
        else l=mid+1;
    }
    print(l);
    puts("");
    return 0;
}

第九,第十三个点T了,哪里还能优化

2023/5/3 08:05
加载中...