【JZOJ4893】【NOIP2016提高A组集训第15场11.14】过河
题目描述
数据范围
解法
由于同一个点,同一个圆盘最多只会走一次。
把(i,j)当作一个点,表示第i个点,放第i个圆盘。
那么就可以使用最短路。
时间复杂度为O(n4∗k)。
事实上存在冗余圆盘,一个相对某个圆盘又贵又小的圆盘即是冗余圆盘。
给圆盘排序,那么令(i,j)只给(k,l)连一条边使得l最小,(i,j)给(i,j+1)连一条边。
那么任意一条原图中的边就可以分解为上述两类边。
那么边数就降到n3。
spfa的时间复杂度为O(n3∗k)。
如果使用dijstra的时间复杂度为O(n3∗logn)。
代码
Const
maxn=257;
Type
longint=cardinal;
Var
t,n,m,w,i,j,k,l:cardinal;
dis:array[1..maxn,1..maxn] of longint;
bz:array[1..maxn,1..maxn] of boolean;
a:array[1..maxn,0..1] of longint;
b:array[0..maxn,0..1] of longint;
c:array[0..maxn*maxn*maxn,0..1] of word;
ban:array[1..maxn] of boolean;
d:array[0..maxn] of longint;
head,tail:longint;
ans:longint;
path:array[1..maxn,1..maxn,1..maxn] of word;
fi:array[1..maxn,1..maxn] of longint;
la:array[1..maxn*maxn*maxn] of longint;
ne:array[1..maxn*maxn*maxn] of longint;
cnt,tot:longint;
x,y,z:longint;
Function min(a,b:longint):longint;
begin
if (a>b) then exit(b);
exit(a);
end;
Procedure add_line(a,b,c:longint);
begin
inc(tot);
ne[tot]:=fi[a][b];
la[tot]:=c;
fi[a][b]:=tot;
end;
Procedure add(x,y,z:longint);
begin
if (dis[x][y]>z) then
begin
dis[x][y]:=z;
if (z<ans) and (bz[x][y]=false) then
begin
inc(tail);
c[tail][0]:=x;
c[tail][1]:=y;
bz[x][y]:=true;
if (head<tail) and (dis[c[head+1][0]][c[head+1][1]]>dis[c[tail][0]][c[tail][1]]) then
begin
c[0]:=c[tail];
c[tail]:=c[head+1];
c[head+1]:=c[0];
end;
end;
end;
end;
Procedure qsort(l,r:longint);
var
i,j,k,mid,mm,tmp:longint;
begin
i:=l;
j:=r;
mid:=b[(l+r) div 2][0];
repeat
while (b[i][0]<mid) do inc(i);
while (b[j][0]>mid) do dec(j);
if (i<=j) then
begin
b[0]:=b[i];
b[i]:=b[j];
b[j]:=b[0];
dec(j);
inc(i);
end;
until i>j;
if (i<r) then qsort(i,r);
if (l<j) then qsort(l,j);
end;
Function judge(i,j,k,l:longint):boolean;
begin
exit(int64(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1])<=int64(b[l][0]+b[k][0])*(b[l][0]+b[k][0]));
end;
Procedure extreme;
begin
qsort(1,m);
for i:=1 to n do
for j:=1 to n do
begin
l:=1;
for k:=m downto 1 do
begin
while (l<=m) do
begin
if (judge(i,j,k,l)) then
begin
path[i][k][j]:=l;
break;
end
else inc(l);
end;
if (path[i][k][j]>0) then add_Line(i,k,j);
end;
end;
end;
Procedure spfa;
var
i,j,k:cardinal;
Begin
while (head<tail) do
begin
inc(head);
if (c[head][1]<m) then
begin
add(c[head][0],c[head][1]+1,dis[c[head][0]][c[head][1]]+b[c[head][1]+1][1]-b[c[head][1]][1]);
end;
k:=fi[c[head][0]][c[head][1]];
while (k>0) do
begin
i:=la[k];
j:=path[c[head][0]][c[head][1]][i];
add(i,j,dis[c[head][0]][c[head][1]]+b[j][1]);
k:=ne[k];
end;
if (a[c[head][0]][1]+b[c[head][1]][0]>=w) then ans:=min(dis[c[head][0]][c[head][1]],ans);
bz[c[head][0]][c[head][1]]:=false;
end;
End;
Procedure prepare;
begin
readlN(n,m,w);
for i:=1 to n do
begin
readln(a[i][0],a[i][1]);
end;
for i:=1 to m do
begin
readln(b[i][0],b[i][1]);
end;
fillchar(ban,sizeof(ban),0);
for i:=1 to m do for j:=i+1 to m do
if (b[i][0]>=b[j][0]) and (b[i][1]<=b[j][1]) then ban[j]:=true
else if (b[i][0]<=b[j][0]) and (b[i][1]>=b[j][1]) then ban[i]:=true;
d[0]:=0;
for i:=1 to m do if (ban[i]=false) then
begin
inc(d[0]);
d[d[0]]:=i;
end;
for i:=1 to d[0] do b[i]:=b[d[i]];
m:=d[0];
fillchar(dis,sizeof(dis),127);
fillchar(path,sizeof(path),0);
fillchar(fi,sizeof(fi),0);
tot:=0;
head:=0;
tail:=0;
ans:=maxlongint;
extreme;
for i:=1 to n do
for j:=1 to m do
begin
if (b[j][0]>=a[i][1]) then
begin
add(i,j,b[j][1]);
break;
end;
end;
end;
Procedure getans;
begin
if (ans<2000000000) then writeln(ans)
else writeln('impossible');
end;
Begin
assign(input,'river.in');reset(input);
assign(output,'river.out');rewrite(output);
readln(t);
for t:=1 to t do
begin
prepare;
spfa;
getans;
end;
//writeln(cnt);
close(output);close(input);
End.
启发
去除冗余
差分
本题中:原图共有n4,考虑到如果(i,j)可以到达(k,l),那么(i,j)也一定可以到达(k,l’),其中l’的半径比l大。如果存在这样的关系:
并且dis[x][z]=dis[y][z]+dis[x][y]。
那么(x,z)这条边显然可以省略。
当大量存在这样的边时,如本题,就可以优化边数。
spfa优化
1.SFL优化
尽量维持决策遍历队列的单调性,这样可以使得以更高的频率用更优的点更新。
具体而言,如果dis[b[head+1]]>dis[b[tail]],则swap(b[head+1],b[tail])。
2.单点最短路优化
由于spfa自带求单源到所有点的最短路,如果我们只需要求单源到单汇的最短路,那么显然如果当前节点比目标节点更劣就直接跳过。
【JZOJ4893】【NOIP2016提高A组集训第15场11.14】过河的更多相关文章
- JZOJ 【NOIP2016提高A组集训第16场11.15】兔子
JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...
- JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线
JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...
- 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子
题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ...
- 【JZOJ4895】【NOIP2016提高A组集训第16场11.15】三部曲
=v= 因为外来的入侵,国王决定在某些城市加派士兵.所有城市初始士兵数量为0.当城市 被加派了k名士兵时.城市i的所有子城市需要被加派k+1名士兵.这些子城市的所有子城市需要被加派k+2名士兵.以此类 ...
- 【JZOJ4894】【NOIP2016提高A组集训第16场11.15】SJR的直线
题目描述 数据范围 解法 考虑逐次加入每一条直线. 对于当前已加入的直线集合L,现在要新加入一条直线l. 那么它产生的贡献,与平行线有关. 对于任意三条直线,如果其中任意两条平行,那么将不做贡献. 所 ...
- 【NOIP2016提高A组集训第4场11.1】平衡的子集
题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...
- 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集
题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...
- 【NOIP2016提高A组集训第13场11.11】最大匹配
题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...
- 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵
题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...
随机推荐
- ajax返回后台编译时都对,返回error
首先看看你的dataType:‘json’ 类型是否与后台获取的类型一直.特别是json的格式对不对. 第二: 红括号里的有没有加
- Redis学习01——介绍与搭建环境
Redis学习01介绍与搭建环境一简介二yum配置已经配置了的可以跳过三安装gcc四安装redis1 上传Redis到linux中2 解压到usrlocal下3 编译redis4 安装redis5 拷 ...
- 初学linux时遇到的那些哭笑不得的问题
1.终端中无法输入密码? 在终端输入密码,是不会在输入密码的时候看见星号或者圆点符号的.它不会有任何输入密码的视觉指示,也不会有任何光标移动,什么也不显示. 其实是输进去了,只是没有明文显示出来而已. ...
- Leetcode506.Relative Ranks相对名次
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予 "金牌","银牌" 和" 铜牌"(" ...
- k8s(openshift) 部署istio1.1
准备工作: openshift 默认不允许UID为0的容器运行,要先授权scc以便安装istio # oc adm policy add-scc-to-user anyuid -z istio-ing ...
- Django项目:CRM(客户关系管理系统)--42--34PerfectCRM实现CRM自定义用户
#models.py # ————————01PerfectCRM基本配置ADMIN———————— from django.db import models # Create your models ...
- 主流浏览器HTML5视频格式差异
因最近在研究video.js,现在遇到的问题是在js中设置了swf,但是在ie8下只是显示黑屏并没有播放视频,在网上进行搜索时查到了有关各个浏览器支持哪些视频格式的文章,现在此记录下,方便以后查阅. ...
- php mkdir 777失败
参考网址:https://www.cnblogs.com/52php/p/5660079.html 在linux系统中在创建文件/文件夹时有一个默认权限,此权限受 umask 设置影响,在/etc/b ...
- web前端学习(四)JavaScript学习笔记部分(8)-- JavaScript 浏览器对象
1.window对象 1.1.window对象: window对象是BOM的核心,window对象指当前的浏览器窗口 所有javaScript全局对象.函数以及变量均自动生成为window对象的成员 ...
- 数组的方法之(Array.prototype.reduce() 方法)
reduce函数 reduce() 方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值. 对数组中的所有元素调用指定的回调函数.该回调函数的返回值为累积结果,并且此返回值在下一次 ...