求助ABC D卡常
  • 板块学术版
  • 楼主wcyQwQ
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/10/15 21:48
  • 上次更新2023/10/27 07:21:36
查看原帖
求助ABC D卡常
587248
wcyQwQ楼主2022/10/15 21:48

RT,赛时想出来了二分做法,一直T三个点,whatshouldido

#include <bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10;
map<int, int> v1;
int idx;
vector<int> f[N], g[N];

inline int get_pre(vector<int> a, int x)
{
    if (x < a[0]) return -1;
    int l = 0, r = a.size() - 1;
    while (l < r)
    {
        int mid = (l + r + 1) >> 1;
        if (a[mid] > x) r = mid - 1;
        else l = mid;
    }
    return a[l] + 1;
}

inline int get_nxt(vector<int> a, int x)
{
    if (x > a[a.size() - 1]) return -1;
    int l = 0, r = a.size() - 1;
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (a[mid] < x) l = mid + 1;
        else r = mid;
    }
    return a[l] - 1;
}

inline int read()
{
    int x = 0, y = 1; char c = getchar();
    while (c < '0' || c > '9') {if (c == '-') y = -1; c = getchar();}
    while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * y;
}

int main()
{
    int n, m, s, t;
    n = read(), m = read(), s = read(), t = read();
    int k;
    k = read();
    for (int i = 1; i <= k; i++)
    {
        int x, y;
        x = read(), y = read();
        if (!v1[x]) v1[x] = ++idx;
        if (!v1[y]) v1[y] = ++idx; 
        f[v1[x]].push_back(y);
        g[v1[y]].push_back(x);
    }
    for (int i = 1; i <= idx; i++)
        sort(f[i].begin(), f[i].end()), sort(g[i].begin(), g[i].end());
    int q;
    q = read();
    while (q--)
    {
        char op;
        int l;
        cin >> op;
        l = read();
        if (op == 'L')
        {
            int y = v1[s];
            if (!f[y].size()) t = max(1, t - l);
            else
            {
                int x = get_pre(f[y], t);
                if (x == -1) t = max(1, t - l);
                else t = max(x, t - l);
            }
        }
        else if (op == 'U')
        {
            int y = v1[t];
            if (!g[y].size()) s = max(1, s - l);
            else
            {
                int x = get_pre(g[y], s);
                if (x == -1) s = max(1, s - l);
                else s = max(x, s - l);
            }
        }
        else if (op == 'R')
        {
            int y = v1[s];
            if (!f[y].size()) t = min(m, t + l);
            else
            {
                int x = get_nxt(f[y], t);
                if (x == -1) t = min(m, t + l);
                else t = min(x, t + l);
            }
        }
        else
        {
            int y = v1[t];
            if (!g[y].size()) s = min(n, s + l);
            else
            {
                int x = get_nxt(g[y], s);
                if (x == -1) s = min(n, s + l);
                else s = min(x, s + l);
            }
        }
        printf("%d %d\n", s, t);
    }
    return 0;
}
2022/10/15 21:48
加载中...