李超线段树

struct AB{
    int k,b;
}d[N];
void add(int k,int b){d[++cnt]=(AB){k,b};}
int cal(int id,int x){return d[id].k*x+d[id].b;}
void upd(int p,int l,int r,int u){
    int v=&c[p],mid=(l+r)>>1;
    if(cal(u,mid)>cal(v,mid)) swap(u,v);
    if(cal(u,l)>cal(v,l)) upd(p*2,l,mid,u);
    if(cal(u,r)>cal(v,r)) upd(p*2+1,mid+1,r,u);
}
void gai(int p,int l,int r,int x,int y,int z){
    if(x<=l&&r<=y){
        upd(p,l,r,z);
        return ;
    }
    int mid=(l+r)>>1;
    if(mid>=x) gai(p*2,l,mid,x,y,z);
    if(mid<y) gai(p*2+1,mid+1,r,x,y,z); 
}
int cha(int p,int l,int r,int x){
    if(l==r) return cal(c[p],cal(c[p],x));
    int mid=(l+r)>>1,res=cal(c[p],x);
    if(mid>=x) return max(res,cha(p*2,l,mid,x));
    else return max(res,cha(p*2+1,mid+1,r,x));
}
posted @ 2022-10-06 16:32  hubingshan  阅读(47)  评论(0)    收藏  举报  来源