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)一起参加的,成绩的话打铁,算是情 ...
随机推荐
- C# 练习题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?程序分析: 兔子的规律为数列1,1,2,3,5,8, ...
- C# 获取某个时间的0点0分和23点59分59秒
C#获取当月第一天和最后一天 当月第一天0时0分0秒: DateTime.Now.AddDays( - DateTime.Now.Day).Date 当月最后一天23时59分59秒: DateTime ...
- C# vb .net实现轮廓特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的轮廓特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...
- 阿里云ESC服务器配置记录
购买服务器 上周赶着活动购买了一年阿里云服务器,记录一下配置过程: 选择服务器类型: linux服务器,网上说一般都用centOS的"比较新"的版本: 重置密码: 重置密码之后一定 ...
- 【转载】sqlserver中小数类型float和deciaml类型比较
在sqlserver数据库中,float类型和double类型都可以用来表示小数类型,float类型是一种近似数值的小数类型,而decimal类型则是精确数值的小数类型.如果需要在sqlserver数 ...
- 【转载】C#中List集合使用LastIndexOf判断元素最后一次出现的索引位置
在C#的List集合操作中,有时候需要判断元素对象在List集合中第一次出现的索引位置信息,此时需要使用到List集合的IndexOf方法来判断,如果元素存在List集合中,则IndexOf方法返回所 ...
- Ext.create使用(上)
本文介绍前两种使用方法: 通过full name, alias 或者 alternate name实例化一个类 // 别名 // alias var window = Ext.create('widg ...
- 使用原生JS 修改 DIV 属性
本例参考并改进自:https://www.jianshu.com/p/2961d9c317a3 大家可以一起学习!! <!DOCTYPE html> <html lang=" ...
- vue遍历数据是对数据进行筛选 过滤 排序
使用computed 方法来过滤筛选数据;或者使用methods 方式来筛选过滤数据 <body> <div id="app"> <ul> &l ...
- mysql的yearweek 和 weekofyear函数
1.MySQL 的 YEARWEEK 是获取年份和周数的一个函数,函数形式为 YEARWEEK(date[,mode]) 例如 2010-3-14 ,礼拜天 SELECT YEARWEEK('2010 ...