AC日记——[NOIP2015]运输计划 cogs 2109
发布日期:2021-08-25 00:32:42 浏览次数:7 分类:技术文章

本文共 1689 字,大约阅读时间需要 5 分钟。

 

思路:

  树剖+二分;

 

代码:

#include 
#include
#include
#include
using namespace std;#define maxn 300005#define INF 0x7fffffffint n,deep[maxn],dis[maxn],dis_[maxn],f[maxn],top[maxn];int head[maxn],E[maxn<<1],V[maxn<<1],W[maxn<<1],cnt,m;int path1[maxn],path2[maxn],ti[maxn],lar[maxn],size[maxn];int lca[maxn],lit_r,set[maxn];inline void in(int &now){ char Cget=getchar();now=0; while(Cget>'9'||Cget<'0') Cget=getchar(); while(Cget>='0'&&Cget<='9') { now=now*10+Cget-'0'; Cget=getchar(); }}void dfs1(int now,int fa){ deep[now]=deep[fa]+1,f[now]=fa,size[now]=1; for(int i=head[now];i;i=E[i]) { if(V[i]==fa) continue; dis[V[i]]=W[i]+dis[now],dfs1(V[i],now),size[now]+=size[V[i]]; if(size[lar[now]]
deep[y]) swap(x,y); lca[op]=x,lit_r=max(ci,lit_r); ci-=dis[lca[op]]*2;}void dfs3(int now){ for(int i=head[now];i;i=E[i]) { if(V[i]==f[now]) continue; dfs3(V[i]),dis[now]+=dis[V[i]]; } if(dis[now]==lit_r) set[++cnt]=now;}bool check(int x){ int num=0,pos=0; memset(dis,0,4*n+4); for(int i=1;i<=m;i++) { if(ti[i]>x) { num++;if(ti[i]>ti[pos]) pos=i; dis[path1[i]]++,dis[path2[i]]++,dis[lca[i]]-=2; } } if(!num) return true; cnt=0,lit_r=num,dfs3(1);pos=ti[pos]; for(int i=1;i<=cnt;i++) if(pos-dis_[set[i]]<=x) return true; return false;}int main(){ in(n),in(m);int u,v,w; for(int i=1;i
>1; if(check(mid)) ans=mid,r=mid-1; else l=mid+1; } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/IUUUUUUUskyyy/p/6882186.html

转载地址:https://blog.csdn.net/weixin_33836223/article/details/94473320 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:批处理备份mysql数据
下一篇:Sublime Text在Ubuntu下无法输入中文的解决方案

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月11日 10时32分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章