求助!二分答案+深搜,65WA
查看原帖
求助!二分答案+深搜,65WA
227438
The_World_exe楼主2020/10/22 11:44

样例、自己手造的数据都过了,但是只有65分,而且好像所有的输出都比答案大。。看了好久也没看出哪里错了,求大佬帮忙康康qwq

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=5e4+5;
int n,m,sum,ans;
int fa[N],dep[N],vis[N],up[N];

struct edge
{
    int v,w;
};
vector<edge>e[N];
vector<edge>ne;
bool cmp(edge x,edge y)
{
    return x.w<y.w;
}
void dfs1(int x,int from)
{
    fa[x]=from;
    dep[x]=dep[from]+1;
    for(int i=0;i<e[x].size();i++)
    {
        int to=e[x][i].v;
        if(to==from)continue;
        dfs1(to,x);
    }
    return;
}
void output()
{
    for(int i=1;i<=n;i++)printf("(%d,%d)\n",fa[i],dep[i]);
    return;
}
void dfs2(int x,int t)
{
    for(int i=0;i<e[x].size();i++)
    {
        int to=e[x][i].v;
        if(to==fa[x])continue;
        dfs2(to,t);
    }
    int tail;
    
    ne=e[x];
    for(int i=0;i<ne.size();i++)
    {
        int to=ne[i].v;
        if(to==fa[x])continue;
        if(up[to]>0)ne[i].w+=up[to];
    }
    sort(ne.begin(),ne.end(),cmp);
    for(tail=ne.size()-1;tail>=0,ne[tail].w>=t;tail--)
        sum++;

    for(int i=0;i<=tail;i++)
    {
        int to=ne[i].v;
        if(to==fa[x]||vis[to]==x)continue;
        int l=i+1,r=tail;
        // int mid;
        int pst=tail+1;
        while(l<=r)
        {
            int mid=(l+r)>>1;
            if(ne[mid].w+ne[i].w>=t)pst=mid,r=mid-1;
            else l=mid+1;
        }
        while((vis[ne[pst].v]==x||ne[pst].v==fa[x])&&pst<=tail)pst++;//要限制以下pst<=tail
        if(pst<=tail)
        {
            vis[to]=x;
            vis[ne[pst].v]=x;
            sum++;
        }
    }
    up[x]=0;
    for(int i=tail;i>=0;i--)
    {
        int to=ne[i].v;
        if(vis[to]==x||to==fa[x])continue;
        up[x]=ne[i].w;
        break;
    }
    return;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n-1;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        e[u].push_back((edge{v,w}));
        e[v].push_back((edge{u,w}));
    }
    for(int i=1;i<=n;i++)
        sort(e[i].begin(),e[i].end(),cmp);
    dfs1(1,0);
    int l=0,r=0x7fffffff;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        sum=0;
        memset(vis,0,sizeof(vis));
        dfs2(1,mid);
        if(sum>=m)ans=mid,l=mid+1;
        else r=mid-1;
    }
    cout<<ans<<endl;
    return 0;
}

2020/10/22 11:44
加载中...