1 条题解

  • 0
    @ 2026-6-19 10:30:27

    📝 题目大意

    高桥君从原点 (0,0)(0,0) 出发,按照字符串 SS 中的指令(R/L/U/D)进行 NN 次移动。判断在移动过程中(包括起点和终点),是否曾到达过同一个坐标两次或以上。

    💡 解题思路

    1. 题目分析N2×105N \leq 2 \times 10^5,需要 O(N)O(N)O(NlogN)O(N \log N) 的算法。直接模拟移动过程,并用一个哈希结构记录访问过的坐标即可。关键在于,一共访问了 N+1N+1 个位置(起点 + 每次移动后的终点),如果所有位置互不相同,则集合大小应为 N+1N+1;否则说明有重复访问。

    2. 算法推导

      • 使用 set<pair<int,int>>(即 st)记录所有访问过的坐标。
      • 将起点 (0,0)(0,0) 插入 st,并用 pair<int,int> p 维护当前位置。
      • 遍历字符串 SS 的每个字符 s[i]
        • 'R'p.first++(向右)
        • 'L'p.first--(向左)
        • 'U'p.second++(向上)
        • 'D'p.second--(向下)
        • 每次移动后,将新的 p 插入 st
      • 最终判断:若 st.size() == n + 1,说明所有 N+1N+1 个位置均不重复,输出 "No";否则输出 "Yes"
    3. 边界与细节

      • 起点 (0,0)(0,0) 必须插入集合,且需要先插入再开始遍历(代码中 st.insert(p) 在循环前执行)。
      • 注意输出大小写:"Yes" / "No"(首字母大写,其余小写)。
      • 坐标可能为负数,pair<int,int> 可以正常存储和比较,无需额外处理。
      • 使用 set 的插入和查找均为 O(logN)O(\log N)unordered_set 需要自定义哈希,此处 set 足够。

    ⏱️ 复杂度分析

    • 时间复杂度O(NlogN)O(N \log N),遍历字符串 O(N)O(N),每次 set 插入 O(logN)O(\log N)
    • 空间复杂度O(N)O(N),最坏情况下集合存储 N+1N+1 个坐标。

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        // 使用 set 记录所有访问过的坐标
        set<pair<int,int>> st;
    
        string s;
        cin >> s;
    
        // 当前位置,初始为原点 (0, 0)
        pair<int,int> p;
        p.first = 0;
        p.second = 0;
        st.insert(p);  // 起点也要记录
    
        for(int i = 0 ; i < n ; i++){
            // 根据指令更新坐标
            if(s[i] == 'R'){
                p.first++;   // 右移:x + 1
            }
            else if(s[i] == 'L'){
                p.first--;   // 左移:x - 1
            }
            else if(s[i] == 'U'){
                p.second++;  // 上移:y + 1
            }
            else{
                p.second--;  // 下移:y - 1
            }
    
            st.insert(p);  // 将新位置加入集合
        }
    
        // 若集合大小等于 N+1,说明所有位置互不相同
        if(st.size() == n+1){
            cout << "No";
        }
        else{
            cout << "Yes";
        }
    }
    
    • 1

    信息

    ID
    686
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者