ACM-ICPC 2018 南京赛区现场赛 K. Kangaroo Puzzle (思维+构造)
题目链接:https://codeforc.es/gym/101981/attachments
题意:在 n * m 的平面上有若干个袋鼠和墙(1为袋鼠,0为墙),每次可以把所有袋鼠整体往一个方向移动一步(不能走出边界和不能走到墙),为在不超过5e4步的情况下能否把全部袋鼠聚集在同一个位置。
题解:先预处理每个袋鼠到其他袋鼠的初始方向,然后每次选两个不同的袋鼠,其中一个向另一个逼近,直到聚集在一起,然后重复该操作。因为n,m <= 20,所以最多只有400个袋鼠,而每两个不同的袋鼠逼近的过程中最多走 80 步,故操作次数上界是 3.2e4。
#include <bits/stdc++.h>
#define sd(a) scanf("%d",&a)
#define sld(a) scanf("%lld",&a)
#define mst(a,b) memset(a,b,sizeof a)
#define mp make_pair
#define all(a) a.begin(),a.end()
typedef long long ll;
#define pb push_back
using namespace std;
typedef pair<int, int> pii;
const int maxn = 2e6 + ;
const int maxm = 1e6 + ;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + ;
const double eps = 1e-;
char s[][];
int to[][][][];
bool vis[][];
vector<pii>v;
int n, m; bool judge(int x, int y) {
return <= x && x <= n && <= y && y <= m && s[x][y] == '';
} int dx[] = {, , -, }, dy[] = {, , , -};
void pre(int x, int y) {
mst(vis, );
vis[x][y] = ;
vector<pii>v;
queue<pii>q;
for(int i = ; i < ; ++i) {
v.clear();
int nx = x + dx[i], ny = y + dy[i];
if(!judge(nx, ny))
continue;
q.push(mp(nx, ny));
for(; !q.empty();) {
pii p = q.front();
q.pop();
int ux = p.first;
int uy = p.second;
if(vis[ux][uy])
continue;
vis[ux][uy] = ;
v.pb(p);
for(int j = ; j < ; ++j) {
int qx = dx[j] + ux, qy = dy[j] + uy;
if(judge(qx, qy) && !vis[qx][qy])
q.push(mp(qx, qy));
}
}
int sz = v.size();
for(int j = ; j < sz; ++j) {
int qx = v[j].first;
int qy = v[j].second;
to[x][y][qx][qy] = i;
}
}
} int main() {
#ifdef LOCAL
freopen("in", "r", stdin);
#endif // local
// int n,m;
sd(n), sd(m);
for(int i = ; i <= n; ++i)
scanf("%s", s[i] + );
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) {
if(s[i][j] - '')
v.pb(mp(i, j));
pre(i, j);
}
vector<int>q;
int sz = v.size();
char ch[] = {'D', 'R', 'U', 'L'};
for(;;) {
int idx1 = , idx2 = -;
for(int i = ; i < sz; ++i) {
if(v[i] != v[idx1]) {
idx2 = i;
break;
}
}
if(idx2 == -)
break;
for(; v[idx1] != v[idx2];) {
int x1 = v[idx1].first, x2 = v[idx2].first;
int y1 = v[idx1].second, y2 = v[idx2].second;
int id = to[x1][y1][x2][y2];
q.pb(id);
for(int i = ; i < sz; ++i) {
if(judge(v[i].first + dx[id], v[i].second + dy[id]))
v[i].first += dx[id], v[i].second += dy[id];
}
}
}
for(int i = , z = q.size(); i < z; ++i) {
int id = q[i];
putchar(ch[id]);
}
return ;
}
ACM-ICPC 2018 南京赛区现场赛 K. Kangaroo Puzzle (思维+构造)的更多相关文章
- ACM-ICPC 2018 青岛赛区现场赛 K. Airdrop && ZOJ 4068 (暴力)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4068 题意:吃鸡游戏简化为二维平面上有 n 个人 (xi,yi) ...
- ACM-ICPC 2018 南京赛区现场赛 E. Eva and Euro coins (思维)
题目链接:https://codeforc.es/gym/101981/attachments 题意:给出两个只包含01的字符串,每次可以选择连续k个相同的数字进行翻转,问能否通过若干次操作把两个字符 ...
- ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 2013ACM/ICPC亚洲区南京站现场赛---Poor Warehouse Keeper(贪心)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4803 Problem Description Jenny is a warehouse keeper. ...
- HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛)
HDU 4046 Panda (ACM ICPC 2011北京赛区网络赛) Panda Time Limit: 10000/4000 MS (Java/Others) Memory Limit: ...
- ICPC 2018 徐州赛区网络赛
ACM-ICPC 2018 徐州赛区网络赛 去年博客记录过这场比赛经历:该死的水题 一年过去了,不被水题卡了,但难题也没多做几道.水平微微有点长进. D. Easy Math 题意: ...
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- ACM总结——2017ACM-ICPC北京赛区现场赛总结
现在距离比赛结束已经过了一个多星期了,也是终于有时间写下心得了.回来就是被压着做项目,也是够够的. 这次比赛一样是我和两个学弟(虽然是学弟,但我的实力才是最弱的T_T)一起参加的,成绩的话打铁,算是情 ...
随机推荐
- tomcat启动时报No rules found matching 'Server/Service/Engine/Host/context'
tomcat是8.0版本. 在eclipse启动时,第二行报这个, 同时项目也没加载(tomcat启动成功了). 网上搜了半天, 试了半天, 没搞定. 最后不经意间发现: <Context do ...
- ubuntu supervisor管理uwsgi+nginx
一.概述 superviosr是一个Linux/Unix系统上的进程监控工具,他/她upervisor是一个Python开发的通用的进程管理程序,可以管理和监控Linux上面的进程,能将一个普通的命令 ...
- 你也可以写个聊天程序 - C# Socket学习1
原文:你也可以写个聊天程序 - C# Socket学习1 简述 我们做软件工作的虽然每天都离不开网络,可网络协议细节却不是每个人都会接触和深入了解.我今天就来和大家一起学习下Socket,并写一个简单 ...
- mssql server 排序 以及like语句
当我们按照某个字段排序时,通常使用order by语句,如果该字段存在null值,则会把null值的这条放到最上面, 那我们是否有办法解决呢? 答案是肯定的: ORDER BY CASE WHEN O ...
- WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建
WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建 四月 4, 2019 作者:李超,音视频技术专家.本文首发于 RTC 开发者社区,欢迎在社区留言与作者交流. htt ...
- 30个关于Shell脚本的经典案例(下)
本文目录 21.从FTP服务器下载文件 22.连续输入5个100以内的数字,统计和.最小和最大 23.将结果分别赋值给变量 24.批量修改文件名 25.统计当前目录中以.html结尾的文件总大 26. ...
- Vue学习之npm常用命令及参数小结(十四)
NPM几个常用命令和参数的意思: npm install packagename 安装模块如不指定版本号 默认会安装最新的版本 npm install packagename 0.0.1 安装指定版本 ...
- 单词eschaunge交易所eschaunge交换
Exchange of one person or thing for another; reciprocal giving and receiving: (a) of prisoners of wa ...
- 【OEM】OEM安装维护
[OEM]OEM安装维护 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道 ...
- Java多线程 常见问题整理
线程 什么是线程 线程是指程序在执行过程中,能够执行程序代码的一个执行单元. 线程和进程的区别 线程:一段程序执行过程中的一个执行单元,各个线程之间共享程序的内存空间以及一些进程级的资源,各线程拥有自 ...