kkxhh @ 2019-02-09 00:57:17
感觉已经要改得和题解差不多了QAQ
求dalao帮忙查下错
#include <cstdio>
#include <algorithm>
using namespace std;
#define lt (o<<1)
#define rt ((o<<1)|1)
typedef struct line{
int lx,rx,num;
double ly,ry;
line() {}
line(int _num,int _lx,int _rx,double _ly,double _ry){
num=_num; lx=_lx; rx=_rx; ly=_ly; ry=_ry;
if(lx==rx) ly=ry=max(ly,ry);
}
double k() {return (ry-ly)/(rx-lx);}
double gety(int x) {return lx==rx?ly:ly+(k()*(x-lx));}
bool empty() {return num==0;}
void operator =(const line &x) {num=x.num; lx=x.lx; rx=x.rx; ly=x.ly; ry=x.ry;}
}line;
const int mod1=39989,mod2=1000000000;
line t[400010];
int n,opt,lastans=0,tot=0;
inline int read(){
int num=0,k=1; char c=getchar();
while(c>'9' || c<'0') k=(c=='-')?0:k,c=getchar();
while(c>='0' && c<='9') num=num*10+c-'0',c=getchar();
return k?num:-num;
}
bool cmp(line a,line b,int p){
double ya=a.gety(p),yb=b.gety(p);
if(ya==yb) return a.num>b.num;
else return ya<yb;
}
void insert(int o,int l,int r,line v){
if(v.lx==l && v.rx==r){
if(t[o].empty()) {t[o]=v; return;}
if(cmp(t[o],v,l) && cmp(t[o],v,r)) {t[o]=v; return;}
if(!cmp(t[o],v,l) && !cmp(t[o],v,l)) return;
int mid=(l+r)>>1;
if(cmp(t[o],v,mid)) swap(t[o],v);
if(l!=r){
if(cmp(t[o],v,l)) insert(lt,l,mid,line(v.num,v.lx,mid,v.ry,v.gety(mid)));
else insert(rt,mid+1,r,line(v.num,mid+1,v.rx,v.gety(mid+1),v.ry));
}
return;
}
int mid=(l+r)>>1;
if(v.lx<=mid) insert(lt,l,mid,line(v.num,v.lx,min(v.rx,mid),v.ly,v.gety(min(v.rx,mid))));
if(v.rx>=mid+1) insert(rt,mid+1,r,line(v.num,max(mid+1,v.lx),v.rx,v.gety(max(mid+1,v.lx)),v.ry));
}
line query(int o,int l,int r,int q){
if(l==r) return t[o];
int mid=(l+r)>>1;
line tmp;
if(q<=mid) tmp=query(lt,l,mid,q);
else tmp=query(rt,mid+1,r,q);
if(!t[o].empty() && cmp(tmp,t[o],q)) tmp=t[o];
return tmp;
}
int main(){
n=read();
while(n--){
opt=read();
if(opt){
int a=read(),b=read(),c=read(),d=read();
a=(a+lastans-1)%mod1+1; c=(c+lastans-1)%mod1+1;
b=(b+lastans-1)%mod2+1; d=(d+lastans-1)%mod2+1;
if(a>c) {swap(a,c); swap(b,d);}
insert(1,1,mod1,line(++tot,a,c,(double)b,(double)d));
}
else{
int q=read(); q=(q+lastans-1)%mod1+1;
lastans=query(1,1,mod1,q).num;
printf("%d\n",lastans);
}
}
}
by kkxhh @ 2019-02-09 01:44:33
最后发现是有两个地方的l和r写反了
我。。。。。
真想打死我自己
by Bean233 @ 2019-02-09 08:34:11
有一个非常好的避免这种问题出现的方法——重构代码