http://www.elijahqi.win/2018/01/20/bzoj3219/ ‎

Description
Tar国正在准备每年一次的巡游活动。国王将会在一个城市S里召集人群,沿着城市间的道路进行游览,最终在一个城市T里发表他每年一次的著名演讲。
Tar国有N个城市,由于国家的特殊要求,每两个城市之间存在一条唯一的简单通路。
国王希望借着这个机会视察Tar国的城市建设,因此他提出S到T的距离不能少于L条道路。
同时,国王的私人医生检查了他的身体情况后,断定国王的身体不适合做长途旅行,因此他要求S到T的距离不能多于R条道路。
另外,政府希望跟随国王的人民沿途不仅能看到城市风景,还能看到城市外的美丽乡村。因此每条道路定义了一个魅力值Ci,一条路径的魅力值定义为这条路径的中位数。更详细的说法是这样的:
将路径上所有边的魅力值排序,得到序列{Ai}。假设i=2k+c(0<=c<=1),中位数就是A(k+1)。
你的任务就是求出魅力值最大的路径,并输出这个魅力值。
Input
第一行是三个整数N,L,R,表示Tar国的城市个数、路径的最小和最大长度。
接下来N-1行,每行3个整数Ai,Bi,Ci,表示有一条连接Ai和Bi且魅力值Ci的道路。
Output

仅一行,表示最大的魅力值。如果不存在这样的路径,输出-1。
Sample Input
5 1 4

1 2 1

1 3 4

3 4 7

3 5 2

Sample Output
7
HINT

对于100%的数据:N<=100000,1<=L<=R<=N-1,1<=Ci<=1000000000。

Source
树的分治
基本同http://blog.csdn.net/elijahqi/article/details/79094248
注意我每次二分答案之后把大于等于答案的数改成1反之改成-1 如果做到>=0的数我就退出即可 最后验证答案 如果>=0 l=mid+1;else r=mid-1

#include<deque>
#include<cstdio>
#include<algorithm>
#define N 110000
#define inf 0x3f3f3f3f
using namespace std;
inline char gc(){static char now[1<<16],*S,*T;if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}return *S++;
}
inline int read(){int x=0;char ch=gc();while(ch<'0'||ch>'9') ch=gc();while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc();return x;
}
struct node{int y,z,next;
}data[N<<1];
struct node1{int y,size,z;
}qq[N];
int n,L,R,h[N],num,size[N],ff[N],sum,root,dep[N],max1,ans;bool visit[N];
int f[N],g[N],dis[N];
inline void get_root(int x,int fa){size[x]=1;ff[x]=0;for (int i=h[x];i;i=data[i].next){int y=data[i].y;if (visit[y]||y==fa) continue;get_root(y,x);size[x]+=size[y];ff[x]=max(ff[x],size[y]);}ff[x]=max(ff[x],sum-size[x]);if (ff[root]>ff[x]) root=x;
}
inline bool cmp(node1 a,node1 b){return a.size<b.size;}
inline void dfs(int x,int fa,int mid){max1=max(max1,dep[x]);f[dep[x]]=max(dis[x],f[dep[x]]);for (int i=h[x];i;i=data[i].next){int y=data[i].y,z=data[i].z;if (y==fa||visit[y]) continue;dis[y]=dis[x]+(z>=mid?1:-1);dep[y]=dep[x]+1;dfs(y,x,mid);}
}
inline int check(int x,int mid){dep[x]=dis[x]=0;int max_deep=0;int flag=-1;for (int i=1;i<=num;++i){int y=qq[i].y,z=qq[i].z;max1=0;deque<int>q;f[0]=0;g[0]=0;dis[y]=dis[x]+(z>=mid?1:-1);dep[y]=dep[x]+1;dfs(y,x,mid);max_deep=max(max_deep,max1);for (int j=max_deep;j>=L;--j) {while(!q.empty()&&g[j]>g[q.back()]) q.pop_back();q.push_back(j);}for (int j=0;j<=max1;++j){while(!q.empty()&&j+q.front()>R) q.pop_front();if (!q.empty()) if (f[j]+g[q.front()]>=0) {flag=f[j]+g[q.front()];break;}while(!q.empty()&&L-j-1>=0&&g[L-j-1]>g[q.back()]) q.pop_back();q.push_back(L-j-1);}for (int j=0;j<=max1;++j) g[j]=max(g[j],f[j]),f[j]=-inf;if (flag>=0) break;}for (int i=0;i<=max_deep;++i) g[i]=-inf;return flag;
}
inline void solve(int x){if (sum<L) return;visit[x]=1;num=0;for (int i=h[x];i;i=data[i].next){int y=data[i].y,z=data[i].z;if (size[y]>size[x]) size[y]=sum-size[x];qq[++num].size=size[y];qq[num].y=y;qq[num].z=z;}sort(qq+1,qq+num+1,cmp);int l=ans,r=1e9;while(l<=r){int mid=l+r>>1;if (check(x,mid)>=0) l=mid+1;else r=mid-1;}ans=max(r,ans);for (int i=h[x];i;i=data[i].next){int y=data[i].y;if (visit[y]) continue;root=0;sum=size[y];get_root(y,x);solve(root);}
}
int main(){freopen("bzoj3219.in","r",stdin);n=read();L=read();R=read();for (int i=0;i<=n;++i) f[i]=g[i]=-inf;for (int i=1;i<n;++i){int x=read(),y=read(),z=read();data[++num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;data[++num].y=x;data[num].z=z;data[num].next=h[y];h[y]=num;}sum=n;ff[0]=inf;root=0;get_root(1,0);solve(root);printf("%d",ans);return 0;
}

bzoj3219 巡游相关推荐

  1. c语言骑士游历优化算法,骑士游历、骑士巡游(C语言)课程设计.doc

    存档资料 成绩: 华东交通大学理工学院 课 程 设 计 报 告 书 所属课程名称 数据结构 题 目 骑士游历 分 院 专业班级 学 号 学生姓名 黄锦辉 指导教师 2012 年 6月 15 日 目 录 ...

  2. DCIC巡游车与网约车运营特征对比分析-数据读取

    读取代码 由于赛题给定的数据集文件都比较大,文件行数都比较多,如果完全进行读取可会让电脑卡死,内存爆炸: 可以只读取部分文件,读取单个文件完成数分析: 修改字段类型节约空间: 接下来看单个文件和部分文 ...

  3. 第十八届绵竹年画节开幕 大巡游展示清末年画《迎春图》场景

    民众购买年画. 安源 摄 民众购买年画. 安源 摄 中新网绵竹1月28日电 (记者 安源)以"从小年到大年到绵竹过中国年"为主题的第十八届绵竹年画节暨"年画重回春节&qu ...

  4. 中国巡游帆船行业市场供需与战略研究报告

    巡游帆船是一种习惯于在敞开或半封闭的船中逐点航行的船,通常留在陆地上. 巡游帆船市场的企业竞争态势 该报告涉及的主要国际市场参与者有X-Yachts.Warwick Yacht Design.BAVA ...

  5. angular五大服务顺序_双11五折特惠!49.9元抢贵安欢乐世界夜场活动票,五大惊魂大咖点、网红项目女巫塔罗牌占卜,游荡鬼巡游,鬼妆派对~...

    今年最后一个法定节假日 已经结束, 为了刺激大家打起精神好好搬砖, 小编决定给大家讲个鬼故事! ↓↓↓ 狼人,女巫,吸血鬼,骷髅 正在向你走来 - 这个双11你打算怎么过? 怎么鬼混才超值又尽兴? 在 ...

  6. 香港举办首个轮椅花车巡游 特首冀提升香港通达程度

    中新社香港1月19日电 (王姝)"路向四肢伤残人士协会"19日在中环举办首届"花辘look嘉年华",推出轮椅花车巡游.摊位游戏及舞台表演等活动.香港特区行政长官 ...

  7. A城市巡游车与网约车运营特征对比分析—数据读取及统计

    初始化 import pandas as pd import numpy as np# 文件目录,绝对路径 INPUT_PATH = 'G:\DCIC\Data\\'# 文件读取行数 MAX_ROWS ...

  8. A城市巡游车与网约车运营特征对比分析—地图及订单数据统计

    初始化 import pandas as pd import numpy as np import matplotlib.pyplot as plt import folium # 文件目录,绝对路径 ...

  9. 中华巡游 | 第十二届第①天:农业考察,溯梦60、70、80年代

    今天是中华巡游的第一天.孩子们在晓楠老师.刘洁校长的带领下,再一次踏上游览祖国之旅.近期的平原地区,经历了十年一遇的挑战.而我们在享受美好的同时,也要忆苦思甜,体验上一代人的艰辛,才能珍惜现在.承担责 ...

最新文章

  1. Java / Android String.format 的使用
  2. 4.1 ucGUI 图片显示方法
  3. 盘点2015跨境电商:硝烟下的机遇与变革
  4. 合并的表格怎么加横线_excel表格如何在数据之间加横线-在excel里怎么添加单元格横线...
  5. python运算符的分类_python对象——标准类型运算符
  6. vs2008 添加头文件路径
  7. static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
  8. TypeScript 里 interface 和 type 的区别
  9. c mysql安装教程视频_MySQL安装教程 - Windows安装MySQL教程 - 小白式安装MySQL教程 - 青衫慧博客...
  10. 计算机网络与通信思维导图,用思维导图描述5G场景
  11. Word2010使用技巧之四:页眉的另类使用
  12. 如何用DOS命令查看占用某端口的程序及PID号
  13. 2021-09-03相同的树
  14. 常用的NoSQL数据库
  15. Docker删除容器命令
  16. windows 怎么添加环境变量
  17. 51单片机蜂鸣器实验
  18. debian adsl上网
  19. 【UI】关于如何画设计稿(基础篇)
  20. 追本溯源,解密第一性原理(下)

热门文章

  1. Git中tag的作用
  2. 加速数字化转型的2大原因是什么?
  3. 【BZOJ1132】【POI2008】Tro(计算几何)
  4. 数学建模优秀论文(2012年A题树叶的分类)
  5. php中文汉字与16进制编码转换三种方法
  6. PSIM仿真之:仿真时如何修改元件参数值
  7. 指定得文件初始化StreamWriter类得新实例
  8. 抠图专题1:抠出白色陶瓷杯(每天一个PS小项目)
  9. 在Ubuntu下访问Windows共享文件夹
  10. kivy配置Buildozer