Blue Mary开公司题解

Posted ljk123-de-bo-ke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Blue Mary开公司题解相关的知识,希望对你有一定的参考价值。

Blue Mary开公司题解

李超树模板题啦,所有线段覆盖全区间,而且还是单点查询,太良心了。
什么?你不会李超树,看看我的这篇博客
本来不想写注释的,但为了自己以后能看懂,还是打一打吧。
(line[x]:)存的是第(x)条线段的斜率和截距,(tag[x]:)存的是线段树上点(x)的优势线段是哪一条。

#include<bits/stdc++.h>
#define re register
#define lc x<<1
#define rc x<<1|1
using namespace std;
const int N=1e5+6,M=5e5;
int n,t,tag[M<<2],num=0;
struct xd{double s,p;}line[N];
char c[12];
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T;
}
double f(int id,int x){return line[id].p*x+line[id].s;}
void update(int l,int r,int id,int x){
    if(l==r){if(f(id,l)>f(tag[x],l)) tag[x]=id; return;}
    int mid=l+r>>1;
    if(line[tag[x]].p>line[id].p){
       if(f(tag[x],mid)<f(id,mid)) update(mid+1,r,tag[x],rc),tag[x]=id;
       else update(l,mid,id,lc);
    }
    else{
       if(f(tag[x],mid)<f(id,mid)) update(l,mid,tag[x],lc),tag[x]=id;
       else update(mid+1,r,id,rc);
    }
}
double query(int l,int r,int p,int x){
    if(l==r) return f(tag[x],l);
    int mid=l+r>>1; double ans=f(tag[x],p);
    if(p<=mid) return max(ans,query(l,mid,p,lc));
    return max(ans,query(mid+1,r,p,rc));
}
int main(){
    n=read();
    for(int i=1;i<=n;++i){
        scanf("%s",c);
        if(c[0]=='Q') t=read(),printf("%d
",(int)(query(1,M,t,1)/100.0));
        else ++num,scanf("%lf%lf",&line[num].s,&line[num].p),line[num].s-=line[num].p,update(1,M,num,1);
    }
    return 0;
}

以上是关于Blue Mary开公司题解的主要内容,如果未能解决你的问题,请参考以下文章

1568: [JSOI2008]Blue Mary开公司

[JSOI2008]Blue Mary开公司

[JSOI2008]Blue Mary开公司

BZOJ 1568: [JSOI2008]Blue Mary开公司(超哥线段树)

BZOJ1568[JSOI2008]Blue Mary开公司 线段树

bzoj 1568 [JSOI2008]Blue Mary开公司 超哥线段树