Codeforces444E DZY Loves Planting
来源:互联网 发布:java零基础看什么书 编辑:程序博客网 时间:2024/06/10 12:19
题目链接
题目大意
给定一棵
对于一个下标从
题解
这题意好绕…而且信息量略大….
自己一开始的想法是先二分答案,然后判能否使每个
可以先
说起来都很虚对吧,而且标签里还写着dsu并查集…于是我瞟了一眼tutorial,似乎看到了网络流?还说什么常数很小?本着相信CF服务器十分强大的心理敲了一发…果断T了…
题解里说的正解是树分治+网络流可以把边数控制在
然而神犇subscriber在比赛时想出了一个
真·题解
嗯嗯说到并查集那么肯定要先将边按权值排序然后一条一条并起来啦.
考虑当前这条边怎样才能成为答案.即可以使当前边的权值
先不考虑边权有相同的情况,那么当前(并上这条边之前)任意的节点
关键是怎么判定在限制条件下每个节点
我们换一个角度思考,在合并时考虑这个操作是否会导致不可行.
就是说合并之前是满足分配条件的,那么当前合并只会影响合并的两个集合之间的分配情况.合并两个集合
当然这题还有一些坑爹的细节…首先如果有权值相同的边必须把它们一次性全都并起来才能更新答案.然后对于最初每个点独立成一个连通块的情况,因为输入保证了
这题真的是非常神.一开始我很困惑为什么每个连通块都满足能从其他连通块得到足够的分配就可以推出整个状态可以完成分配,后来才发现是在一步一步合并的过程中实时保证了状态的合法性,这样就大大化简了问题.
于是达到了神奇的复杂度
代码
#include<cstdio>#include<algorithm>using namespace std;const int N=3e3+5;int sum,par[N],cnt[N],lim[N];bool valid;struct Edge{ int u,v,cost; inline bool operator <(const Edge &tmp)const{ return cost<tmp.cost; } void Rd(){ scanf("%d%d%d",&u,&v,&cost); }}edge[N];int get_root(int x){ return par[x]==x?x:par[x]=get_root(par[x]);}void unite(int u,int v){ u=get_root(u); v=get_root(v); cnt[v]+=cnt[u]; lim[v]+=lim[u]; if(cnt[v]>sum-lim[v])valid=false; par[u]=v;}int main(){ int n; scanf("%d",&n); if(n==1){ puts("0"); return 0; } int m=n-1,ans; for(int i=0;i<m;++i) edge[i].Rd(); sort(edge,edge+m); valid=true; sum=0; for(int i=1;i<=n;++i){ cnt[par[i]=i]=1; scanf("%d",&lim[i]); sum+=lim[i]; } for(int i=0;i<m&&valid;++i){ if(!i||edge[i].cost!=edge[i-1].cost)ans=edge[i].cost; unite(edge[i].u,edge[i].v); } printf("%d\n",ans); return 0;}/* Jun.04.16 Tags:dsu Submissions:4 Time 31ms Memory 2100KB*/
- Codeforces444E DZY Loves Planting
- [CF444E]DZY Loves Planting
- cf445A DZY Loves Chessboard
- cf445B DZY Loves Chemistry
- cf444A DZY Loves Physics
- cf446A DZY Loves Sequences
- C. DZY Loves Sequences
- D. DZY Loves Modification
- DZY Loves Fibonacci Numbers
- 【CF】DZY Loves Chessboard
- A. DZY Loves Hash
- B. DZY Loves Strings
- C. DZY Loves Sequences
- A. DZY Loves Hash
- B. DZY Loves Strings
- DZY Loves Chessboard
- A. DZY Loves Chessboard
- dzy loves chessboard
- 如何在ajax请求中设置特殊的RequestHeader
- Android录音、WAV、AMR
- 任务和特权级保护(五)——《x86汇编语言:从实模式到保护模式》读书笔记36
- Java EE — Servlet 01 Servlet 开发流程
- 第一篇博客
- Codeforces444E DZY Loves Planting
- [内核驱动]Minifilter实现文件拒绝访问
- 最大似然估计 (MLE) 最大后验概率(MAP)
- Android开源框架——事件总线otto
- 移动开发用户行为分析神器之--AppSee!
- 结构体在内存中占的空间大小详解
- 强大的vim配置
- HTML5技术的发展前景解析
- Windows下Postgresql数据库的下载与配置方法