51nod 1307 绳子与重物 二分+dfs / 并查集

题目链接:

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307

题意:

题解:

方法一:
因为所有绳子最终组成了1棵树,所以我们可以通过一次DFS,来检测是否有某根绳子下面绑了超过他所能负荷的重量。
具体方法:对每个节点,计算其子树的重量和(包含自身的重量),如果大于能承受的最大重量,则绳子会断,否则不会断。
一次DFS时间复杂度是O(n)的。
既然一次判断的复杂度是O(n)的,并且当绳子第一次断掉后,继续放重物,不会改变绳子断掉的状态(毕竟重物的重量都是正数,没有负数),那么我们可以用二分来做。
二分来求第一次断掉的点,由于二分的复杂度是log(n),一次DFS判断的复杂度是O(n),所以整个算法的复杂度是nlog(n)。
二分经常被用来求解一些具有单调性的问题,这里的单调性就是断掉以后,不会再次变成不断的。

方法二:
我们在DFS的过程中,使用并查集,将子树节点的Root指向当前节点,同时计算子树的总重量。
假如当前节点的承重不足,那么绳子会断掉。所以我们需要去掉一些节点,来保证绳子不断。根据题目要求,我们按照子树节点的编号从高到低,逐个去掉这些重物,直到绳子不断为止。
那么问题来了,并查集这个结构并不能解决按照编号从高到低去掉子树的问题,如果自己维护其他的数据结构(比如堆),恐怕复杂度还要多一个Log。

所以我们跳出按照编号从高到低去掉子树的思路,不如直接从编号N - 1到0去掉子树,直到当前的绳子不断为止。 因为编号小的断了,后面再加的绳子也没有用了,已经有绳子断了就结束了。

代码:

