NOIP2018 Day1 T3 트랙 건설-2부 세트 2점-dp-욕심
#include
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define gc getchar()
using namespace std;
inline int inn()
{
int x,ch;while((ch=gc)<'0'||ch>'9');
x=ch^'0';while((ch=gc)>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^'0');return x;
}
const int N=50010;
struct edges{
int to,pre,wgt;
}e[N<<1];int h[N],etop,a[N],b[N],c[N];
inline int add_edge(int u,int v,int w)
{ return e[++etop].to=v,e[etop].pre=h[u],e[etop].wgt=w,h[u]=etop; }
namespace subtask_std{
int sv[N],res[N],vis[N];
inline int check(int cnt,int bp,int v)
{
rep(i,1,cnt) vis[i]=0;if(bp) vis[bp]=1;int mxans=0;
for(int i=cnt,j=1;i;i--)
{
if(vis[i]) continue;while(j<i&&(vis[j]||sv[j]+sv[i]<v)) j++;
if(j<i&&!vis[j]&&sv[j]+sv[i]>=v) vis[i]=vis[j]=1,mxans++,j++;
}
return mxans;
}
int dfs(int x,int fa,int v)
{
int cnt=0,ans=0;
for(int i=h[x],y;i;i=e[i].pre)
if((y=e[i].to)^fa) ans+=dfs(y,x,v);
for(int i=h[x],y;i;i=e[i].pre)
if((y=e[i].to)^fa) sv[++cnt]=res[y]+e[i].wgt;
res[x]=0;if(!cnt) return ans;
sort(sv+1,sv+cnt+1);
while(cnt&&sv[cnt]>=v) ans++,cnt--;
int mxans=check(cnt,0,v),L=1,R=cnt,mid=(L+R)>>1;
while(L<=R)
{
if(check(cnt,mid,v)==mxans) L=mid+1;
else R=mid-1;mid=(L+R)>>1;
}
return res[x]=sv[R],ans+=mxans;
}
inline int acceptable_solution(int n,int m)
{
memset(h,0,sizeof(int)*(n+1)),etop=0;
rep(i,1,n-1) add_edge(a[i],b[i],c[i]),add_edge(b[i],a[i],c[i]);
int L=1,R=0;rep(i,1,n-1) R+=c[i];
for(int mid=(L+R)>>1;L<=R;mid=(L+R)>>1)
if(dfs(1,0,mid)>=m) L=mid+1;
else R=mid-1;
return !printf("%d
",R);
}
}
int main()
{
int n=inn(),m=inn();
rep(i,1,n-1) a[i]=inn(),b[i]=inn(),c[i]=inn();
return subtask_std::acceptable_solution(n,m);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
|NOIOJ|2분|04: 네트워크 관리자심판위원회는 인터넷 라인을 구매하기 위해 현지의 한 인터넷 솔루션 제공 업체에 연락하여 일정한 수량의 등장망 라인을 제공할 수 있도록 요구했다.심판위원회는 네트워크가 길어질수록 좋아져 선수들 사이의 거리가 가능한 한...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.