http://www.lydsy.com/JudgeOnline/problem.php?id=3205

历时一天,老子终于把它A了

哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

因为不懂spfa的优化 以及 数组越界  TAT

┭┮﹏┭┮

牢骚发完了,题解在下面  (⊙o⊙)…

n只有9,很像状压dp

dp[l][r][x][y] 表示在(x,y)位置 合成了x-y复合机器人 的最少推动次数

它的转移 存在后效性

所以上 斯坦纳树

自身的转移:dp[l][r][x][y]=min{dp[l][k][x][y]+dp[k+1][r][x][y]}

互相转移:

预处理出 在(x,y)位置 向4个方向推,最终会停留在哪个位置

可以记忆化搜索

然后用spfa

裸的spfa 得了65

加上SLF优化得了75

再加LLL优化还是75,但慢了一点儿 (可能是我不会用吧TAT)

然后改了双端队列还是75

最后参考了一位大佬的做法:

双端队列优化只是考虑 当前要入队的和在队首的 目前哪个更优

那么可以将这个扩展成单调队列,根noip2017蚯蚓很像

两个队列q1,q2

q2中存放在自身转移中入队的状态,从小到大排好序

然后由q2中转移出的状态,全部放进q1,

因为转移代价是1,q2又单调,所以可以保证q1也是单调的

每次比较q1和q2的队首,取出目前更优的状态 扩展新的状态

#include<queue>
#include<cstdio>
#include<cstring> using namespace std; #define N 501 typedef pair<int,int> pii; #define MP(x,y) make_pair(x,y) int T,m,n;
char s[N]; int map[N][N]; int dx[]={-,,,};
int dy[]={,,,-}; int pos[][N][N];
bool v[][N][N]; int dp[][][N][N]; int tot,mx;
int cnt[N*N*];
pii tmp[N*N],q[N*N];
queue<pii>q1,q2; bool vis[N][N]; inline int &min(int &x,int &y) { return x<y ? x: y; } bool inmap(int x,int y)
{
if(x<= || x>n || y<= || y>m) return false;
if(!map[x][y]) return false;
return true;
} int find(int x,int y,int d)
{
if(pos[d][x][y]) return pos[d][x][y];
if(!map[x][y]) return -;
if(v[d][x][y]) return -;
v[d][x][y]=true;
int nd=d;
if(map[x][y]==-) nd=(d-+)%;
if(map[x][y]==-) nd=(d+)%;
int npos=-;
if(!inmap(x+dx[nd],y+dy[nd])) npos=-;
else npos=find(x+dx[nd],y+dy[nd],nd);
v[d][x][y]=false;
if(npos==-) return pos[d][x][y]=(x-)*m+y;
else return pos[d][x][y]=npos;
} void spfa(int l,int r)
{
for(int i=;i<=mx;++i) cnt[i]=;
for(int i=;i<=tot;++i) cnt[dp[l][r][tmp[i].first][tmp[i].second]]++;
for(int i=;i<=mx;++i) cnt[i]+=cnt[i-];
for(int i=tot;i;--i) q[cnt[dp[l][r][tmp[i].first][tmp[i].second]]--]=tmp[i];
for(int i=;i<=tot;++i) q2.push(q[i]);
int x,y,nx,ny;
while(!q2.empty() || !q1.empty())
{
if(q1.empty())
{
x=q2.front().first;
y=q2.front().second;
q2.pop();
}
else if(q2.empty())
{
x=q1.front().first;
y=q1.front().second;
q1.pop();
vis[x][y]=false;
}
else if(dp[l][r][q1.front().first][q1.front().second]>dp[l][r][q2.front().first][q2.front().second])
{
x=q2.front().first;
y=q2.front().second;
q2.pop();
}
else
{
x=q1.front().first;
y=q1.front().second;
q1.pop();
vis[x][y]=false;
}
for(int i=;i<;++i)
{
if(pos[i][x][y]==-) continue;
nx=(pos[i][x][y]-)/m+;
ny=pos[i][x][y]-(nx-)*m;
if(dp[l][r][x][y]+<dp[l][r][nx][ny])
{
dp[l][r][nx][ny]=dp[l][r][x][y]+;
if(!vis[nx][ny]) q1.push(MP(nx,ny)),vis[nx][ny]=true;
}
}
}
} int main()
{
scanf("%d%d%d",&T,&m,&n);
for(int i=;i<=n;++i)
{
scanf("%s",s+);
for(int j=;j<=m;++j)
if(s[j]=='A') map[i][j]=-;
else if(s[j]=='C') map[i][j]=-;
else if(s[j]>='' && s[j]<='') map[i][j]=s[j]-'';
else if(s[j]=='.') map[i][j]=;
}
for(int d=;d<;++d)
{
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(map[i][j]) find(i,j,d);
}
memset(dp,,sizeof(dp));
int oo=dp[][][][];
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(map[i][j]>= && map[i][j]<=) dp[map[i][j]][map[i][j]][i][j]=;
for(int i=T;i;--i)
for(int j=i;j<=T;++j)
{
tot=mx=;
for(int x=;x<=n;++x)
for(int y=;y<=m;++y)
{
for(int k=i;k<j;++k)
dp[i][j][x][y]=min(dp[i][j][x][y],dp[i][k][x][y]+dp[k+][j][x][y]);
if(dp[i][j][x][y]!=oo) tmp[++tot]=MP(x,y),mx=max(mx,dp[i][j][x][y]);
}
if(tot) spfa(i,j);
}
int ans=oo;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
ans=min(ans,dp[][T][i][j]);
if(ans==oo) printf("-1");
else printf("%d",ans);
return ;
}

