为什么本地过了,但交上去全RE
查看原帖
为什么本地过了,但交上去全RE
141958
楠枫楼主2021/5/21 11:47

RT

#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    inline char gc() {return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
    inline int read() {
        int x=0,f=1;char ch=gc();
        while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
        return x*f;
    }
}
using IO::read;
namespace nanfeng{
    static const int N=2e5+7;
    static const int INF=1e9+7;
    struct edge{int v,w,nxt;}e[N<<1];
    int first[N],t=1,siz[N],G[N],dis1[N],dis2[N],bc[N*5],pos,cnt,n,k,tot,ans=INT_MAX;
    inline void test(int a) {if (a>=5*N) printf("test%d\n",a);}
    inline void add(int u,int v,int w) {
        e[t].v=v;
        e[t].w=w;
        e[t].nxt=first[u];
        first[u]=t++;
    }
    inline int dfs_find(int S,int x,int f) {
        siz[x]=1;
        ri GS=0;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            if ((v=e[i].v)==f||G[v]) continue;
            dfs_find(S,v,x);
            siz[x]+=siz[v];
            GS=max(GS,siz[v]);
        }
        GS=max(GS,S-siz[x]);
        if (GS<cnt) {
            cnt=GS;
            pos=x;
        }
    }
    inline void dfs_dis(int x,int f,int d1,int d2) {
        if (d2>k) return;
        dis1[p(tot)]=d1;dis2[tot]=d2;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            if ((v=e[i].v)==f||G[v]) continue;
            dfs_dis(v,x,d1+1,d2+e[i].w);
        }
    }
    inline void calc(int x) {
        bc[tot=0]=0;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            if (G[v=e[i].v]) continue;
            int ps=tot;
            dfs_dis(v,x,1,e[i].w);
            for (ri j(ps+1);j<=tot;p(j)) ans=min(ans,bc[k-dis2[j]]+dis1[j]),test(k-dis2[j]);
            for (ri j(ps+1);j<=tot;p(j)) bc[dis2[j]]=min(bc[dis2[j]],dis1[j]),test(dis2[j]);
        }
        for (ri i(1);i<=tot;p(i)) bc[dis2[i]]=INF,test(dis2[i]);
    }
    inline void solve(int S,int x,int f) {
        dfs_find(cnt=S,x,f);
        G[pos]=1;
        calc(pos);
        for (ri i(first[pos]),v;i;i=e[i].nxt) {
            if (G[v=e[i].v]) continue;
            solve(siz[v],v,pos);
        }
    }
    inline int main() {
        // freopen("1.in","r",stdin);
        n=read(),k=read();
        for (ri i(1);i<n;p(i)) {
            int u=read()+1,v=read()+1,w=read();
            add(u,v,w);add(v,u,w);
        }
        for (ri i(1);i<=k;p(i)) bc[i]=INF;
        solve(n,1,0);
        printf("%d\n",ans>=n?-1:ans);
        return 0;
    } 
}
int main() {return nanfeng::main();}

目前测出来是 dfs_find 找重心的问题,但没看出来到底哪错了,请万能的谷民帮忙看一看

2021/5/21 11:47
加载中...