神奇 C++& 警示后人

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

D0000 @ 2024-07-15 21:57:14

我一开始代码里面有几个错误,但是也许 Subtask #0 太水了,居然过了好几个点,然后神奇的事情发生了:

同一份代码:

#include<cstdio>
#include<algorithm>
int n,lastans,cnt=0;
struct seg{
    int x0,y0,x1,y1;
    double aa,bb;
    int id;
    void in(int x){
        scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
        x0=((x0+lastans-1)%39989)+1;
        x1=((x1+lastans-1)%39989)+1;
        y0=((y0+lastans-1)%1000000000)+1;
        y1=((y1+lastans-1)%1000000000)+1;
        id=x;
        if(x0==x1){
            if(y0>y1)y1=y0;
            aa=0,bb=y1;
            return;
        }
        aa=1.0*(y1-y0)/(x1-x0);
        bb=y0-aa*x0;
        if(x0>x1){
            int yyy=x0;
            x0=x1;
            x1=yyy;
        }
    }
};
struct node{
    seg tag;
}sgt[400000];
void build(int l=1,int r=39989,int o=1){
    seg zyh;
    zyh.id=0;
    zyh.x0=l,zyh.x1=r;
    zyh.y0=zyh.y1=0;
    zyh.aa=zyh.bb=0;
    sgt[o].tag=zyh;
    if(l==r)return;
    else{
        int mid=(l+r)>>1;
        build(l,mid,o*2);
        build(mid+1,r,o*2+1);
    }
}
double jisuan(seg zyh,int xxx){
    return zyh.aa*xxx+zyh.bb;
}
void push_down(seg zyh,int l,int r,int o){
    int mid=(l+r)>>1;
    if(jisuan(zyh,mid)>jisuan(sgt[o].tag,mid)||(jisuan(zyh,mid)==jisuan(sgt[o].tag,mid)&&sgt[o].tag.id>zyh.id)){
        seg ddx=zyh;
        zyh=sgt[o].tag;
        sgt[o].tag=ddx;
    }
    if(jisuan(zyh,l)<=jisuan(sgt[o].tag,l)&&jisuan(zyh,r)<=jisuan(sgt[o].tag,r))return;
    if(jisuan(zyh,l)<=jisuan(sgt[o].tag,l))push_down(zyh,mid+1,r,o*2+1);
    else push_down(zyh,l,mid,o*2);
}
void add(seg zyh,int l=1,int r=39989,int o=1){//printf("(%d,%d)",l,r);
    if(zyh.x0<=l&&zyh.x1>=r){
        push_down(zyh,l,r,o);
        return;
    }
    int mid=(l+r)>>1;
    if(zyh.x0<=mid)add(zyh,l,mid,o*2);
    if(zyh.x1>mid)add(zyh,mid+1,r,o*2+1);
}
seg qu(int xx,int l=1,int r=39989,int o=1){
    seg maxx,dhx;
    maxx.aa=sgt[o].tag.aa*xx+sgt[o].tag.bb,maxx.id=sgt[o].tag.id;
    if(l==r)return maxx;
    int mid=(l+r)>>1;
    if(xx<=mid)dhx=qu(xx,l,mid,o*2);
    else dhx=qu(xx,mid+1,r,o*2+1);
    if(dhx.aa*xx+dhx.bb>maxx.aa)maxx.aa=dhx.aa*xx+dhx.bb,maxx.id=dhx.id;
    return maxx;
}
int main(){
    scanf("%d",&n);
    build();
    while(n--){
        int op,x;
        seg zyh;
        scanf("%d",&op);
        if(op==0){
            scanf("%d",&x);
            x=((x+lastans-1)%39989)+1;
            lastans=qu(x).id;
            printf("%d\n",lastans);
        }
        else{
            zyh.in(++cnt);
            add(zyh);
        }
    }
} 

C++ 11(O2):AC 4

C++ 14 (GCC) (O2) :AC 6

C++ 14 (GCC) :AC 7(全部 Subtask #0)

这个题 Subtask #0 太水了,向我这种有大问题的代码都能过。所以哪怕全部过了也不要掉以轻心,检查代码里有没有细节问题。

最后,我 WA 了 #5。然后加了句 #define double long double 就过了。

希望能帮到大家!


|