和题解对拍没错结果30分?

P2839 [国家集训队] middle

he_____he @ 2018-05-24 18:14:56

有没有大佬能够帮我检查一下代码,十分感谢

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

struct node{
    int lch,rch;
    int val,lmax,rmax;
}t[3000000],nul;

int n,m,a,b,c,d,Q,ans,tot=0;
int ar[200005],p[200005],vs[200005],rnk[200005];

int readint(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}

void buildtree(int id,int l,int r){
    t[id].val=t[id].lmax=t[id].rmax=r-l+1;
    if(l==r)
        return;
    int mid=(l+r)/2;
    buildtree(t[id].lch=++tot,l,mid);
    buildtree(t[id].rch=++tot,mid+1,r);
}

int change(int id,int l,int r,int p){
    int root=++tot;
    t[root]=t[id];
    if(l==r){
        t[root].val=t[root].lmax=t[root].rmax=-1;
        return root;
    }
    int mid=(l+r)/2;
    if(p<=mid)
        t[root].lch=change(t[id].lch,l,mid,p);
    else
        t[root].rch=change(t[id].rch,mid+1,r,p);
    t[root].val=t[t[root].lch].val+t[t[root].rch].val;
    t[root].lmax=max(t[t[root].lch].lmax,t[t[root].lch].val+t[t[root].rch].lmax);
    t[root].rmax=max(t[t[root].rch].rmax,t[t[root].rch].val+t[t[root].lch].rmax);
    return root;
}

node query(int id,int l,int r,int ql,int qr){
    if(ql>qr)
        return nul;
    if(ql==l&&qr==r)
        return t[id];
    int mid=(l+r)/2;
    if(qr<=mid)
        return query(t[id].lch,l,mid,ql,qr);
    else if(ql>=mid+1)
        return query(t[id].rch,mid+1,r,ql,qr);
    node lson=query(t[id].lch,l,mid,ql,mid),rson=query(t[id].rch,mid+1,r,mid+1,qr),ans;
    ans.val=lson.val+rson.val;
    ans.lmax=max(lson.lmax,lson.val+rson.lmax);
    ans.rmax=max(rson.rmax,rson.val+lson.rmax);
    return ans;
}

bool check(int x){
    if(query(vs[x],1,n,a,b).rmax+query(vs[x],1,n,c,d).lmax+query(vs[x],1,n,b+1,c-1).val>=0)
        return true;
    return false;
}

void divide(int l,int r){
    if(l>r)
        return;
    int mid=(l+r)/2;
    if(check(mid-1)){
        ans=mid;
        divide(mid+1,r);
    }
    else
        divide(l,mid-1);
}

int main(){
    n=readint();
    for(int i=1;i<=n;i++){
        ar[i]=readint();
        p[i]=ar[i];
    }
    sort(p+1,p+n+1);
    buildtree(vs[0]=0,1,n);
    for(int i=1;i<=n;i++)
        rnk[lower_bound(p+1,p+n+1,ar[i])-p]=i;
    for(int i=1;i<=n;i++)
        vs[i]=change(vs[i-1],1,n,rnk[i]);
    Q=readint();
    ans=0;
    int q[4];
    for(int i=1;i<=Q;i++){
        q[0]=readint(); q[1]=readint(); q[2]=readint(); q[3]=readint();
        for(int j=0;j<4;j++)
            q[j]=(q[j]+ans)%n+1;
        sort(q,q+4);
        a=q[0],b=q[1],c=q[2],d=q[3];
        divide(1,n);
        ans=p[ans];
        printf("%d\n",ans);
    }
    return 0;
}

by info___tion @ 2018-05-24 18:54:10

对拍不一定能找出问题


by info___tion @ 2018-05-24 18:55:38

有个小建议:最好把divide函数改成用while迭代运行,不然总感觉这样二分会爆炸


by info___tion @ 2018-05-24 18:56:14

诶?话说middle这一题我今天刚刚a掉了……


by info___tion @ 2018-05-24 18:59:09

还有,你的主席树在建树(就是buildtree那个函数)的时候好像没有pushup


by 吹雪吹雪吹 @ 2018-05-24 19:33:18

为什么不先mo随机数之神呢(逃


by Refun @ 2018-05-24 19:42:16

拍不出错来很有可能是数据构造的问题……?QwQ


|