bzoj1568 Blue Mary
题意:P:加入一条一次函数。Q:询问x位置的最大函数值。
标程:
#include<bits/stdc++.h>
using namespace std;
const int N=;
int q,x,n;
double Tk[N],Tb[N],b,k,ans;
char s[];
void add(int x,int l,int r,double b,double k)
{
if (!Tk[x]&&!Tb[x]) {Tk[x]=k;Tb[x]=b;return;}
double fl1=Tk[x]*l+Tb[x],fl2=k*l+b;
double fr1=Tk[x]*r+Tb[x],fr2=k*r+b;
if (fl1>=fl2&&fr1>=fr2) return;
if (fl1<fl2&&fr1<fr2) {Tk[x]=k;Tb[x]=b;return;}
double dot=(double)(Tb[x]-b)/(k-Tk[x]);int mid=(l+r)>>;
if (k<Tk[x])
{
if (dot<=mid) add(x<<,l,mid,b,k);
else add(x<<|,mid+,r,Tb[x],Tk[x]),Tk[x]=k,Tb[x]=b;
}else
{
if (dot<=mid) add(x<<,l,mid,Tb[x],Tk[x]),Tk[x]=k,Tb[x]=b;
else add(x<<|,mid+,r,b,k);
}
}
void qry(int k,int l,int r,int x)
{
ans=max(ans,Tk[k]*x+Tb[k]);
if (l==r) return;
int mid=(l+r)>>;
if (x<=mid) qry(k<<,l,mid,x);else qry(k<<|,mid+,r,x);
}
int main()
{
int T;scanf("%d",&T);
n=;//看清范围!
while (T--)
{
scanf("%s",s);
if (s[]=='P')
{
scanf("%lf%lf",&b,&k);
add(,,n,b-k,k);
}else {
scanf("%d",&x);ans=;
qry(,,n,x);
printf("%d\n",(int)(ans/100.0));
}
}
return ;
}
题解:李超树
李超树的一个特点是标记永久化。可以求解有关直线、线段、折线的一系列问题。
每个区间[l,r]保存在x=mid时最高的一条直线。
插入:分类讨论斜率的大小关系和当前区间直线和插入直线的交点。
设Tk为当前区间直线的斜率,k为插入直线的斜率。当Tk>k时,如果交点在mid左边,那么处理左区间插入直线,右区间不变;如果交点在mid右边,那么Tk=k,左区间被插入直线完全覆盖,处理右区间原区间直线。Tk<k的情况同理。
查询:路径上直线的最大值。
时间复杂度O(nlogn)。
bzoj1568 Blue Mary的更多相关文章
- BZOJ-1568: Blue Mary开公司 (李超线段树)
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)
[BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树
[BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“P ...
- 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 557 Solved: 192[Submit ...
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...
- BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】
Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词"Query"或"Project". 若单词为Q ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 602 Solved: 214[Submit ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
随机推荐
- string中的stringstream
博客: 加速:ios::sync_with_stdio(false); 举个例子: 題目:输入的第一行有一个数字 N 代表接下來有 N 行资料,每一行资料里有不固定个数的整数(最多20个,每行最大20 ...
- hadoop备战:hbase的分布式安装经验
配置HBase时,首先考虑的肯定是Hbase版本号与你所装的hadoop版本号是否匹配.这一点我在之前 的博客中已经说明清楚,hadoop版本号与hbase版本号的匹配度,那是官方提供的.以下的实验就 ...
- 解析TextView中的URL等指定特殊字符串与点击事件
使用TextView时,有时可能需要给予TextView里的特定字符串,比如URL,数字特别的样式,必希望能够添加点击事件.比如发短信时,文字里的url就可以点击直接打开浏览器,数字可以点击拨打电话. ...
- 如何让contenteditable元素只能输入纯文本
本文出自张旭鑫博客,要知详情,请戳右侧地址:http://www.zhangxinxu.com/wordpress/?p=5120 一.温故而知新 很多年以前,稍等,让我搜一下contentedita ...
- DO_DEVICE_INITIALIZING
这个东西的位置在DEVICE_OBJECT的Flags字段中, 本来这个Flags大多的情况下都是在设置IO方式,如DO_BUFFERED_IO, 但特殊的位也可能需要在这里设置. 用处是防止当自己的 ...
- js的基本语法规范
1.不要在同一行声明多个变量: 2.使用===/!==来比较true/false的返回值: 3.使用字面量替代new Array这种形式: 4.不要使用全局函数: 5.switch语句必须带有defa ...
- vt-is-UTF8 - check whether current VT is in UTF8- or byte-mode. 检查当前VT是否处于VTF8模式或是字节模式.
总览 vt-is-UTF8 [-h|--help] [-V|--version] [-q|--quiet] 描述 vt-is-UTF8 checks whether the current VT is ...
- UNLISTEN - 停止监听通知信息
SYNOPSIS UNLISTEN { name | * } DESCRIPTION 描述 UNLISTEN 用于删除一个现有的已注册的 NOTIFY 事件. UNLISTEN 取消当前 Postgr ...
- 关于虚拟机中linux系统时间的问题
由于考试需求,我在vm上放置了考试用的linux环境,在进行操作的时候需要回调时间才能进行一些操作.但是每次重启之后,时间总是会和物理服务器的时间进行同步,让我非常的苦恼. 终于有一天我想清楚了如何表 ...
- Linux常用命令大全(很全面)
最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大.我将我了解到的命令列举一 ...