[luogu P3786]萃香抱西瓜 [spfa][状态压缩]
题目背景

伊吹萃香(Ibuki Suika)正在魔法之森漫步,突然,许多西瓜(Suika)从四周飞来,划出了绚丽的轨迹。虽然阵势有点恐怖,但她还是决定抱走一些西瓜。
题目描述
萃香所处的环境被简化为一个长为h,宽为w的网格平面。X坐标范围为[1,w],y坐标范围为[1,h]。
她初始(第1个时刻)站在坐标为sx,sy的方格。
西瓜可能在任意一个方格出现,在每个时间单位,它们可能向任何一个方向移动,也可能静止不动。西瓜的位置和移动的轨迹是已知的。西瓜的总数为n个,但只有m个西瓜可以被萃香抱走,因为其他都太大了,可能会砸伤她。
整个过程会持续T个时刻。萃香希望可以抱走全部的m个西瓜,并且在任何时候避免与任何一个过大的西瓜处在同一位置。抱走的方式为在某个时刻,与该西瓜处于同一位置。另外,由于萃香不愿耗费过多体力到处乱跑,她每个时刻可以选择静止不动,也可以选择移动到相邻的四个格子之一,只要不越出环境边界。如果选择移动到相邻格子,则算作移动了一次。(第1个时刻萃香刚站定,无法移动)
在每个时刻,如果萃香选择移动,可以认为萃香与西瓜同时从原来的位置移到了新的位置,没有先后顺序。
萃香想要知道,不被任何一个大西瓜砸中,并得到所有的m个小西瓜的情况下,最少需要移动多少次。
输入输出格式
输入格式:
第一行五个整数h,w,T,sx,sy,含义见题目描述。
第二行两个整数n,m,含义见题目描述。
接下来n段数据,每一段描述了一个西瓜的出现位置,时间,移动方式,是否可以被抱走等内容,具体如下:
首先一行,两个整数t1,t2,表示西瓜在t1时刻出现, t2时刻消失。若t2=T+1,表示西瓜在最后一个时刻也不消失。保证西瓜至少存在一个时刻。
接下来一行一个整数a,只能为0或1,0表示这个西瓜需要避开,1表示这个西瓜需要抱走。数据保证需要抱走的西瓜恰好有m个。
接下来t2-t1行,每一行两个整数x,y,顺序描述了从t1时刻到t2-1时刻,该西瓜的坐标。西瓜的移动不一定是连续的,并且是一瞬间完成的,所以无需考虑萃香是否站在了移动路径上。
输出格式:
如果萃香在整个T时刻内无法避免被大西瓜砸中或者无法收集到所有m个小西瓜,输出-1,否则输出一个整数,表示萃香需要移动的最少次数。
输入输出样例
5 5 10 3 3
1 1
1 11
1
3 4
5 2
3 5
1 1
5 4
3 4
2 1
1 1
1 1
5 5
1
说明
样例说明:第2~4个时刻萃香站着不动,在第6个时刻,西瓜出现在萃香旁边,萃香移动到(3,4)位置即可抱走这个西瓜。
数据范围和提示:
子任务可能出现两种特殊性质A和B
A: 所有西瓜t1=1,t2=T+1
所有西瓜全程都静止在原地,不会发生移动。
B:m=0
共有10个子任务。
对于子任务1,具有特殊性质A和B
对于子任务2~3,仅具有特殊性质A
对于子任务4~5,仅具有特殊性质B
对于子任务6~10,不具有任何一个特殊性质。
对于全部子任务
1<=所有横坐标范围<=w
1<=所有纵坐标范围<=h
1<=h,w<=5
1<=T<=100
1<=t1<=T
2<=t2<=T+1
t1<t2
1<=n<=20
0<=m<=10
m<=n
一个位置不会同时出现两个或以上西瓜。
有趣的状压spfa
以及一开始感到神秘的 !!i
偷一波orangebird的官方题解
**********************************************************
子任务1:所有西瓜始终出现且不动,并且没有要抱走的。
解法:只需要判断初始位置是否被大西瓜挡住,挡住输出-1,否则输出0即可
子任务2~3:所有西瓜始终出现且不动。
解法:由于要抱走的西瓜最多为10个,考虑用长度为10的0/1串来表示某个西瓜是否已经获取。状压spfa或dp即可解决。
子任务4~5:没有需要抱走的西瓜
解法:将时间看做一个维度,构建好三维的地图,把西瓜看做障碍,做三维的最短路或dp即可。
正解:
结合子任务2~3和4~5的做法,做一个四维的状压最短路或dp即可解决。
**********************************************************
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f inline int read(){
int re=;
bool flag=;
char ch;
while((ch=getchar())!='-'&&(ch<''||ch>''));
ch=='-'?flag=:re=ch-'';
while((ch=getchar())>=''&&ch<='') re=(re<<)+(re<<)+ch-'';
return flag?-re:re;
} struct node{
int nows,nowt,nowx,nowy;
node(int nows=,int nowt=,int nowx=,int nowy=):
nows(nows),nowt(nowt),nowx(nowx),nowy(nowy){}
}; const int maxm=,maxsize=,maxt=; int mp[maxsize][maxsize][maxt];
int dis[maxsize][maxsize][maxt][<<maxm];
bool vis[maxsize][maxsize][maxt][<<maxm];
const int dirx[]={,,-,,},diry[]={,,,,-};
const int stop=;
int mx,my,T,sx,sy;
int n,m,cnt=-;
queue<node> que; void init(){
memset(mp,inf,sizeof mp);
mx=read(); my=read(); T=read(); sx=read(); sy=read();
n=read(); m=read();
for(int i=;i<=n;i++){
int t1=read(),t2=read(),a=read();
if(!a) a=stop;
else a=++cnt;
for(int i=t1;i<t2;i++){
int x=read(),y=read();
mp[x][y][i]=a;
}
}
} void spfa(){
que.push(node(,,sx,sy));
memset(dis,inf,sizeof dis);
dis[sx][sy][][]=;
while(!que.empty()){
node now=que.front(); que.pop();
vis[now.nowx][now.nowy][now.nowt][now.nows]=;
if(now.nowt==T) continue;
for(int i=;i<;i++){
int nexx=now.nowx+dirx[i];
int nexy=now.nowy+diry[i];
int next=now.nowt+;
int nexs;
if(nexx<||nexx>mx||nexy<||nexy>my) continue;
if(mp[nexx][nexy][next]==stop) continue;
if(mp[nexx][nexy][next]==inf) nexs=now.nows;
else nexs=now.nows|(<<mp[nexx][nexy][next]);
if(dis[nexx][nexy][next][nexs]<=dis[now.nowx][now.nowy][now.nowt][now.nows]+!!i) continue;
dis[nexx][nexy][next][nexs]=dis[now.nowx][now.nowy][now.nowt][now.nows]+!!i;
if(!vis[nexx][nexy][next][nexs]){
vis[nexx][nexy][next][nexs]=;
que.push(node(nexs,next,nexx,nexy));
}
}
}
} void solve(){
spfa();
int ans=inf;
for(int i=;i<=mx;i++)
for(int j=;j<=my;j++)
ans=min(ans,dis[i][j][T][(<<m)-]);
if(ans==inf) ans=-;
printf("%d\n",ans);
} int main(){
//freopen("temp.in","r",stdin);
init();
if(mp[sx][sy][]==stop){
puts("-1");
return ;
}
solve();
return ;
}
[luogu P3786]萃香抱西瓜 [spfa][状态压缩]的更多相关文章
- 【Luogu】P3786萃香抱西瓜(状压DP)
题目链接 水题,数据范围提示得太明显了吧,不用动脑子都能知道是状压. 不过还是有坑(当然更可能是我脑子有坑) f[i][j][k][l]表示当前是第i秒,萃香在(j,k),已经抱到的西瓜状态是l的最少 ...
- 洛谷 - P3786 - 萃香抱西瓜 - 状压dp
重构一下就过了,不知道之前错在哪里. #include<bits/stdc++.h> using namespace std; typedef unsigned long long ull ...
- Travelling(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others ...
- Victor and World(spfa+状态压缩dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...
- Luogu P1558 色板游戏【线段树/状态压缩】By cellur925
题目传送门 今天非常想再看一遍霸王别姬想不进去题于是开始刷数据结构 注意到至多只有\(30\)种颜色,啊啊啊啊我一开始竟然想的不是状态压缩而是在线段树中存一个30大小的数组,这样每次更新的时候暴力循环 ...
- luogu P4275 萃香的请柬
嘟嘟嘟 打表不难发现,序列的长度以及序列中1的个数都是斐波那契数列.因为第 i 秒1的个数由 i - 1的1和 i - 2的0变换而来,那么f[i] = f[i - 1] + f[i - 2].序列的 ...
- HDU 4085 Peach Blossom Spring 斯坦纳树 状态压缩DP+SPFA
状态压缩dp+spfa解斯坦纳树 枚举子树的形态 dp[i][j] = min(dp[i][j], dp[i][k]+dp[i][l]) 当中k和l是对j的一个划分 依照边进行松弛 dp[i][j] ...
- Luogu P4011 孤岛营救问题(状态压缩+最短路)
P4011 孤岛营救问题 题意 题目描述 \(1944\)年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到 ...
- 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...
随机推荐
- 两个HTML,CSS布局实例
今天首先仿照某公司页面只做了一个几乎一模一样,连距离都相同的页面. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- ActiveMQ 学习第二弹
经历了昨天的初识 ActiveMQ,正好今天下班有点事耽搁了还没法回家,那就再学习会 ActiveMQ 吧!现在官网的文档没啥好看的了,毕竟是入门学习,太深奥的东西也理解不了.然后看官网上有推荐书籍& ...
- 基于servlet和ajax的聊天室
(手贱点了更新发布时间,发布时间变成6-9...) 2017-5-20,在这个奇特的日子,我不再满足于在本地测试javaweb,于是在上腾讯云买了第一个云服务器,由于是学生认证,所以一个月只要10块钱 ...
- WPF中实现类智能感知
首先要做的事情就是定义一个popup来显示我们需要展示的东西 <Popup x:Name=" StaysOpen="False" Placement="B ...
- springmvc 之 返回值
springMVC对于controller处理方法返回值的可选类型 spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, Stri ...
- 友盟分享到微信 监听不执行 监听只执行onStart,(onResult,onError,onCancel 不执行)
最近在做一个项目 有一个需求是要分享项目中的一个商品 这对于我来说简直是 so easy (项目是三个人一起写的) 正好看到之前有同事写完了 我就拿过来用吧 一顿复制粘贴 大功告成 这个是监 ...
- 小试牛刀JavaScript鼠标事件
鼠标事件练习1 当鼠标点击网页某个单元格的时候,其他的单元格颜色不变,只有被点击的单元格颜色发生变化 <style type="text/css"> *{ margin ...
- 【LCA求最近公共祖先+vector构图】Distance Queries
Distance Queries 时间限制: 1 Sec 内存限制: 128 MB 题目描述 约翰的奶牛们拒绝跑他的马拉松,因为她们悠闲的生活不能承受他选择的长长的赛道.因此他决心找一条更合理的赛道 ...
- JAVA程序员成长历程(一)
程序员的20个常见瓶颈 在扩展性的艺术一书中,Russell给出了20个有意思的估计:大约有20个经典瓶颈. Russell说,如果在他年轻时他就知道这些瓶颈该有多好!这些论断包括: * Databa ...
- 并发编程(三):从AQS到CountDownLatch与ReentrantLock
一.目录 1.AQS简要分析 2.谈CountDownLatch 3.谈ReentrantLock 4.谈消费者与生产者模式(notfiyAll/wait.si ...