您的位置:首页 > 产品设计 > UI/UE

bzoj1568 [JSOI2008]Blue Mary开公司 标记永久化线段树

2018-03-03 14:12 567 查看
维护n条直线,保存斜率和截距。
注意维护的时候分类讨论:
1、两端都大于
2、两端都小于
3、交点在中点左
4、交点在中点右
注:
点数不是询问数
初值

码:#include<iostream>
#include<cstdio>
using namespace std;
#define N 100005
double k[N<<2],ans,b[N<<2],K,B;
long long t;
int n,m,i,j;
char ch[55];
void gai(int o,double l,double r)
{
if((k[o]==0&&b[o]==0)||(k[o]*l+b[o]<=K*l+B&&k[o]*r+b[o]<=K*r+B))
{
k[o]=K;
b[o]=B;
return ;
}
if(k[o]*l+b[o]>=K*l+B&&k[o]*r+b[o]>=K*r+B)
{
return ;
}
int mid=(l+r)/2;
double jd=(B-b[o])/(k[o]-K);
if(jd<=mid)
{gai(o<<1,l,mid);
if(k[o]*r+b[o]<=K*r+B)gai(o<<1|1,mid+1,r);
}
if(jd>mid)
{gai(o<<1|1,mid+1,r);
if(k[o]*l+b[o]<=K*l+B)gai(o<<1,l,mid);
}
}
void cha(int o,double l,double r)
{ ans=max(k[o]*t+b[o],ans);
if(l==r)
{
return ;
}
int mid=(l+r)/2;
if(t<=mid)cha(o<<1,l,mid);
else cha(o<<1|1,mid+1,r);
}
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%s",ch);
if(ch[0]=='P')
{
scanf("%lf%lf",&B,&K);
B-=K;
gai(1,1,100000);
}else
{
ans=-9999999999;
scanf("%lld",&t);
cha(1,1,100000);
long long daan=ans/100;
printf("%lld\n",daan);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: