救救孩子吧 交了一页了 只有七十五分
  • 板块P4149 [IOI2011] Race
  • 楼主zysqh
  • 当前回复10
  • 已保存回复10
  • 发布时间2020/7/14 10:26
  • 上次更新2023/11/6 23:09:53
查看原帖
救救孩子吧 交了一页了 只有七十五分
224111
zysqh楼主2020/7/14 10:26

这是七十五分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define S 1000005
using namespace std;
//分治函数 
int f[S];
struct mmm{
    int ne,to,dis; 
}e[S*2];
int h[S],cnt1;
int cnt;
void add(int u,int v,int val){
    e[++cnt1].ne=h[u];
    e[cnt1].to=v;
    e[cnt1].dis=val;
    h[u]=cnt1;
}
struct nnn{
	int d,bian;
}re[S];
int siz[S],rt;
int use[S];
int ANS,Size;
void get_root(int u,int fa){
    f[u]=0;siz[u]=1;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(use[v]||v==fa)continue;
        get_root(v,u);
        f[u]=max(f[u],siz[v]);
        siz[u]+=siz[v];
    }
    f[u]=max(f[u],Size-siz[u]);
    if(f[u]<f[rt])rt=u;
} 
int b[S];
void get_num(int u,int fa,int D,int el,int from){
	b[cnt]=from;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa||use[v])continue;
        re[++cnt].d=D+e[i].dis;
        re[cnt].bian=el+1;
        get_num(v,u,re[cnt].d,re[cnt].bian,from);
    }
}
bool cmp(nnn &a,nnn &b){
	if(a.d!=b.d)return a.d<b.d;
	return a.bian<b.bian;
}
int n,k;
void solve(int u,int D){
    cnt=1;
    re[cnt].d=D;
    b[1]=u;
    for(int i=h[u];i;i=e[i].ne){
    	int v=e[i].to;
    	if(use[v])continue;
    	b[++cnt]=v;
    	re[++cnt].d=D+e[i].dis;
        re[cnt].bian=1;
		get_num(v,u,re[cnt].d,re[cnt].bian,v);
	}
    
    sort(re+1,re+1+cnt,cmp);
    int l=1,ll=cnt;
    while(l<cnt&&re[l].d+re[cnt].d<k)l++;
    while(l<cnt&&k-re[l].d>=re[l].d){
        if(ll<l)ll=l;
        while(re[l].d+re[ll].d>k&&l+1<=ll)ll--;
        while(re[l].d+re[ll].d>=k&&l+1<=ll){
        	//cout<<b[ll]<<" "<<b[l]<<l<<" "<<ll<<endl;
        	ANS=min(ANS,re[l].bian+re[ll].bian);
        	//ANS=min(ANS,re[l].bian);
        	ll--;
		}
        l++;
    }
}

void dfs(int u){
    use[u]=1;
    solve(u,0);
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(use[v])continue;
        Size=siz[v];
        rt=0;
        get_root(v,u);
        dfs(rt);
    }
}

inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int aaa,bbb,ccc;
int main(){
    f[0]=0x3f3f3f;ANS=0x3f3f3f;
    n=read();k=read();
    Size=n;
    for(int i=1;i<n;++i){
        aaa=read()+1;bbb=read()+1;ccc=read();
        add(aaa,bbb,ccc);
        add(bbb,aaa,ccc);
    }
    get_root(1,0);
    dfs(rt);
    if(ANS==0x3f3f3f)printf("-1\n");
	else printf("%d\n",ANS);
    return 0;
}

这是七十分

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define S 1000005
using namespace std;
//分治函数 
int f[S];
struct mmm{
    int ne,to,dis; 
}e[S*2];
int h[S],cnt1;
int cnt;
void add(int u,int v,int val){
    e[++cnt1].ne=h[u];
    e[cnt1].to=v;
    e[cnt1].dis=val;
    h[u]=cnt1;
}
struct nnn{
	int d,bian;
}re[S];
int siz[S],rt;
int use[S];
int ANS,Size;
void get_root(int u,int fa){
    f[u]=0;siz[u]=1;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(use[v]||v==fa)continue;
        get_root(v,u);
        f[u]=max(f[u],siz[v]);
        siz[u]+=siz[v];
    }
    f[u]=max(f[u],Size-siz[u]);
    if(f[u]<f[rt])rt=u;
} 
int b[S];
void get_num(int u,int fa,int D,int el,int from){
	b[cnt]=from;
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(v==fa||use[v])continue;
        re[++cnt].d=D+e[i].dis;
        re[cnt].bian=el+1;
        get_num(v,u,re[cnt].d,re[cnt].bian,from);
    }
}
bool cmp(nnn &a,nnn &b){
	return a.d<b.d;
}
int n,k;
void solve(int u,int D){
    cnt=1;
    re[cnt].d=D;
    b[1]=u;
    for(int i=h[u];i;i=e[i].ne){
    	int v=e[i].to;
    	if(use[v])continue;
    	b[++cnt]=v;
    	re[++cnt].d=D+e[i].dis;
        re[cnt].bian=1;
		get_num(v,u,re[cnt].d,re[cnt].bian,v);
	}
    
    sort(re+1,re+1+cnt,cmp);
    int l=1,ll=cnt-1,rr=cnt;
    while(l<cnt&&re[l].d+re[cnt].d<k)++l;
    while(l<cnt&&k-re[l].d>=re[l].d){
        if(ll<=l)ll=l;
        while(re[l].d+re[ll].d>k&&l+1<=ll)ll--;
        while(re[l].d+re[ll].d>=k&&l+1<=ll){
        	//cout<<b[ll]<<" "<<b[l]<<l<<" "<<ll<<endl;
        	ANS=min(ANS,re[l].bian+re[ll].bian);
        	ll--;
		}
        while(re[l].d+re[rr].d>k&&ll<rr)rr--;
        l++;
    }
}

void dfs(int u){
    use[u]=1;
    solve(u,0);
    for(int i=h[u];i;i=e[i].ne){
        int v=e[i].to;
        if(use[v])continue;
        Size=siz[v];
        rt=0;
        get_root(v,u);
        dfs(rt);
    }
}

inline int read(){
    int x=0;char ch=getchar();
    while(ch<'0'||ch>'9'){ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int aaa,bbb,ccc;
int main(){
    f[0]=0x3f3f3f;ANS=0x3f3f3f;
    n=read();k=read();
    Size=n;
    for(int i=1;i<n;++i){
        aaa=read()+1;bbb=read()+1;ccc=read();
        add(aaa,bbb,ccc);
        add(bbb,aaa,ccc);
    }
    get_root(1,0);
    dfs(rt);
    
    if(ANS==0x3f3f3f)printf("-1\n");
	else printf("%d\n",ANS);
    return 0;
}

2020/7/14 10:26
加载中...