返回

AtCoder AT_abc291_c 题解

最近在清AtCoder的Beginner Contest的水题的时候刷到了一道蛮有意思的水题,也因为经验不够被这道题卡了不少时间,于是想要把自己的思路与做法记录一下。

题意

大致就是模拟一下坐标,然后求走过的坐标是否有重叠,如果有输出Yes,没有就输出No.要注意的是初始坐标与最后一个坐标也要判断。

思路过程

乍一看,好像是随随便便就能秒的题目。
看起来整个题目要做的,就是模拟高桥君走过的坐标,然后遍历坐标,如果遍历到了重复的坐标就输出Yes,没有的话就输出No.
很天真的我就这么干了,于是被鸽子狠狠踢了。
再仔细看看题目,数据的范围是$1≤N≤2×10^{5}$,欸不对啊,如果暴力遍历的话是绝对会TLE的。
随后选择了开结构体,开自定义sort对坐标进行排序,之后一个一个在前后去进行比较,这样时间复杂度就能够得到大大的降低。
然后过了,下面忘了

上代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=200001;
int cnt;
char inst[MAXN];

struct path
{
    int x,y;
}p[MAXN]={0};

bool cmp(path a, path b)
{
    if (a.x != b.x)
    {
        return a.x < b.x;
    }
    return a.y < b.y;
}

int main()
{
    cin >> cnt;
    for (int i=1; i<=cnt; i++)
    {
        cin >> inst[i];
    }
    for (int i=1; i<=cnt; i++)
    {
        p[i].x=p[i-1].x;
        p[i].y=p[i-1].y;
        if(inst[i]=='R')
        {
            p[i].x++;
        }
        else if(inst[i]=='L')
        {
            p[i].x--;
        }
        else if(inst[i]=='U')
        {
            p[i].y++;
        }
        else if(inst[i]=='D')
        {
            p[i].y--;
        }
    }
    sort(p,p+cnt+1,cmp);
    for (int i=1; i<=cnt; i++)
    {
        if (p[i].x==p[i-1].x&&p[i].y==p[i-1].y)
        {
            cout << "Yes" << endl;
            return 0;
        }
    }
    cout << "No" << endl;
    return 0;
}
Made with ❤
使用 Hugo 构建
主题 StackJimmy 设计