时间限制:3.0s   内存限制:1.0GB

【大意】

给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有need条白色边的生成树。
题目保证有解。

【输入格式】

第一行V,E,need分别表示点数,边数和需要的白色边数。
接下来E行
每行s,t,c,col表示这边的端点(点从0开始标号),边权,颜色(0白色1黑色)。

【输出格式】

一行表示所求生成树的边权和。

【数据规模和约定】

0:V<=10
1,2,3:V<=15
0,..,19:V<=50000,E<=100000
所有数据边权为[1,100]中的正整数。

【样例输入】

2 2 1
0 1 1 1
0 1 2 0

【样例输出】

2
【题解】
       cogs上这题有个标签叫二分,刚开始完全不知道是为了什么……先搞了一遍愚蠢的贪心,后来发现好像不是那么回事。然后想着暴力枚举情况,感觉这是时间内存双爆炸的节奏……然后看了题解,被正解的做法惊艳到了,%%%WJMZBMR。本蒟蒻曾经盯着那个明显有所寓意的[1,100]看了半天,然而并没能参悟其中玄机。
       事情是这样的……克鲁斯卡尔不是要按边权排序从小到大选边吗,然后每个边它边权越小越容易被选上啊。我们不是不知道怎么选刚好合适吗,就从多到少二分选呗。怎么能实现呢,只要从-101到+101二分,对于分到的每一个值,都把白边的权值全部加上它,去看现在选了多少白边,加的值越大选的白边越少;如果白边少了就把右界向下调,白边多了或正相等就把左界向上调,直到恰好调出那个need。原来二分都是二分答案云云,这种神奇的二分还是头一次做到。通过二分调整来确定一个刚好合适的值,题面上的“恰好”、“保证有解”这些字眼原来都有所指啊……不愧是国家集训队的题。
        实现的时候WA得很厉害,因为我是直接统计的每一个被选边的原边权之和,而正确的做法应该是用加了二分值的边权减去need*二分值。刚开始百思不得其解,后来忽然明白二分可能并不能刚好分出那个值,但是已经找到了一个确定值。这时候选的白边不一定就是need个,毕竟相同权值的白边还可能有很多条呢。所以减去need*二分值,得到的答案才是准确的;如果在check的真实过程中最后选了更多的白边,直接把它当做选了同样权值的黑边看待。如果某人在考场上想到了正解却因为这种细节被卡到几十分甚至更低,失落之情可想而知。在所有细节处留心,才是OIer的风范啊。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int sj=50005;
int f[sj],e1,n,m,nee,a1,a2,a3,a4,zj,yj,mid;
struct B
{int v,w,u,bh,cr;
}b[sj<<1];
void add(int x,int y,int z,int e)
{e1++;b[e1].v=y;b[e1].w=z;b[e1].cr=z;b[e1].u=x;b[e1].bh=e;
}
int comp(const B&x,const B&y)
{return (x.cr==y.cr)?(x.bh<y.bh):(x.cr<y.cr);
}
int find(int x)
{if(f[x]==-1) return x;f[x]=find(f[x]);return f[x];
}
void hb(int x,int y)
{x=find(x),y=find(y);f[x]=y;
}
void init()
{scanf("%d%d%d",&n,&m,&nee);for(int i=1;i<=m;i++){scanf("%d%d%d%d",&a1,&a2,&a3,&a4);add(a1,a2,a3,a4);}
}
bool kl()
{a1=a2=a4=0;sort(b+1,b+m+1,comp);for(int i=1;i<=m;i++)if(find(b[i].u)!=find(b[i].v)){if(b[i].bh==0) a1++;a4++;a2+=b[i].cr;hb(b[i].u,b[i].v);if(a4==n-1) break;}return a1>=nee;
}
int main()
{init();zj=-105,yj=105;while(zj<=yj){mid=(zj+yj)>>1;memset(f,-1,sizeof(f));for(int i=1;i<=m;i++)if(b[i].bh==0)b[i].cr=b[i].w+mid;if(kl()) zj=mid+1,a3=a2-nee*mid;else yj=mid-1;}printf("%d",a3);return 0;
}

