和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的更多相关文章

  1. [BZOJ3205][APIO2013]Robot(斯坦纳树)

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 240[Submit][Status ...

  2. bzoj千题计划230:bzoj3205: [Apio2013]机器人

    http://www.lydsy.com/JudgeOnline/problem.php?id=3205 历时一天,老子终于把它A了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 因为不懂spfa ...

  3. bzoj3205 [Apio2013]机器人

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 953  Solved: 227[Submit][Status] ...

  4. BZOJ3205/UOJ107 [Apio2013]机器人

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  5. [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 977  Solved: 230[Submit][Status] ...

  6. 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 ...

随机推荐

  1. XZ压缩最新压缩率之王

    xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到这种压缩格式的,phpm ...

  2. Oracle 内核参数

    安装Oracle的时候,可以参考Oracle 的安装文档,来设置相关内核参数的值,但是有些参数的值还是需要根据我们自己的情况来进行调整.注:不同系统的参数不同,本篇针对linux. 一.Linux 系 ...

  3. Microsoft Expression Blend 4制作简单的按钮

    在博客园混了这么久了,第一次写博客.本人标准的理工男,文笔不敢说一般,只能用还学过语文.勉强达意而已.见笑!! 由于本人能有有限,错误之处在所难免,望大牛们批评指正,共同进步.^_^!!!!!!!!! ...

  4. Mvc生命周期深度剖析

    客户端发送请求->IIS, UrlRouting模块对比URL, 默认如果该URL能对应到实体文件则退出MVC管道把控制权交还给IIS. 如果RegisterRoutes中的路由规则对比成功默认 ...

  5. iOS 支付宝应用(备用参考)

    1:先与支付宝签约,获得商户ID(partner)和账号ID(seller) 2:下载相应的公钥私钥文件(加密签名用) 3:下载支付宝SDK 4:生成订单信息5:调用支付宝客户端,由支付宝客户端跟支付 ...

  6. PAT-乙级-1019. 数字黑洞 (20)

    1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...

  7. Hibernate 二级缓存 总结整理(转)

    和<Hibernate 关系映射 收集.总结整理> 一样,本篇文章也是我很早之前收集.总结整理的,在此也发上来 希望对大家有用.因为是很早之前写的,不当之处请指正. 1.缓存:缓存是什么, ...

  8. KafkaSpout分析:配置

    public KafkaSpout(SpoutConfig spoutConf) { _spoutConfig = spoutConf;} 基于0.93版本的Storm SpoutConfig继承自K ...

  9. SaaS 公司如何应对 On-Call 挑战?

    Cloud Insight 集监控.管理.计算.协作.可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效.简单.本文系国内 ITOM 行业领军企业 OneAP ...

  10. pythn BeautifulSoup

    http://rsj217.diandian.com/post/2012-11-01/40041235132 Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它 ...