5771. 【NOIP2008模拟】遨游
Description
此时恰逢春运期间,S国交通运输局采取了优惠措施。当一条路的路费在[L..R]区间时,可免去。同时,每个省也有优惠措施,第i个省内的每条道路路费收其Xi%,连接第i个省和第j个省的每条道路路费收其(Xi%+Xj%)/2。
MWH想从城市s走到城市t,请求出一对L,R,确保:
- MWH能免费到达目的地;
- L≤R;
- L、R均为整数;
- L尽可能地大,R在满足L最大的前提下最小。
注意:因每条道路由各省的交通运输局直接管辖,所以每条道路的路费必须先得到省级优惠,再得到国家级优惠。
Input
接下来M行,每行三个整数,u、v、w,表示连接u、v的道路需收费w。
接下来N行,第i+M+1行有一个整数Ti,后面Ti个整数,分别是Ci1..CiTi(所有城市编号保证按正整数顺序给出1.. Ti)。
下一行N个整数X1..Xi。
最后一行,两个整数,s、t。
Output
Solutions
对于题目描述中既有“最大”又有“最小”的题目,很多都是用二分,这题也不例外。
首先,省级路费是很容易算且是独立的,所以预处理出每条道路经过了省级优惠后是多少路费。
接着,这题要用到二分嵌套。第一层是二分L(l,r,mid),第二层是二分R(l1,r1,mid1),中间要做一次搜索。把所有在[L..R]区间内的边取出,做一遍搜索,如果能到达目的地则记录mid1,并将r1改小,否则将l1改大。第一重二分中如果能取到mid1则记录下mid与mid1,并将l1改大,否则将r1改小。
代码
1 type 2 arr=record 3 y,next:longint; 4 w:real; 5 end; 6 var 7 n,m,nm,qq,zz,maxl,maxr:longint; 8 a:array [0..400001] of arr; 9 ls,list,v,bo:array [0..400001] of longint; 10 b,bz:array [0..50001] of longint; 11 12 procedure add(x,y:longint;z:real); 13 begin 14 inc(nm); 15 a[nm].y:=y; a[nm].w:=z; 16 a[nm].next:=ls[x]; ls[x]:=nm; 17 end; 18 19 procedure init; 20 var 21 i,j,t,k:longint; 22 x,y:array [0..200001] of longint; 23 z:array [0..200001] of real; 24 begin 25 readln(n,m); 26 nm:=0; 27 for i:=1 to m do 28 readln(x[i],y[i],z[i]); 29 for i:=1 to n do 30 begin 31 read(t); 32 for j:=1 to t do 33 begin 34 read(k); 35 b[k]:=i; 36 end; 37 end; 38 for i:=1 to n do 39 read(bz[i]); 40 readln(qq,zz); 41 for i:=1 to m do 42 begin 43 if b[x[i]]=b[y[i]] then z[i]:=z[i]*bz[b[x[i]]]/100 44 else z[i]:=z[i]*(bz[b[x[i]]]+bz[b[y[i]]])/200; 45 add(x[i],y[i],z[i]); 46 add(y[i],x[i],z[i]); 47 end; 48 end; 49 50 function max(o,p:real):real; 51 begin 52 if o>p then exit(o); 53 exit(p); 54 end; 55 56 function min(o,p:real):real; 57 begin 58 if o<p then exit(o); 59 exit(p); 60 end; 61 62 function bfs1(ll:longint):boolean; 63 var 64 i,j,k,h,t:longint; 65 begin 66 fillchar(bo,sizeof(bo),0); 67 fillchar(v,sizeof(v),0); 68 fillchar(list,sizeof(list),0); 69 h:=0; t:=1; 70 v[qq]:=1; list[1]:=qq; bo[qq]:=1; 71 repeat 72 h:=h+1; 73 j:=ls[list[h]]; 74 while j<>0 do 75 begin 76 with a[j] do 77 begin 78 if w-ll>=0 then 79 begin 80 if bo[y]=0 then 81 begin 82 bo[y]:=1; 83 if v[y]=0 then 84 begin 85 t:=t+1; 86 list[t]:=y; 87 v[y]:=1; 88 end; 89 end; 90 end; 91 j:=next; 92 end; 93 end; 94 v[list[h]]:=0; 95 until h=t; 96 if bo[zz]=1 then exit(true) 97 else exit(false); 98 end; 99 100 function bfs2(ll:longint):boolean; 101 var 102 i,j,k,h,t:longint; 103 begin 104 fillchar(bo,sizeof(bo),0); 105 fillchar(v,sizeof(v),0); 106 fillchar(list,sizeof(list),0); 107 h:=0; t:=1; 108 v[qq]:=1; list[1]:=qq; bo[qq]:=1; 109 repeat 110 h:=h+1; 111 j:=ls[list[h]]; 112 while j<>0 do 113 begin 114 with a[j] do 115 begin 116 if (ll-w>=0) and (w-maxl>=0) then 117 begin 118 if bo[y]=0 then 119 begin 120 bo[y]:=1; 121 if v[y]=0 then 122 begin 123 t:=t+1; 124 list[t]:=y; 125 v[y]:=1; 126 end; 127 end; 128 end; 129 j:=next; 130 end; 131 end; 132 v[list[h]]:=0; 133 until h=t; 134 if bo[zz]=1 then exit(true) 135 else exit(false); 136 end; 137 138 procedure main; 139 var 140 l,r,mid:longint; 141 begin 142 l:=0; r:=maxlongint div 30; 143 while l<=r do 144 begin 145 mid:=(l+r) div 2; 146 if bfs1(mid) then 147 begin 148 maxl:=mid; l:=mid+1; 149 end else r:=mid-1; 150 end; 151 l:=0; r:=maxlongint div 30; 152 while l<=r do 153 begin 154 mid:=(l+r) div 2; 155 if bfs2(mid) then 156 begin 157 maxr:=mid; r:=mid-1; 158 end else l:=mid+1; 159 end; 160 writeln(maxl,' ',maxr); 161 end; 162 163 begin 164 assign(input,'trip.in'); 165 assign(output,'trip.out'); 166 reseT(input); 167 rewrite(output); 168 init; 169 main; 170 close(input); 171 close(output); 172 end.
转载于:https://www.cnblogs.com/zyx-crying/p/9445166.html
5771. 【NOIP2008模拟】遨游相关推荐
- JZOJ5776. 【NOIP2008模拟】小x游世界树
题目:[NOIP2008模拟]小x游世界树: 题目的附加题解给的很清楚,这里只给一个代码: 1 #include<iostream> 2 #include<cstdio> 3 ...
- JZOJ 5776. 【NOIP2008模拟】小x游世界树
5776. [NOIP2008模拟]小x游世界树 (File IO): input:yggdrasil.in output:yggdrasil.out Time Limits: 1500 ms M ...
- 5793. 【NOIP2008模拟】小S练跑步
Description 小S是一个爱锻炼的孩子,他在放假期间坚持在A公园练习跑步. 但不久后,他就开始为在重复的地点练习感到厌烦了,他就打算去B公园跑步. 但是小 ...
- [jzoj 5775]【NOIP2008模拟】农夫约的假期 (前缀和+递推)
传送门 Description 在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为"魔音"······ 农夫约也有自己的假期呀!他要 ...
- 【JZOJ 5776】【NOIP2008模拟】小x游世界树 (树)
问题描述 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当他想前往阿瓦隆时发现那里只有圣诞节时才能到达,然而现在已经春天了, ...
- [jzoj5791]【NOIP2008模拟】阶乘 (数学)
传送门 Description 有n个正整数a[i],设它们乘积为p,你可以给p乘上一个正整数q,使p*q刚好为正整数m的阶乘,求m的最小值. Input 共两行. 第一行一个正整数n. 第二行n个正 ...
- JZOJ 5775. 【NOIP2008模拟】农夫约的假期
文章目录 题目: 分析: 代码: 题目: 传送门 分析: 首先,关于这道题,有个很巧妙的ACACAC方法:在AJAJAJ没出数据前,机智的提交,即可用returnreturnreturn 000成功A ...
- 【数论】基础数论概念
基础数论概念 首先我们来回顾一下基础数论中关于整数集Z={-,-2,-1,0,1,2,-}和自然数集N={0,1,2,3,4,-}的一些概念. 整除性与约数 一个整数可以被另一个整数整除是数论中的一个 ...
- 【模拟】【NOIP2008】笨小猴 word
笨小猴 (word.pas/c/cpp) [问题描述] 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法 ...
最新文章
- [转]iOS 远程推送(APNs)
- 微信小程序——tab切换内容
- linux程序设计百度网盘,linux系统编程视频 百度网盘下载
- Mybatis中的一级缓存
- LeetCode 272. 最接近的二叉搜索树值 II(栈+优先队列)
- codevs1085数字游戏(环形DP+划分DP )
- 如何在请求转发的时候对url解码_Java技术分享:Forward和Redirect这两种转发方式的区别...
- 【细节实现题】LeetCode 8. String to Integer (atoi)
- 113. cURL 简介(1)
- python多线程操作数据库问题
- win98访问win7方法
- mysql 多选数据类型_【多选题】Mysql定点数数据类型包括( )。【本题2项正确】...
- 初用mescroll-uni
- 磁珠 符号_电子元件磁珠该如何使用呢?
- 【阿里云】Apsara Clouder云计算专项技能认证-云服务器ECS入门,考试真题分享
- 用ps制作android日历步骤,绘制一枚日历图标【PS教程】
- 创业公司如何设计合伙人股权的进入和退出机制
- 笔记本电脑开启和关闭自带键盘(Win10)
- CSS-justify-content 属性
- AWS re:Invent 2018 参会攻略
热门文章
- 【java下午茶系列】java三重奏之封装
- 各类web服务器 http access log获取用户和代理ip
- 一句SQL实现获取自增列操作
- r语言将百分数化为小数_如何将数字格式化为R中的百分比?
- python处理teradata数据库_Teradata数据库——你需要了解的基础知识
- 比较好的电脑系统_win10电脑系统选择什么版本比较好
- js 将二进制流html导出excel,js 实现纯前端将数据导出excel
- mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)
- mysql慢查询日志平时开启吗_MySQL开启慢查询日志功能的方法
- ViSP视觉库中实现AprilTag的方法