和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. 提高 Discuz 门户文章被百度收录的方法

    如果你了解 SEO,你就该清楚使用 canonical URL 标签可以固定网页标准地址,可以提高网页的权重,有利于搜索引擎收录. 例如我的网站拥有两个子域名www.bbseat.com.cn和bbs ...

  2. 不得不知道的Python字符串编码相关的知识

    开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII character 'ascii' codec can't encode characters in posi ...

  3. Servlet一次乱码排查后的总结(转)

    原文地址:http://my.oschina.net/looly/blog/287255 由来 在写一个小小的表单提交功能的时候,出现了乱码,很奇怪request上来的参数全部是乱码,而从数据库查询出 ...

  4. Oracle “CONNECT BY” 使用

    Oracle “CONNECT BY” 使用 功能说明: 语法结构如下: [ START WITH condition ] CONNECT BY [ NOCYCLE ] condition 说明: 1 ...

  5. 蜗牛历险记(二) Web框架(上)

    接上篇所说,本篇主要内容是讲述如何使用Autofac来管理整个平台的生命周期(初级). 一.简述 插件式Web开发的同学应该还会记得PreApplicationStartMethod这个Assembl ...

  6. angularApi网站用vue重构

    最近在博客园上看到不少关于vue的文章但感觉都是在简单原生写法上,真正vue在实际开发中的优点组件化,spa应用,路由好像都没涉及到,我在学angular1的时候发现没有中文版的api,于是本人不才弄 ...

  7. Python之print语句

    print语句可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' 注意: 1.当我们在Python交 ...

  8. selenium + python网页自动化测试环境搭建

    1.python的安装 ,这个不解释,exe文件运行安装即可,既然你选择python,相信你是熟悉python的,我安装目录C:\Python27 2.setuptools 的安装也非常简单,同样是e ...

  9. CoInitialize()、CoInitializeEx()和AfxOleInit()区别联系

    CoInitialize()和AfxOleInit() 都是初始化COM库,不同之处在与: OLE是建立在COM之上的技术,层次比COM要高.AfxOleInit()调用的是OleInitialize ...

  10. Delphi XE5 android toast

    unit Android.JNI.Toast; // Java bridge class imported by hand by Brian Long (http://blong.com) inter ...