tree

转载于:https://www.cnblogs.com/moyiii-/p/7354714.html

tree(陈立杰)[国家集训队2012]相关推荐

  1. [国家集训队2012]tree(陈立杰)

    1764. [国家集训队2012]tree(陈立杰) ★★★   输入文件: nt2012_tree.in   输出文件: nt2012_tree.out    简单对比 时间限制:3 s   内存限 ...

  2. [国家集训队2012]电子对撞机nbsp;解题…

    国家集训队2012 电子对撞机(刘洪轩)解题报告 题目: 见http://cogs.pro/cogs/problem/problem.php?pid=1784 Q国最近科学技术不断进步,经过不懈努力, ...

  3. BZOJ2654: tree(陈立杰)

    2654: tree(陈立杰) Time Limit: 30 Sec  Memory Limit: 512 MB Submit: 229  Solved: 91 [Submit][Status] De ...

  4. [国家集训队2012]middle(陈立杰)

    我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午-- 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的--今天又翻了几篇题解才恍然大悟,是把权值 ...

  5. cogs1799 [国家集训队2012]tree(伍一鸣)

    LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...

  6. 数据结构(动态树):[国家集训队2012]tree(伍一鸣)

    [问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...

  7. 最小生成树 tree(陈立杰)

    问题 D: tree 时间限制: 3 Sec 内存限制: 512 MB 提交: 24 解决: 7 [提交][状态][讨论版] 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰 ...

  8. BZOJ2568 [国家集训队2012]比特集合

    Description 比特集合是一种抽象数据类型(Abstract Data Type) ,其包含一个集合S,并支持如下几种操作: INS M : 将元素 M 插入到集合S中: DEL M : 将集 ...

  9. [BZOJ 2654]tree(陈立杰)

    Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ...

最新文章

  1. Java常见的面试算法题:实现两个线程交替打印1到100的数
  2. CentOS系统Yum源配置
  3. 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
  4. matlab vdp1000,第四章 MATLAB的数学运算.ppt
  5. 利用xml+xsl给客户机添加超级管理帐户!
  6. Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
  7. 记录一段让我吐血的代码
  8. 【图像处理】——Python实现图像特征提取BP神经网络实现图像二分类
  9. (二叉树存储+递归遍历)Binary Tree Traversals
  10. Nginx支持WebSocket反向代理-学习小结
  11. av_seek_frame() 定位为什么不准呢?
  12. STM32工作笔记0030---编写跑马灯实验--使用库函数
  13. Python中的各种if语句(if条件判断、if...else、if...elif...else、if...else嵌套)
  14. excel表格如何设置双面打印的方法
  15. python123课后作业嵩天_MOOC嵩天《Python语言程序设计》Python123课后作业4
  16. 小学生C++趣味编程教材
  17. windows下安装nvm教程,nvm use 乱码解决
  18. [一直更新中]WerKeyTom的口胡
  19. mysql 水平分区_MySQL水平分区,垂直分区
  20. AI之NLP:2020年6月21日北京智源大会演讲分享之15:15-15:40黄萱菁教授《自然语言处理中的表示学习》

热门文章

  1. CodePen的使用教程 codepen如何存放自己的代码 codepen存放的代码如何引入到网站里 codepen引入博客页面
  2. AI 教父离职谷歌 ,只为畅谈 AI 之危
  3. 微软将向OpenAI投资10亿美元 同谷歌和亚马逊展开竞争
  4. 支付宝:账号不存在,或对方关闭了“通过手机号或邮箱找到我“隐私开关!怎么解决?
  5. 新手入门百度地图开发的(0,0)坐标问题
  6. IEEE VR 2022
  7. 化学方程式系列( 试 制 品)(挑战密室)
  8. 日志易饶琛琳分享:AI 助力日志中心智能化运营
  9. 《我抽完一条烟也没想明白哪错》(1)DOS命令实现自动关机
  10. predis 操作大全