[BZOJ 2500] 幸福的道路

照例先贴题面(汪汪汪)

2500: 幸福的道路

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 368  Solved: 145
[Submit][Status][Discuss]

Description

小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光.
他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图.
他们不愿枯燥的每天从同一个地方开始他们的锻炼,所以他们准备给起点标号后顺序地从每个起点开始(第一天从起点一开始,第二天从起点二开始……). 而且他们给每条道路定上一个幸福的值.很显然他们每次出发都想走幸福值和最长的路线(即从起点到树上的某一点路径中最长的一条).
他们不愿再经历之前的大起大落,所以决定连续几天的幸福值波动不能超过M(即一段连续的区间并且区间的最大值最小值之差不超过M).他们想知道要是这样的话他们最多能连续锻炼多少天(hint:不一定从第一天一直开始连续锻炼)?
现在,他们把这个艰巨的任务交给你了!

Input

第一行包含两个整数N, M(M<=10^9).
第二至第N行,每行两个数字Fi , Di, 第i行表示第i个节点的父亲是Fi,且道路的幸福值是Di.

Output

最长的连续锻炼天数

Sample Input

3 2
1 1
1 3

Sample Output

3
数据范围:
50%的数据N<=1000
80%的数据N<=100 000
100%的数据N<=1000 000
对于这道题来说我们可以考虑预处理出每个结点的最长路径长然后乱搞
对于预处理我在考场上写了个对于每个结点DFS一遍求最长,然后$std::set$维护最大最小值,总时间复杂度瓶颈为预处理$O(n^2)$
实际上我们可以先求这个树的直径结点,然后从分别从两个直径结点进行DFS并取最大值来预处理出最长路径长。直径为树中最长的一条路径。这一过程需要固定的4遍DFS所以时间复杂度$O(n)$
考场上鬼使神差地脑抽认为求直径会有反例
然后就是求最长连续区间的问题,我的策略是建立左右两个哨兵,采用一直让右哨兵前进并更新最大值直至最大最小值超过限制条件,超限之后采用不断删除左哨兵的值并前进直至符合条件的贪心策略。因为$std::set$的插入与查询是$O(logn)$,每个点肯定要插入/删除一次所以贪心过程时间复杂度$O(nlogn)$,总时间复杂度$O(nlogn)$
这里其实还可以使用单调队列,但是因为单调队列要固定区间长度所以只能采取二分长度策略,总时间复杂度也是$O(nlogn)$。
然后袋马时间:
GitHub
 1 #include <set>
 2 #include <cstdio>
 3 #include <algorithm>
 4 
 5 const int MAXE=2000010;
 6 const int MAXV=1000010;
 7 
 8 struct Edge{
 9     int from;
10     int to;
11     int dis;
12     Edge* next;
13 };
14 Edge E[MAXE];
15 Edge* head[MAXV];
16 Edge* top=E;
17 
18 int n;
19 int m;
20 int lg1;
21 int lg2;
22 int dis[MAXV];
23 
24 void Initialize();
25 std::pair<int,int> DFS(int,int,int);
26 void DFSA(int,int,int);
27 void Insert(int,int,int);
28 int Sweep();
29 
30 int main(){
31     Initialize();
32     lg1=DFS(1,0,0).second;
33     lg2=DFS(lg1,0,0).second;
34     DFSA(lg1,0,0);
35     DFSA(lg2,0,0);
36     printf("%d\n",Sweep());
37     // printf("%d %d\n",lg1,lg2);
38     return 0;
39 }
40 
41 std::pair<int,int> DFS(int root,int prt,int dis){
42     std::pair<int,int> ans(dis,root);
43     for(Edge* i=head[root];i!=NULL;i=i->next){
44         if(i->to==prt)
45             continue;
46         ans=std::max(ans,DFS(i->to,root,dis+i->dis));
47     }
48     return ans;
49 }
50 
51 void DFSA(int root,int prt,int dis){
52     ::dis[root]=std::max(::dis[root],dis);
53     for(Edge* i=head[root];i!=NULL;i=i->next){
54         if(i->to==prt)
55             continue;
56         DFSA(i->to,root,dis+i->dis);
57     }
58 }
59 
60 int Sweep(){
61     int l=1,r=1,ans=0;
62     // std::priority_queue<int,std::vector<int>,std::less<int>> qmax;
63     // std::priority_queue<int,std::vector<int>,std::greater<int>> qmin;
64     std::multiset<int> s;
65     while(r<=n){
66         // printf("%d\n",r);
67         s.insert(dis[r]);
68         while(*(--s.end())-*s.begin()>m){
69             s.erase(s.find(dis[l]));
70             ++l;
71         }
72         ans=std::max(ans,int(s.size()));
73         ++r;
74     }
75     return ans;
76 }
77 
78 void Initialize(){
79     int a,b;
80     scanf("%d%d",&n,&m);
81     for(int i=2;i<=n;i++){
82         scanf("%d%d",&a,&b);
83         Insert(a,i,b);
84         Insert(i,a,b);
85     }
86 }
87 
88 inline void Insert(int from,int to,int dis){
89     top->to=to;
90     top->dis=dis;
91     top->from=from;
92     top->next=head[from];
93     head[from]=top;
94     top++;
95 }
Backup

