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)一起参加的,成绩的话打铁,算是情 ...
随机推荐
- RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
每篇一句 人圆月圆心圆,人和家和国和---中秋节快乐 前言 在阅读本篇之前,建议先阅读开山篇效果更佳.RestTemplate是Spring提供的用于访问Rest服务的客户端工具,它提供了多种便捷访问 ...
- Java8 集合相关操作
// java8 集合快速转成string List<String> cities; String citiesCommaSeparated = String.join(",&q ...
- python 打包前三天日志
日志格式 app-2019-07-24.log app-2019-07-24.1.log 该脚本适合一天之内有多个日志文件 # /usr/bin/python #-*- coding: utf-8 - ...
- Quartz时间配置(周期任务)
序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - ...
- C ProcessAsUser
class Interop { public static void CreateProcess(string app, string path) { bool result; IntPtr hTok ...
- form表单提交数据给后台
1.完整登录示例 1. form表单往后端提交数据注意三点 1.所有获取用户输入标签都应该放在form表单里面 2.action属性控制往哪儿提交,method一般都是设置成post 3.提交按钮必须 ...
- Excel 2010同时打开2个或多个独立窗口
亲测有效 参考下面的网址 https://jingyan.baidu.com/article/86fae346acca7d3c49121ad4.html 1. 在win+r 输入框里面输入“rege ...
- kali之使用sqlmap进行sql注入
sqlmap简介 sqlmap支持五种不同的注入模式: 1.基于布尔的盲注,即可以根据返回页面判断条件真假的注入. 2.基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是 ...
- Oracle数据库之操作符及函数
一.操作符: 1.分类: 算术.比较.逻辑.集合.连接: 2.算术操作符: 执行数值计算: -- 工资加1000 from emp; 3.比较操作符: -- 比较运算符(between and包头不包 ...
- scrapy 爬虫中间件 httperror中间件
源码 class HttpErrorMiddleware(object): @classmethod def from_crawler(cls, crawler): return cls(crawle ...