样例已过,全wa(悬关)

P2839 [国家集训队] middle

u_lcp @ 2024-07-23 14:55:53


#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define mid ((l+r)>>1)
#define ls t[o].lc
#define rs t[o].rc
int n;
struct sgt
{
    int lmx,rmx,sum,lc,rc;
}t[N<<5];
int cnt,rt[N];
void pushup(int o)
{
    t[o].lmx=max(t[ls].lmx,t[ls].sum+t[rs].lmx);
    t[o].rmx=max(t[rs].rmx,t[rs].sum+t[ls].rmx);
    t[o].sum=t[ls].sum+t[rs].sum;
}
void build(int &o,int l,int r)
{
    o=++cnt;
    if(l==r)
    {
        t[o].lmx=t[o].rmx=t[o].sum=1;
        return;
    }
    build(ls,l,mid),build(rs,mid+1,r);
    pushup(o);
}
void modify(int &o,int p,int l,int r,int idx)
{
    t[o=++cnt]=t[p];
    if(l==r)
    {
        t[o].lmx=t[o].rmx=t[o].sum=-1;
        return;
    }
    if(idx<=mid)modify(ls,t[p].lc,l,mid,idx);
    else modify(rs,t[p].rc,mid+1,r,idx);
    pushup(o);
}
sgt query(int o,int l,int r,int ql,int qr)
{
    if(ql<=l&&r<=qr)return t[o];
    if(qr<=mid)return query(ls,l,mid,ql,qr);
    else if(ql>mid)return query(rs,mid+1,r,ql,qr);
    else
    {
        sgt a=query(ls,l,mid,ql,qr),b=query(rs,mid+1,r,ql,qr);
        return (sgt){max(a.lmx,a.sum+b.lmx),max(b.rmx,b.sum+a.rmx),a.sum+b.sum,0,0};
    }
}
int aa[N],id[N];
int a,b,c,d,kk;
bool check(int x)
{
    sgt ans;int res=0;
    if(b+1<=c-1)ans=query(rt[x],1,n,b+1,c-1);res+=ans.sum;
    if(a<=b)ans=query(rt[x],1,n,a,b);res+=ans.rmx;
    if(c<=d)ans=query(rt[x],1,n,c,d);res+=ans.lmx;
    return res>=0;
}
bool cmp(int x,int y)
{
    return aa[x]<aa[y];
}
int Q,q[10];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&aa[i]),id[i]=i;
    kk=n;
    build(rt[1],1,kk);
    sort(id+1,id+n+1,cmp);
    for(int i=2;i<=n;i++)
    {
        modify(rt[i],rt[i-1],1,kk,id[i-1]);
    }
    scanf("%d",&Q);
    for(int i=1,x=0;i<=Q;i++)
    {
        scanf("%d%d%d%d",&q[0],&q[1],&q[2],&q[3]);
        for(int j=0;j<=3;j++)q[i]=(q[i]+x)%n+1;
        sort(q,q+4);
        a=q[0],b=q[1],c=q[2],d=q[3];
        int l=1,r=n;
        while(l<=r)
        {
            if(check(mid))x=aa[id[mid]],l=mid+1;
            else r=mid-1;
        }
        printf("%d\n",x);
    }
    return 0;
}

by u_lcp @ 2024-07-25 20:54:56

已过,此帖结


|