30pts 求调
查看原帖
30pts 求调
383395
WaterSun楼主2024/1/25 10:37

调了一天了,调崩了。

只能过 #1 到 #7。

#include <bits/stdc++.h>
#define re register

using namespace std;

const int N = 2e4 + 10,inf = 1e9 + 10;
int n,m,q,lst;
int A,B,C,D;
int Q[10],rt[N],arr[N];
vector<int> p,v[N];

inline int read(){
    int r = 0,w = 1;
    char c = getchar();
    while (c < '0' || c > '9'){
        if (c == '-') w = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9'){
        r = (r << 3) + (r << 1) + (c ^ 48);
        c = getchar();
    }
    return r * w;
}

struct PST{
    #define ls(u) (tr[u].l)
    #define rs(u) (tr[u].r)

    int idx;

    struct node{
        int l,r;
        int sum,lmax,rmax;
    }tr[N << 5];

    node friend operator +(const node &a,const node &b){
        node res;
        res.sum = a.sum + b.sum;
        res.lmax = max(a.lmax,a.sum + b.lmax);
        res.rmax = max(b.rmax,a.rmax + b.sum);
        return res;
    }

    inline void pushup(int u){
        node res = tr[ls(u)] + tr[rs(u)];
        tr[u].sum = res.sum;
        tr[u].lmax = res.lmax;
        tr[u].rmax = res.rmax;
    }

    inline int build(int l,int r){
        int u = ++idx;
        if (l == r){
            tr[u].sum = tr[u].lmax = tr[u].rmax = 1;
            return u;
        }
        int mid = l + r >> 1;
        tr[u] = {build(l,mid),build(mid + 1,r)};
        pushup(u);
        return u;
    }

    inline int insert(int u,int l,int r,int k){
        int p = ++idx;
        tr[p] = tr[u];
        if (l == r){
            tr[p].sum = tr[p].lmax = tr[p].rmax = -1;
            return p;
        }
        int mid = l + r >> 1;
        if (k <= mid) ls(p) = insert(ls(u),l,mid,k);
        else rs(p) = insert(rs(u),mid + 1,r,k);
        pushup(p);
        return p;
    }

    inline node query(int u,int l,int r,int ql,int qr){
        if (ql <= l && r <= qr) return tr[u];
        node res = {0,0,0,-inf,-inf};
        int mid = l + r >> 1;
        if (ql <= mid) res = res + query(ls(u),l,mid,ql,qr);
        if (qr > mid) res = res + query(rs(u),mid + 1,r,ql,qr);
        return res;
    }

    #undef ls
    #undef rs
}T;

inline bool check(int x){
    int sum = 0;
    if (C - B > 1) sum = T.query(rt[x],1,n,B + 1,C - 1).sum;
    sum += T.query(rt[x],1,n,A,B).rmax + T.query(rt[x],1,n,C,D).lmax;
    return (sum >= 0);
}

int main(){
    n = read();
    for (re int i = 1;i <= n;i++){
        arr[i] = read();
        p.push_back(arr[i]);
    }
    sort(p.begin(),p.end());
    p.erase(unique(p.begin(),p.end()),p.end());
    m = p.size();
    for (re int i = 1;i <= n;i++){
        arr[i] = lower_bound(p.begin(),p.end(),arr[i]) - p.begin() + 1;
        v[arr[i]].push_back(i);
    }
    rt[0] = T.build(1,n);
    for (re int i = 1;i <= m;i++){
        rt[i] = rt[i - 1];
        for (auto it:v[i]) rt[i] = T.insert(rt[i - 1],1,n,it);
    }
    q = read();
    while (q--){
        for (re int i = 0;i < 4;i++) Q[i] = (read() + lst) % n + 1;
        sort(Q,Q + 4);
        A = Q[0],B = Q[1],C = Q[2],D = Q[3];
        int l = 1,r = m;
        while (l < r){
            int mid = l + r + 1 >> 1;
            if (check(mid)) l = mid;
            else r = mid - 1;
        }
        lst = p[l];
        printf("%d\n",lst);
    }
    return 0;
}
2024/1/25 10:37
加载中...