bzoj3205
和bzoj2595类似,也是斯坦纳树
设f[l,r,]表示在点i机器人组合成了l-r最少推的次数,然后可得
f[l,r,i]=min(f[l,m,i]+f[m+1,r,i])
f[l,r,i]=min(f[l,r,j]+1) 点j能推到i
但是这样做肯定会TLE,考虑两个优化
首先,一开始其实有很多根本用不到,我们可以先从机器人初始位置搜下去,找到所有可以访问的点做dp即可
其次,观察第二个方程,它的边权都是1,我们一定要用spfa转移吗?不,我们可以用直接宽搜
具体的我们维护两个队列,第一个队列是初始的按从小到大排,新加入的点放在第二个队列,每次取两个队头小的那一个
但我还是tle,求神犇指教
const dx:array[..] of longint=(,,,-);
dy:array[..] of longint=(,,-,);
inf=;
type node=record
x,y:longint;
end; var w:array[..] of node;
q1,q2,st:array[..] of longint;
po:array[..,..,..] of longint;
f:array[..,..,..] of longint;
c:array[..,..] of char;
v:array[..] of boolean;
loc:array[..] of longint;
next:array[..,..] of longint;
s:array[..] of longint;
mid,h1,t1,i,j,p,q,l,x,y,k,n,m,ans,mx,tot:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function dfs(x,y,k:longint):longint;
var xx,yy:longint;
begin
if (po[x,y,k]=) then exit(-);
if po[x,y,k]> then exit(po[x,y,k]);
po[x,y,k]:=;
xx:=x+dx[k];
yy:=y+dy[k];
if (xx<) or (xx>n) or (yy<) or (yy>m) or (c[xx,yy]='x') then po[x,y,k]:=(x-)*m+y
else if c[xx,yy]='A' then po[x,y,k]:=dfs(xx,yy,(k+) mod +)
else if c[xx,yy]='C' then po[x,y,k]:=dfs(xx,yy,k mod +)
else po[x,y,k]:=dfs(xx,yy,k);
exit(po[x,y,k]);
end; function cmp(i,j,l,r:longint):boolean;
begin
exit(f[i,l,r]<f[j,l,r]);
end; procedure sort(l,r:longint);
var i:longint;
begin
for i:= to mx do
inc(s[i],s[i-]);
for i:=t1 downto do
begin
q1[s[f[st[i],l,r]]]:=st[i];
dec(s[f[st[i],l,r]]);
end;
end; procedure bfs(l,r:longint);
var h2,t2,i,x,y:longint;
begin
h2:=;
t2:=;
while (h2<=t2) or (h1<=t1) do
begin
if (h2>t2) or (h1<=t1) and cmp(q1[h1],q2[h2],l,r) then
begin
x:=q1[h1];
inc(h1);
end
else begin
x:=q2[h2];
inc(h2);
end;
v[x]:=true;
for i:= to do
begin
if next[x,i]= then continue;
y:=next[x,i];
if not v[y] and (f[x,l,r]+<f[y,l,r]) then
begin
v[y]:=true;
f[y,l,r]:=f[x,l,r]+;
inc(t2);
q2[t2]:=y;
end;
end;
end;
end; begin
readln(k,m,n);
for i:= to n*m do
for p:= to k do
for q:= to k do
f[i,p,q]:=inf;
for i:= to n do
begin
for j:= to m do
begin
read(c[i,j]);
if (c[i,j]>='') and (c[i,j]<='') then
begin
x:=ord(c[i,j])-;
inc(t1);
w[t1].x:=i; w[t1].y:=j;
f[t1,x,x]:=;
loc[(i-)*m+j]:=t1;
end;
end;
readln;
end;
fillchar(po,sizeof(po),);
h1:=;
while h1<=t1 do
begin
x:=w[h1].x; y:=w[h1].y;
for i:= to do
begin
if po[x,y,i]=- then
begin
po[x,y,i]:=dfs(x,y,i);
if (po[x,y,i]>) and (loc[po[x,y,i]]=) then
begin
inc(t1);
w[t1].x:=(po[x,y,i]-) div m+;
w[t1].y:=(po[x,y,i]-) mod m+;
loc[po[x,y,i]]:=t1;
end;
end;
if po[x,y,i]> then next[h1,i]:=loc[po[x,y,i]];
end;
inc(h1);
end;
tot:=t1;
for l:= to k do
for p:= to k-l+ do
begin
q:=p+l-;
h1:=; t1:=; mx:=;
for i:= to tot do
begin
v[i]:=false;
for mid:=p to q- do
f[i,p,q]:=min(f[i,p,q],f[i,p,mid]+f[i,mid+,q]);
if f[i,p,q]<inf then
begin
inc(t1);
st[t1]:=i;
inc(s[f[i,p,q]]);
if f[i,p,q]>mx then mx:=f[i,p,q];
end;
end;
sort(p,q);
for i:= to mx do
s[i]:=;
bfs(p,q);
end;
ans:=inf;
for i:= to tot do
ans:=min(ans,f[i,,k]);
if ans>=inf then writeln(-)
else writeln(ans);
end.
bzoj3205的更多相关文章
- [BZOJ3205][APIO2013]Robot(斯坦纳树)
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 1007 Solved: 240[Submit][Status ...
- bzoj千题计划230:bzoj3205: [Apio2013]机器人
http://www.lydsy.com/JudgeOnline/problem.php?id=3205 历时一天,老子终于把它A了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 因为不懂spfa ...
- bzoj3205 [Apio2013]机器人
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 953 Solved: 227[Submit][Status] ...
- BZOJ3205/UOJ107 [Apio2013]机器人
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 977 Solved: 230[Submit][Status] ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
随机推荐
- 解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin.
一:使用jsonp格式, 如jquery中ajax请求参数 dataType:'JSONP'. <html> <head> <title>title</t ...
- eclipse 分屏
刚刚一直找不到eclipse分屏功能,查了下发现是可以的. 具体见:http://www.coderanch.com/t/101996/vc/Split-screen-editor-Eclipse E ...
- 详解AngularJS中的filter过滤器用法
系统的学习了一下angularjs,发现angularjs的有些思想根php的模块smarty很像,例如数据绑定,filter.如果对smarty比较熟悉的话,学习angularjs会比较容易一点.这 ...
- PHPCMS v9栏目添加字段及描述编辑器修改方法
为PHPCMS v9栏目添加字段和把描述的textarea编辑器变成fceditor编辑器的方法.如下: 1. 添加数据库字段:description1,添加位置:v9_catetory表 2. 在c ...
- C语言控制语句总结(if else for switch while break continue)
一.if语句 1表达式 if(条件表达式) 语句 注: (1)条件表达式,一般为逻辑表达式或关系表达式,但也可以是任何数值类型,如整型.实型.字符型.指针型数据等. (2)语句,由于是C语言的语句,而 ...
- 【转】FTP自动上传文件的perl脚本以及配置文件
这个perl文件将执行的任务是, 按照指定的文件夹目录,自动将该文件夹下的所有文件上传到指定ftp站点的指定目录下 本应用程序设计的几个基本理念是:工具箱再利用:尽可能利用已有的工具:简化运行步骤:不 ...
- shutdown彻底关闭tomcat,以及多线程关闭
最近做的一个Web项目,发现shutdown.sh后,无法关掉tomcat进程. ps -ef | grep tomcat 返回tomcat进程仍然存在.经过调查发现是因为在Web应用中启动了线程池, ...
- tablib源代码学习
tablib简介 ----------- Tablib is a format-agnostic tabular dataset library, written in Python. Tablib ...
- 正则表达式通过Unicode属性匹配
原文链接:http://zochen.iteye.com/blog/690716 Unicode 编码并不只是为某个字符简单定义了一个编码,而且还将其进行了归类. \pP 其中的小写 p 是 prop ...
- Fail-fast的原因及解决方法
[转载]:http://blog.csdn.net/chenssy/article/details/38151189 在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayL ...