1 条题解
-
0
自动搬运
来自洛谷,原作者为

ShwStone
水出天际就叫水哥搬运于
2025-08-24 22:27:32,当前版本为作者最后更新于2021-10-07 11:29:45,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题解 princeza
本蒟蒻的第一篇题解,求过啊题目描述
Luka(女司机)把卡车停在湖边。Barica,Luka 知道她亲吻Barica,她会变成一个美丽的公主。但是,她需要先抓住她! 可以用一对坐标定义湖面上植物的位置。Barica 可以从 植物跳跃到其它植物所在位置, 为任意正整数,下面给出了4种跳跃方式:
方向 A: 。
方向 B: 。
方向 C: 。
方向 D: 。
Barica选择四个方向之一,然后沿所选方向跳到该方向的第一个植物上。如果在选定的方向上没有植物,Barica将留在原处。
Barica跳完这一步之后,原来位置的植物将立马消失了。知道植物的位置和 Barica 选择的方向顺序后,Luka 希望确定Barica 最终将停留的植物的坐标。Luka 将在Barica最终的位置等她,亲吻她。编写一个解决Luka 问题的程序,并帮助她变成美丽的公主。
思路分析
显然,Barica只能沿着对角线方向跳。
但直接沿着对角线枚举太慢了,所以,对于每个节点,我们维护四个指针,指向其左上、右上、左下、右下的点,这样就可以在 的复杂度模拟。
但为了建立这个图,我们需要 进行排序。
AC代码
#include <bits/stdc++.h> using namespace std; #define uns unsigned #define ll long long #define use_cin_cout do {ios::sync_with_stdio(false); /*cin.tie();*/} while(false) #define endl '\n' const ll inf_ll = 0x3f3f3f3f3f3f3f3f; const int inf = 0x3f3f3f3f, mod = 1e9 + 7; const int maxn = 1e5 + 5; struct pos { int x, y, d1, d2, flag[4]; }; int n, k; int id[maxn]; char dir[maxn]; pos graph[maxn]; bool d1_compare(int a, int b) { return graph[a].d1 < graph[b].d1 || graph[a].d1 == graph[b].d1 && graph[a].d2 < graph[b].d2; } bool d2_compare(int a, int b) { return graph[a].d2 < graph[b].d2 || graph[a].d2 == graph[b].d2 && graph[a].d1 < graph[b].d1; } int main() { use_cin_cout; // freopen("princeza.in", "r", stdin); // freopen("princeza.out", "w", stdout); cin >> n >> k; cin >> dir + 1; for (int i = 1; i <= n; i++) { cin >> graph[i].x >> graph[i].y; graph[i].d1 = graph[i].x + graph[i].y; graph[i].d2 = graph[i].x - graph[i].y; for (int j = 0; j < 4; j++) graph[i].flag[j] = -1; id[i] = i; } sort(id + 1, id + n + 1, d1_compare); for (int i = 2; i <= n; i++) { if (graph[id[i - 1]].d1 == graph[id[i]].d1) { graph[id[i - 1]].flag[1] = id[i]; graph[id[i]].flag[2] = id[i - 1]; } } sort(id + 1, id + n + 1, d2_compare); for (int i = 2; i <= n; i++) { if (graph[id[i - 1]].d2 == graph[id[i]].d2) { graph[id[i - 1]].flag[0] = id[i]; graph[id[i]].flag[3] = id[i - 1]; } } int result = 1; for (int i = 1; i <= k; i++) { int nxt = graph[result].flag[dir[i] - 'A']; if (nxt == -1) continue; for (int j = 0; j < 4; j++) { if (graph[result].flag[j] != -1){ graph[graph[result].flag[j]].flag[3 - j] = graph[result].flag[3 - j]; } } result = nxt; } cout << graph[result].x << ' ' << graph[result].y << endl; return 0; }
- 1
信息
- ID
- 5757
- 时间
- 1000ms
- 内存
- 32MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者