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