照例先贴题面(汪汪汪)

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

[BZOJ 2500] 幸福的道路相关推荐

  1. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

  2. 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法

    [BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...

  3. 解题报告 幸福的道路

    1.        题目 幸福的道路(race) [问题描述] 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图 ...

  4. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  5. bzoj 3195 奇怪的道路

    Written with StackEdit. Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方面也不例外.考古学家已经知道,这个文明在全盛时期有\(n\ ...

  6. [BZOJ 2200][Usaco2011 Jan]道路和航线 spfa+SLF优化

    Description Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条 ...

  7. 【bzoj 2435】[Noi2011]道路修建(dfs)

    2435: [Noi2011]道路修建 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3505  Solved: 1167 [Submit][Sta ...

  8. bzoj 2870 最长道路tree——边分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2870 关于边分治:https://www.cnblogs.com/Khada-Jhin/p/ ...

  9. bzoj 2870: 最长道路tree

    orz n+e的题解 显然,将两棵树合并以后,新直径的两个端点一定在原来的两条直径的四个端点中. 画个图就知道了(我竟然没看出来QAQ 于是就可以从大到小枚举最小权,并查集合并了 时间复杂度\(O(n ...

最新文章

  1. C# CreateParams的使用(解决闪屏问题)
  2. Java异常ClassCastException
  3. Source Insight 4.0常用设置
  4. 太阳能板如何串联_太阳能的吸热板是什么
  5. mysql 自定义函数之判断
  6. 多mysql实例下开发需要注意主从同步延迟
  7. Go语言结构体的多字段赋值是并发安全的吗?
  8. 图片维度不匹配_内容审核基础:审核方式、流程与审核维度
  9. delphi连接sql server的字符串2011-10-11 16:07
  10. 计算机二级地15套题答案,计算机二级第15套答案解析.docx
  11. 邓元鋆:AMD的方法论
  12. 支付宝小程序设置服务器维护,支付宝小程序配置
  13. excel根据空格把数据分列
  14. 假设你有8个球,其中一个略微重一些,但是找出这个球的唯一方法是将两个球放在天平上对比。最少要称多少次才能找出这个较重的球?
  15. 【2022-05-31】JS逆向之易企秀
  16. AutoSar之微控制器抽象层MCAL
  17. 华为数据之道(3):面向业务的信息架构建设
  18. 电脑计算机u盘启动不了桌面图标,电脑开机后没有桌面图标
  19. HTTP_Wireshark
  20. 翻阅Windows SDK Samples

热门文章

  1. Sublime text 入门学习资源篇及其基本使用方法
  2. 充实你的素材库!10款免费的 PSD 素材下载
  3. 详解EBS接口开发之采购申请导入
  4. Oracle Stream配置详细步骤
  5. [转载]使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)...
  6. Java并发编程之ThreadGroup
  7. 《黑客秘笈——渗透测试实用指南》—第2章2.3节 外部或内部的主动式信息收集...
  8. 到底什么是API经济
  9. 图片延迟加载和滑动翻页
  10. 音视频多媒体协议相关资料汇总