求助,调了两个多小时还是WA

P4097 【模板】李超线段树 / [HEOI2013] Segment

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

有一个非常好的避免这种问题出现的方法——重构代码


|