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

维护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);
		}	
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值