以及图包时间

 

转载于:https://www.cnblogs.com/rvalue/p/7191518.html

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

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

相关文章

你手上的PCB怎么制作的?几张动图揭晓工厂生产流程

在PCB出现之前&#xff0c;电路是通过点到点的接线组成的。这种方法的可靠性很低&#xff0c;因为随着电路的老化&#xff0c;线路的破裂会导致线路节点的断路或者短路。绕线技术是电路技术的一个重大进步&#xff0c;这种方法通过将小口径线材绕在连接点的柱子上&#xff0c;提…

linux开发板作为蓝牙音箱,USB 蓝牙适配器在ARM 开发板下的使用

4、可能出现的问题和解决方案&#xff1a;4.1 编译dbus 时出现&#xff1a;1checking for accept4... yeschecking abstract socket namespace... nochecking for pkg-config... (cached) /usr/local/bin/pkg-configchecking pkg-config is at least version 0.9.0... yescheck…

细丝极恐的华为251事件

事情的来龙去脉我就不再详细描述了&#xff0c;我提几个问题点&#xff0c;觉得有点疑惑&#xff0c;也是自己对这个事件的看法。1、李洪元于2005年入职华为&#xff0c;2018年1月离职&#xff0c;在2016年11月21日向公司的投诉邮箱发了一份匿名邮件&#xff0c;至于发邮件的东…

mysql set语句_mysql--乱码解决(6)

1.字符集介绍mysql数据库字符集包括字符集(character)和校对规则(collation)两个概念&#xff0c;其中字符集是用来定义mysql数据字符串的存储方式&#xff0c;而校对规则则是定义比较字符串的方式。2.常见字符集3.解决中文乱码思想&#xff1a;保持linux、服务端、库、表、客户…

C 语言,你真的懂递归了吗?

什么是递归&#xff1f;要说到递归如果不说栈的话&#xff0c;我觉得有点不合适&#xff0c;递归特点就是不断的调用同一个函数&#xff0c;如果这个函数没有一个递归界限&#xff0c;那么就是死循环了&#xff0c;所以讨论递归&#xff0c;就必须要讨论递归的界限&#xff0c;…

github page hexo博客gitee_利用Github和hexo搭建个人免费博客

利用Github和hexo搭建个人免费博客详细过程&#xff1a;概述&#xff1a;详细的介绍了利用github和hexo搭建免费的博客&#xff0c;内容详细&#xff0c;浅显易懂&#xff0c;容易上手&#xff0c;大家一起进来看看吧&#xff01;1、配置Github相关操作&#xff1a;​ ①新建一…

漫画:三种 “奇葩” 的排序算法

在算法的世界里&#xff0c;有许多高效率的排序算法&#xff0c;比如快速排序、归并排序、桶排序......它们大大提高了程序的性能。但是&#xff0c;也有一些比较奇葩的排序算法&#xff0c;它们既不能做到高效率&#xff0c;也没有很好的可读性。那它们存在的意义是什么呢&…

常用c语言小程序,c语言经典小程序汇总大全

网上有很多的人说编程有多么多么无聊&#xff0c;其实&#xff1a;不要管别人怎么说&#xff0c;别人说什么&#xff0c;做你自己喜欢做的事就好。坚持下来&#xff0c;你会发现编程的乐趣的。当然&#xff0c;如果你觉得学习编程语言很痛苦&#xff0c;坚持了一段时间后无果&a…

opencv 二值化_Python-OpenCV获取图像轮廓的图像处理方法

一、引言在《OpenCV阈值处理函数threshold处理32位彩色图像的案例》介绍了threshold 函数&#xff0c;但threshold 的图像阈值处理对于某些光照不均的图像&#xff0c;这种全局阈值分割的方法并不能得到好的效果。图像阈值化操作中&#xff0c;我们更关心的是从二值化图像中分离…

让你不再害怕指针.pdf

