刚学OI的妹子,萌新求教

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

DQYdqy @ 2018-12-21 12:51:03

为什么最后两个点挂了,用标程对拍了1个多小时也没错

Code:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=1e7;
const int pps=1e9;
const int fhq=39989;
typedef double dl;
int n,cnt,ans,t=1;
struct line{
    int l,r;dl k,b;
    inline dl f(int x){return k*x+b;}
    void newnode(int x1,int y1,int x2,int y2){
        if(x1==x2){l=r=x1;k=0;b=max(y1,y2);}
        else{
            if(x1>x2)swap(x1,x2),swap(y1,y2);
            l=x1,r=x2;k=(dl)(y2-y1)/(x2-x1);b=y1-x1*k;
        }
    }
}fun[N*2];
struct sgt{
    int maxans,ansid,tag[N*2];
    inline void ins(int q,int lm,int rm,int id){
        if(fun[id].l>rm||fun[id].r<lm)return ;
        if(fun[id].l<=lm&&fun[id].r>=rm){
            int u1=(fun[id].f(lm)>fun[tag[q]].f(lm));
            int u2=(fun[id].f(rm)>fun[tag[q]].f(rm));
            if(!tag[q]||(u1&&u2)){tag[q]=id;return ;}
            if(u1^u2){
                int mid=(lm+rm)>>1;
                dl key=(fun[id].b-fun[tag[q]].b)/(fun[tag[q]].k-fun[id].k);
                if(key<=mid&&u1)ins(q<<1,lm,mid,id);
                else if(key<=mid&&u2)ins(q<<1,lm,mid,tag[q]),tag[q]=id;
                else if(key>mid&&u1)ins(q<<1|1,mid+1,rm,tag[q]),tag[q]=id;
                else if(key>mid&&u2)ins(q<<1|1,mid+1,rm,id);
            }
        }else{
            int mid=(lm+rm)>>1;
            if(lm==rm)return ;
            ins(q<<1,lm,mid,id);ins(q<<1|1,mid+1,rm,id);
        }
    }
    inline void query(int q,int lm,int rm,int x){
        if(x<lm||x>rm)return ;
        if(tag[q]){
            dl val=fun[tag[q]].f(x);
            if(maxans<val||(maxans==val&&ansid>=tag[q]))
            maxans=val,ansid=tag[q];
        }
        if(lm==rm)return ;
        int mid=(lm+rm)>>1;
        query(q<<1,lm,mid,x);query(q<<1|1,mid+1,rm,x);
    }
    inline int getans(int x){
        ansid=2147483647;maxans=-2147483647;    
        query(1,1,N,x);
        return ansid>=2147483647?0:ansid;
    }
}T;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
signed main(){
    n=read();
    begin:if(t>n)return 0;t++;
    int opt=read();
    if(opt){
        int a,b,c,d;a=read(),b=read(),c=read(),d=read();
        a=(a+ans-1)%fhq+1;b=(b+ans-1)%pps+1;
        c=(c+ans-1)%fhq+1;d=(d+ans-1)%pps+1;
        fun[++cnt].newnode(a,b,c,d);
        T.ins(1,1,N,cnt);
    }else{
        int x=read();x=(x+ans-1)%fhq+1;
        ans=T.getans(x);
        printf("%lld\n",ans);
    }
    goto begin;
}

by _____hzf_____ @ 2018-12-21 12:52:20

虽然说刚学OI的萌新用李超线段树写紫题我也不是第一次见到。。


by VenusM1nT @ 2018-12-21 12:52:38

您好,请问您为什么要强调您刚学OI还是个妹子呢?


by DQYdqy @ 2018-12-21 13:00:55

@Venus 总不能说是十年OI的壮汉求教吧。。。


by 海洋 @ 2018-12-21 13:19:35

您好,为什么要强调您刚学OI还是个妹子呢?


by 用户已注销 @ 2018-12-21 13:30:20

刚学OI的妹子->学久了就变成汉子了


by 吹雪吹雪吹 @ 2018-12-22 10:04:53

您这标题是真的还是假的。。。

如果是妹子的话请这边登记下手机微信QQ身份证


|