CF413E Maze 2D

看起来很可以用线段树。因为两个区间合并最短路是正确的,所有线段树是对的。对于一个区间 $[l,r]$ 维护左边到右边的四种最短路即可。pushup 是枚举一个中转点。很简单,没有 $2200$ 难度的。

#include <bits/stdc++.h>
#define int long long
#define ls (u << 1)
#define rs (u << 1 | 1)
#define mid (l + r >> 1)
#define lc ls, l, mid
#define rc rs, mid + 1, r
#define rt 1, 1, n

using namespace std;

const int maxn = 2e5 + 10;
const int inf = 1e9;

struct node {
    int uu, dd, ud, du;
    node() = default;
};

int n, q;
char s[3][maxn];
node tr[maxn << 2];

node pushup(node l, node r) {
    node u;
    u.uu = min(l.uu + r.uu + 1, l.ud + r.du + 1);
    u.dd = min(l.du + r.ud + 1, l.dd + r.dd + 1);
    u.ud = min(l.uu + r.ud + 1, l.ud + r.dd + 1);
    u.du = min(l.du + r.uu + 1, l.dd + r.du + 1);
    return u;
}

void build(int u, int l, int r) {
    if (l == r) {
        tr[u].uu = tr[u].dd = 0;
        tr[u].ud = tr[u].du = 1;
        if (s[1][l] == 'X') tr[u].uu = tr[u].ud = tr[u].du = inf;
        if (s[2][l] == 'X') tr[u].dd = tr[u].ud = tr[u].du = inf;
        return;
    }
    build(lc), build(rc);
    tr[u] = pushup(tr[ls], tr[rs]);
}

node query(int u, int l, int r, int ql, int qr) {
    if (ql <= l && r <= qr) return tr[u];
    node x, y;
    if (ql <= mid) x = query(lc, ql, qr);
    if (qr > mid) y = query(rc, ql, qr);
    if (ql <= mid && qr > mid) return pushup(x, y);
    if (ql <= mid) return x;
    if (qr > mid) return y;
}

void f(int x) {
    cout << (x >= inf ? -1 : x) << endl;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> q >> (s[1] + 1) >> (s[2] + 1);
    build(rt);
    while (q--) {
        int u, v, l, r;
        cin >> u >> v, l = u, r = v;
        if (u > n) l = u - n;
        if (v > n) r = v - n;
        if (l > r) swap(l, r), swap(u, v);
        node ans = query(rt, l, r);
        if (u > n && v > n) f(ans.dd);
        else if (u > n) f(ans.du);
        else if (v > n) f(ans.ud);
        else f(ans.uu);
    }
    return 0;
}
posted @   TernaKagiri  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示