今天推荐一本书&#xff0c;是讲解指针的&#xff0c;C 语言理解指针应该算一个重点&#xff0c;也算是一个难点&#xff0c;这个pdf 文章总结非常好&#xff0c;推荐给大家。想获取书籍Pdf的同学&#xff0c;请在公众号后台回复 「指针」&#xff0c;希望这本书籍让你们不再害…

revit如何根据坐标进行画线_在工程设计中如何根据工艺阀门的结构与特点来进行设计呢?...

在工程设计的实践中发现&#xff0c;因为阀门的种类繁多&#xff0c;每种阀门都有自己的特点&#xff0c;工程设计人员&#xff0c;尤其年轻的设计者由于不太了解阀门的结构和特点往往选错阀门&#xff0c;造成设计失误。系统的了解阀门&#xff0c;对工程设计人员(不是阀门设计…

c语言中二维数组中产生随机数,C语言中是如何进行随机数生成的[多图]

C语言中是如何进行随机数生成的.C语言是编程人员经常会到的一款计算机编程语言,有的朋友想知道怎样使用C语言进行随机数生成,那么就快随小编一起来看看这篇C语言中是如何进行随机数生成的吧!其中不仅为大家介绍了生成随机数的函数,还提供了测试代码!同时为大家附带了随机数字生…

一文带你了解V4L2

1、什么是v4l2V4L2&#xff08;Video4Linux的缩写&#xff09;是Linux下关于视频采集相关设备的驱动框架&#xff0c;为驱动和应用程序提供了一套统一的接口规范。V4L2支持的设备十分广泛&#xff0c;但是其中只有很少一部分在本质上是真正的视频设备&#xff1a;•Video captu…

Linux 僵尸进程可以被杀死吗?

在 Unix 进程模型中&#xff0c;父进程和其所产生的子进程是异步运行的&#xff0c;所以如果子进程在结束后&#xff0c;会留下一些信息需要父进程使用 wait / waitpid 来接收。而如果父进程太忙了&#xff0c;没有调用 wait / waitpid 的话&#xff0c;子进程就会变成…

jstl 获取 javascript 定义的变量_前端开发大牛完整总结出了JavaScript 难点 +最新web前端开发教程...

1. 立即执行函数立即执行函数&#xff0c;即Immediately Invoked Function Expression (IIFE)&#xff0c;正如它的名字&#xff0c;就是创建函数的同时立即执行。它没有绑定任何事件&#xff0c;也无需等待任何异步操作&#xff1a;立即执行函数function(){…}是一个匿名函数&…

MySQL 5.6.20-enterprise-commercial的参数文件位置问题

今天在折腾MySQL的参数文件时&#xff0c;突然发现MySQL 5.6.20-enterprise-commercial-advanced-log这个版本数据库的参数文件my.cnf的位置有点奇怪&#xff0c;如下所示&#xff1a; [rootDB-Server ~]# mysql --help | grep my.cnforder of preference, my.cnf, $MYSQL_TCP_…

最害怕的是,不知道想要什么

生活在现在的时代&#xff0c;你要是出去吹牛说你与世无争&#xff0c;你看破红尘&#xff0c;你就想开心上班啥也不图&#xff0c;别人要不以为你是一个傻子&#xff0c;要不就以为你是一个家财万贯的主&#xff0c;特别是现在&#xff0c;从2015年开始&#xff0c;房价像吃了…

c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump...

目录- C语言源码文件&#xff1a;sum.c- gcc 生成的汇编语言文件 sum.sx86-64 AT&T 语法格式x86-64 Intel格式- 反汇编 objdump3.1 输出 AT&T格式 objdump -d sum3.2 输出 Intel格式 objdump -M intel -d sumC语言源码文件&#xff1a;sum.c加法&#xff1a;c a b#in…

diff算法_详解 React 16 的 Diff 策略

这是我 Deep In React 系列的第二篇文章&#xff0c;如果还没有读过的强烈建议你先读前一篇&#xff1a;详谈 React Fiber 架构(1)。前言我相信在看这篇文章的读者一般都已经了解过 React 16 以前的 Diff 算法了&#xff0c;这个算法也算是 React 跨时代或者说最有影响力的一点…

实力剖析一个经典笔试题

昨天群里有个同学发了这样一个题目过来&#xff0c;这个题目应该是嵌入式笔试经典题目了&#xff0c;如果是校招的话&#xff0c;笔试不考这个题目&#xff0c;都觉得有点说不过去。#include <stdio.h>int main() {int a[5] {1,2,3,4,5};int *ptr1 (int *)(&a 1);i…