[ABC219F] Cleaning Robot 题解
[ABC219F] Cleaning Robot 题解
思路解析
要点:将整个图拆分成每一轮的每一个点单独考虑贡献。
首先看到
其中红线代表经过的位置和线路,黑线代表起点与各个点之间的偏移量。由此可见不论如何移动起点,它移动所形成的形状是不会改变的。
了解完这个规律之后就很好理解了。我们可以先做出来第一次所经过的所有点的位置,由于起点和终点的偏移量不会改变的特点,我们在以后每一轮的这一个操作完后的位置,和上一轮进行完这一个操作之后的位置,偏移量也是不会改变的。若不理解,请看下图。
其中红点表示第一次经过的点,蓝点表示第二次经过的点,黑线表示第一轮的当前次序遍历到的点与第二轮的当前次序遍历到的点之间的偏移量。可以发现每一个点的位置与下一轮的位置之间的偏移量也是不会变的,而这个偏移量其实就是每一轮的起点和终点的偏移量,因为每一轮的开始都是上一轮的结束,所以每一轮的起点的偏移量是固定的,那么其他点的偏移量也是固定的。所以这时我们发现,有一些点在下一轮到达了未经过的位置,它对答案造成了贡献(如上图最右边的两个蓝色点),而有一些则又经过了之前已经经过了的其他点,就对答案没有贡献(如上图的其他蓝色点)。
接下来我们则需要思考第一轮中有哪些点对答案有贡献,贡献分别是多少。我们考虑下面这幅图。
红,蓝,绿点分别表示第一,二,三轮经过的点。我们发现后两轮造成了贡献的点只有三个,分别是
明确了答案统计的方式之后,我们需要计算的值就是对于第一次移动遍历到的每一个点,找到加上 vector
存下这条直线上所有的点与起点之间经过的轮数,设
最后就是几个需要注意的小细节:
- 若
,就说明之后的每一轮都不会有新的贡献,直接输出第一轮的贡献即可。 - 若
,为了防止 没有结果,我们交换 和所有的 。 - 若
,为方便计算,我们取反 和所有的 。
code
#include<bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
#define fir first
#define sec second
string str;
long long k;
vector< PII > v;
int dx[150], dy[150];
void init() {
dx['U'] = -1;
dx['D'] = 1;
dy['L'] = -1;
dy['R'] = 1;
}
signed main() {
init();
cin >> str >> k;
int x = 0, y = 0;
v.push_back({x, y});
for(int i = 0; i < (int)str.size(); i++) {
x += dx[(int)str[i]], y += dy[(int)str[i]];
v.push_back({x, y});
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
if(x == 0 && y == 0) {
cout << v.size(); return 0;
}
if(x == 0) {
swap(x, y);
for(auto &it : v) swap(it.fir, it.sec);
}
if(x < 0) {
x = -x;
for(auto &it : v) it.fir = -it.fir;
}
map< PII, vector<int> > mp;
for(auto it : v) {
int nx = it.fir, ny = it.sec;
int mod = (nx % x + x) % x;
mp[{mod, ny - (long long)y * (nx - mod) / x}].push_back((nx - mod) / x);
}
long long ans = 0;
for(auto it : mp) {
sort(it.sec.begin(), it.sec.end());
for(int i = 0; i <= (int)it.sec.size() - 2; i++) {
ans += min(k, (long long)it.sec[i + 1] - it.sec[i]);
}
ans += k;
}
cout << ans;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】