请求添加 SPJ
查看原帖
请求添加 SPJ
60864
tiger2005楼主2022/1/25 12:37

写完了才发现有人已经搬运了 LOJ 的……

先把我的版本放在这里,管理人员可以考虑选择哪个。

#include "testlib.h"
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

int N, A[5000], B[5000];

pair<int, int> mn[5000 << 2], mx[5000 << 2];

void pushUp(int x){
    mn[x] = min(mn[x<<1], mn[(x<<1)+1]);
    mx[x] = max(mx[x<<1], mx[(x<<1)+1]);
}
void bul(int x, int l, int r){
    if(l == r){
        mn[x] = mx[x] = make_pair(A[l], l);
        return;
    }
    int m = (l + r) >> 1;
    bul(x<<1, l, m);
    bul((x<<1)+1, m+1, r);
    pushUp(x);
}

void mdf(int x, int l, int r, int p, int k){
    if(l == r){
        A[l] = k;
        mn[x] = mx[x] = make_pair(k, p);
        return;
    }
    int m = (l + r) >> 1;
    if(p <= m)
        mdf(x<<1, l, m, p, k);
    else
        mdf((x<<1)+1, m+1, r, p, k);
    pushUp(x);
}
pair<int, int> queMn(int x, int l, int r, int ll, int rr){
    if(ll <= l && r <= rr)
        return mn[x];
    pair<int, int> ret(1e9, 0);
    int m = (l + r) >> 1;
    if(ll <= m)
        ret = queMn(x<<1, l, m, ll, rr);
    if(rr > m)
        ret = min(ret, queMn((x<<1)+1, m+1, r, ll, rr));
    return ret;
}
pair<int, int> queMx(int x, int l, int r, int ll, int rr){
    if(ll <= l && r <= rr)
        return mx[x];
    pair<int, int> ret(0, 0);
    int m = (l + r) >> 1;
    if(ll <= m)
        ret = queMx(x<<1, l, m, ll, rr);
    if(rr > m)
        ret = max(ret, queMx((x<<1)+1, m+1, r, ll, rr));
    return ret;
}

int main(int argc, char ** argv){
    registerTestlibCmd(argc, argv);
    // input data
    N = inf.readInt();
    for(int i=1; i<=N; i++)
        A[i] = inf.readInt();
    for(int i=1; i<=N; i++)
        B[i] = inf.readInt();
    bul(1, 1, N);
    // output data
    int Q = ouf.readInt(0, 300000, "Q");
    int a = 0, b = 0;
    for(int i=1; i<=Q; i++){
        a = ouf.readInt(1, N, "a" + to_string(i));
        b = ouf.readInt(1, N, "b" + to_string(i));
        if(a > b)
            quitf(_wa, "Range error: l > r!");
        if(a != b){
            pair<int, int> mx = queMx(1, 1, N, a, b);
            pair<int, int> mn = queMn(1, 1, N, a, b);
            mdf(1, 1, N, mx.second, mn.first);
            mdf(1, 1, N, mn.second, mx.first);
        }
    }
    // answer check
    for(int i=1; i<=N; i++) if(A[i] != B[i])
        quitf(_wa, "Answer sequence not match!");

    quitf(_ok, "Answer correct!");
    return 0;
}

2022/1/25 12:37
加载中...