bzoj千题计划230:bzoj3205: [Apio2013]机器人的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划220:bzoj3938: Robot

    http://www.lydsy.com/JudgeOnline/problem.php?id=3938 以时间为x轴,以距离为y轴,那么每个机器人的行走路径就是一条折线 把折线分段加入线段树里,然后 ...

  5. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  6. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  7. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  8. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  9. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

随机推荐

  1. 【大数据实战】将普通文本文件导入ElasticSearch

    以<刑法>文本.txt为例. 一.格式化数据 1,首先,ElasticSearch只能接收格式化的数据,所以,我们需要将文本文件转换为格式化的数据---json. 下图为未处理的文本文件. ...

  2. K8s爆严重安全漏洞?有何应对措施与建议

    Kubernetes最近爆出严重安全漏洞,影响几乎目前所有的版本.实际影响究竟多大?老版本用户是否必须升级?以下是华为云容器服务团队对该漏洞的分析解读. Kubernetes爆出的严重安全漏洞: 攻击 ...

  3. Fragment 使用总结

    1. 要深刻理解Fragment 的生命周期 2. Fragment.getActivity()并不能保证非空. 3.如果在Fragment中有异步的回调, 特别要注意此时Fragment 是否还at ...

  4. PAT甲题题解-1012. The Best Rank (25)-排序水题

    排序,水题因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E那么按这个优先级顺序进行排序每次排序前先求当前课程的排名然后再与目前最好的排名比较.更新 至于查询 ...

  5. 12.22daily_scrum

    今天是我们小组M2阶段开始一周结束,各项工作进入一个阶段性的总结过程,悬浮窗的设计也已经告一段落进入调试的阶段,新的工作任务有了添加,即滑锁密码的加入,更好地加深了用户体验性,软件的可用性也进一步加强 ...

  6. Daily Scrum NO.5

    工作概况 符美潇 昨日完成的工作 1.Daily Scrum.日常会议及日常工作的分配和查收. 2.变更集461代码签入,主要与视频链接爬取有关. 今日工作 1.Daily Scrum.日常会议及日常 ...

  7. wordpress学习四: 一个简单的自定义主题

    在学习三里分析了自带的一个例子,本节我们就自己仿照他做个简单的吧,重点是调用wordpress封装好的函数和类,css和html可以稍好在调整. 将wp带的例子复制一份处理,重新名个名字. 清空ind ...

  8. 第五篇——Spring音乐播放界面设计(C#)

    由于小组成员已经完成软件的详细设计说明书,在这里只具体说明软件程序的细节编写,以免重复. 歌曲的播放采用VS自带的axWindowsMediaPlayer插件,所以程序中涉及到许多该插件的使用.Ctl ...

  9. R-CNN阅读笔记

    论文地址:<Rich feature hierarchies for accurate object detection and semantic segmentation> 论文包含两个 ...

  10. ElasticSearch 2 (5) - Document APIs

    ElasticSearch 2.1.1 (5) - Document APIs This section describes the following CRUD APIs: Single docu ...