TLE on #41
查看原帖
TLE on #41
487539
LCat90楼主2023/12/18 21:37

我认为这份代码复杂度是正确的。单 log。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, q; char s[N];
map < pair <int, int> , vector <int> > f;
int a[N], b[N];
signed main() {
    cin >> n >> q;
    int X = 0, Y = 0;
    scanf("%s", s + 1);
    f[{0, 0}].push_back(0);
    for(int i = 1;i <= n; ++i) {
        if(s[i] == 'L') X --;
        if(s[i] == 'R') X ++;
        if(s[i] == 'U') Y ++;
        if(s[i] == 'D') Y --;
        f[{X, Y}].push_back(i); 
        a[i] = X, b[i] = Y;
        // cout << X << " " << Y << "\n";
    }
    for(int i = 1, l, r, x, y;i <= q; ++i) {
        scanf("%d %d %d %d", &x, &y, &l, &r); bool ff = 0;
        vector <int> g = f[{x, y}]; 
        if(g.size() and (g[0] < l or g[g.size() - 1] >= r)) ff = 1; //puts("1");
        else  {
            g = f[{a[l - 1] + a[r] - x, b[l - 1] + b[r] - y}];
            if(!g.size()) { puts("NO"); continue ; }
            int L = 0, R = g.size() - 1;
            // puts("2");
            while(L < R) {
                int mid = L + R >> 1;
                if(g[mid] < l) L = mid + 1;
                else R = mid; 
                // cout << L <<"\n";
            }
            // puts("3");
            // cout << g[L] << ": " << a[l - 1] + a[r] - x << " " << b[l - 1] + b[r] - y << "\n";
            if(g[L] < r and g[L] >= l) ff = 1;
        }  
        puts(ff ? "YES" : "NO");
    }
    return 0;
}
/*
首先我们计算出原来的顺序能否过 (x, y)
然后考虑反转的影响  发现对于所有点,有 
x1 + x2 = 2x
y1 + y2 = 2y
*/
2023/12/18 21:37
加载中...