蜜汁MLE求助
查看原帖
蜜汁MLE求助
99643
陈刀仔楼主2022/1/6 16:27

数组怎么算都不会爆啊qwq

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+50;
int n,K;
int cnt=1,head[maxn],to[maxn*2],nex[maxn*2],w[maxn*2];
bool bj[maxn*2];
int ans=0x3f3f3f3f,siz[maxn],maxsiz[maxn];
int f[1000050];
void add(int x,int y,int z){to[++cnt]=y;nex[cnt]=head[x];head[x]=cnt;w[cnt]=z;}
inline int read(){
    int s=0,w=1,ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch)){s=(s<<3)+(s<<1)+ch-48;ch=getchar();}
    return s*w;
}
void deal_com(int u,int fa){
    siz[u]=1;maxsiz[u]=0;
    for(int i=head[u];i;i=nex[i]){
        int v=to[u];if(v==fa||bj[i])continue;
        deal_com(v,u);
        siz[u]+=siz[v];
        maxsiz[u]=max(maxsiz[u],siz[v]);
    }
}
void deal_com2(int u,int fa,int rt,int& nrt){
    maxsiz[u]=max(maxsiz[u],siz[rt]-siz[u]);
    if(maxsiz[u]*2<=siz[rt])nrt=u;
    for(int i=head[u];i;i=nex[i]){
        int v=to[i];if(v==fa||bj[i])continue;
        deal_com2(v,u,rt,nrt);
    }
}
void getg(int u,int fa,int dis,int dep){
    if(dis==K){ans=min(ans,dep);return;}
    if(dis>K)return;
    ans=min(ans,f[K-dis]+dep);
    for(int i=head[u];i;i=nex[i]){
        int v=to[i];if(v==fa||bj[i])continue;
        getg(v,u,dis+w[i],dep+1);
    }
}
void getf(int u,int fa,int dis,int dep){
    if(dis>K)return;
    f[dis]=min(f[dis],dep);
    for(int i=head[u];i;i=nex[i]){
        int v=to[i];if(v==fa||bj[i])continue;
        getf(v,u,dis+w[i],dep+1);
    }
}
void clear(int u,int fa,int dis){
    if(dis>K)return;
    f[dis]=0x3f3f3f3f;
    for(int i=head[u];i;i=nex[i]){
        int v=to[i];if(v==fa||bj[i])continue;
        clear(v,u,dis+w[i]);
    }
}
void solve(int rt){
    deal_com(rt,0);
    int nrt=0;
    deal_com2(rt,0,rt,nrt);
    for(int i=head[nrt];i;i=nex[i]){
        int v=to[i];if(bj[i])continue;
        getg(v,nrt,w[i],1);
        getf(v,nrt,w[i],1);
    }
    ans=min(ans,f[K]);
    clear(nrt,0,0);
    for(int i=head[nrt];i;i=nex[i]){
        int v=to[i];if(bj[i])continue;
        bj[i]=bj[i^1]=1;
        solve(v);
    }
}
signed main(){
    memset(f,0x3f,sizeof(f));
    n=read();K=read();
    for(int i=1;i<n;i++){
        int x=read()+1,y=read()+1,z=read();
        add(x,y,z);add(y,x,z);
    }
    solve(1);
    if(ans==0x3f3f3f3f)ans=-1;
    printf("%d\n",ans);
    return 0;
}
2022/1/6 16:27
加载中...