二分:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define MS(a) memset(a,0,sizeof(a))
 5 #define MP make_pair
 6 #define PB push_back
 7 const int INF = 0x3f3f3f3f;
 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
 9 inline ll read(){
10     ll x=0,f=1;char ch=getchar();
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 //
16 const int maxn = 1e5+10;
17 
18 struct node{
19     int c,w,f;
20 }e[maxn];
21 
22 vector<int> g[maxn];
23 
24 bool book;
25 
26 ll dfs(int u,int k){
27     ll sum = e[u].w;
28     if(u > k) return 0;
29     for(auto v : g[u])
30         sum += dfs(v,k);
31     if(sum > e[u].c && u) book = false;
32     return sum;
33 }
34 
35 int main(){
36     int n=read();
37     for(int i=1; i<=n; i++){
38         e[i].c=read(); e[i].w=read(); e[i].f=read(); e[i].f++;
39         g[e[i].f].push_back(i);
40     }
41 
42     int l=0,r=n,ans = 0;
43     while(l<=r){
44         int mid = (l+r)/2;
45         book = true;
46         dfs(0,mid);
47         if(book) ans=mid,l=mid+1;
48         else r=mid-1;
49     }
50 
51     cout << ans << endl;
52 
53     return 0;
54 }

 

并查集:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 #define MS(a) memset(a,0,sizeof(a))
 5 #define MP make_pair
 6 #define PB push_back
 7 const int INF = 0x3f3f3f3f;
 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
 9 inline ll read(){
10     ll x=0,f=1;char ch=getchar();
11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
13     return x*f;
14 }
15 //
16 const int maxn = 1e5+10;
17 
18 struct node{
19     ll c,w,f;
20 }e[maxn];
21 
22 vector<int> g[maxn];
23 int fa[maxn];
24 ll ww[maxn];
25 int k;
26 
27 int find(int x){
28     return fa[x]==x ? x : fa[x]=find(fa[x]);
29 }
30 
31 void update(int u){
32     for(auto v : g[u]){
33         e[u].w += e[v].w;
34         fa[v] = u;
35     }
36 
37     while(e[u].w > e[u].c){
38         e[find(k)].w -= ww[k];
39         k--;
40     }
41 }
42 
43 int main(){
44     int n=read();
45     for(int i=1; i<=n; i++){
46         e[i].c=read(); e[i].w=read(); e[i].f=read(); e[i].f++;
47         g[e[i].f].push_back(i); ww[i] = e[i].w;
48         fa[i] = i;
49     }
50 
51     k = n;
52     for(int i=n; i>0; i--)
53         update(i);
54 
55     cout << k << endl;
56 
57     return 0;
58 }

 

转载于:https://www.cnblogs.com/yxg123123/p/6827576.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#中string.Concat方法的使用

string.Concat方法用于连接string的一个或多个实例&#xff0c;或string的一个或多个实例的object表示形式 https://docs.microsoft.com/zh-cn/dotnet/api/system.string.concat?viewnet-5.0 1&#xff09;连接string[]或object[]数组中的元素 using System; using System.C…

将java项目做成app_将鸿蒙做成和EMUI一致,又兼容安卓APP,华为已立于不败之地...

自从华为的系统曝光以来&#xff0c;每天都有众多的网友为其摇旗呐喊&#xff0c;说不管怎么时候推出&#xff0c;甚至就算不好用&#xff0c;都无条件支持&#xff0c;说如果连自己人都不支持&#xff0c;就不可能成功了。但近日&#xff0c;随着网上曝光华为鸿蒙系统的的相关…

[APIO2016]

2016的题貌似是韩国棒子出的&#xff0c;好丧啊.... 看了题解还想了好久...... ------------------------------------------------- A.Boat 有n个数&#xff0c;每个数字可取[li,ri]内的任意整数si&#xff0c;但是要求对于任意i<j,都有si<sj&#xff0c;求方案数 n<…

C# 使用StackFrame和StackTrace类 获取当前函数名,当前代码行,源代码文件

https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stackframe?viewnetframework-3.0 https://docs.microsoft.com/zh-cn/dotnet/api/system.diagnostics.stacktrace?viewnetframework-3.0 测试代码如下&#xff1a; using System; using System.Collections…

华为鸿蒙系统智能手机_余承东再度确认:鸿蒙系统将适配到华为手机上

近期余承东承认华为芯片不够用&#xff0c;麒麟芯片也将在9月15日暂时停产&#xff0c;华为麒麟芯片或将成为绝唱已经确定为事实&#xff0c;这显然是有点遗憾的事情&#xff0c;不过华为也有好消息传来&#xff0c;那就是余承东再度确认鸿蒙系统将适配到手机上&#xff0c;具体…

2017-03-16 Codeforces 453A 概率期望,思维 UOJ 228(待补)

Codeforces 453A A. Little Pony and Expected Maximum 题意&#xff1a;一个m面质地均匀的骰子&#xff0c;每面出现的概率都是独立的1/m, 你需要投掷n次&#xff0c;其结果是这n次出现的最大点数。问投掷n次骰子的结果的期望值是多少&#xff0c;要求相对误差或绝对误差不…

C#多线程时对同一资源加锁实现互斥访问

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; //using System.Diagnostics;namespace 多线程 {#region 我的程序class ResultCount{public static int PassNumber { get; s…

vuex的命名空间有哪些_Vue 3 带来的 Vuex 的替代方案

一、前言就像是 React 社区在 HOOK API 出现后很快就使用 useReducer、useContext 代替了 Redux 进行状态管理一样。Vue3 也是时候抛弃 Vuex 进行状态管理了。在考虑为什么要抛弃 Vuex 之前&#xff0c;我们先来想一下为什么要引入 Vuex&#xff1f;Vuex 实际上解决的问题是「组…

GO语言安装配置

原文链接http://www.cnblogs.com/zsy/p/5215336.html转载于:https://www.cnblogs.com/zjdeblog/p/6605364.html

C# Task异步编程

1、不适用异步的示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Net; using System.Diagnostics;namespace ConsoleApplication1 {class MyDownloadStrin…

人形图案c语言程序_最多 280 字符,你能用 Basic 玩出哪些花样程序来?

(给程序员的那些事加星标)转自&#xff1a;机器之心【导读】&#xff1a;推特与计算机能擦出什么样的火花呢&#xff1f;大多数人可能就想到在计算机上发推特呗。但是&#xff0c;有人就不这么想。酷爱计算机演进史和推特的 Dominic Pajak 创建了 BBC Micro Bot&#xff0c;它能…

???--???二进制变换

题意 &#xff1a; 定义两种变换 1 &#xff1a; i i - 1 2 &#xff1a; i i - lowbit (i) 定义函数Calc(i,j)为二进制意义下 i 变换到 j 的最小步数。 给你一个二进制整数 n&#xff0c;要求 sigma {(i 1 -> n) sigma {(j 0 -> i - 1) Calc (i,j)}} 数据范围 : 令…

C# 派生类的构造函数

假定没有为任何类定义任何显式的构造函数,这样编译器就会为所有的类提供默认的初始化构 造函数,在后台会进行许多操作,但编译器可以很好地解决类的层次结构中的所有问题,每个类中 的每个字段都会初始化为对应的默认值。但在添加了一个我们自己的构造函数后,就要通过派生类 的层…

js 获取url问号前_PHP获取指定网页的HTML代码并执行输出

PHP获取指定网页的HTML代码并执行输出&#xff0c;这个方法主要是将所要或取目标的URL地址的网站中获取相关内容到自己的网页中。代码如下&#xff1a;<?php $srcurl "所要截取目标的URL地址"; $handle fopen($srcurl,"rb"); $content fread($handl…

AD16画线时如何切换90°、45°、任意角度画线模式

在绘图界面选择画线后&#xff0c;使用“shift空格”可切换不同的画线模式。切换过程中会有90模式、45度模式、任意角度模式等&#xff0c;在这些模式中可使用空格键在进行细分切换。 1、90模式 2、45模式 3、任意模式

1200兆路由器网速_如何选购路由器才能发挥宽带的网速?

很多人多少都会遇到家里宽带网速慢的时候&#xff0c;家中明明是光纤宽带&#xff0c;可是网速却没有想象中的那么快&#xff1f;尤其是宽带的带宽升级到100M、200M、500M的时候&#xff0c;感觉跟没有提速一样。也许你家的路由器该换新啦&#xff01;那么&#xff0c;想要选购…

C# 静态类

------《C#高级编程》第7版

学习曾国藩,学做人做事学技术

三个字&#xff1a;诚、勤、恒早期&#xff1a; 早起、耐烦、有恒 语录&#xff1a;不日进&#xff0c;就日退 语录&#xff1a;拙看似慢&#xff0c;实则最快&#xff01; &#xff08;反思学技术&#xff1f;&#xff09; 语录&#xff1a; 决定成败的&#xff0c;不在高处…

vant实现下拉刷新和上拉加载_微信小程序 - 实现下拉刷新、上拉加载

在小程序开发中使用下拉刷新和上拉加载非常多&#xff0c;比如常用的展示型首页&#xff0c;而实现这个功能有两种形式&#xff0c;第一种是使用 scroll-view 组件&#xff0c;第二种是不使用 scroll-view 组件而让整个页面刷新&#xff0c;那就分别都在此简单分享下。方法一在…

经验证过的跨线程更新辅助类MyInvokeHelper

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; using System.Windows.Forms;namespace Extension.MyDll {/// <summary>/// 辅助类&#xff1a;跨线程更新控件/// &l…