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 ...
随机推荐
- vuex-along解决vuex中存储的数据在页面刷新之后失去的问题
1. 为什么会失去? vuex可以看成是一个"提升变量"的一个工具,它是将state当做全局变量存储.F5刷新页面之后自然随着页面的刷新重新初始化state. 2. 如果解决数据保 ...
- 我要多开梦幻手游PC端(梦幻手游PC端多开的简单分析及实现办法)(二)
上一篇,多开方法,适用于一年前的版本 http://www.cnblogs.com/suanguade/p/5646776.html 前言: 一转眼一年过去了,日子越来越无聊了,于是,准备再玩一玩梦幻 ...
- troff - groff 文档排版系统的 troff 处理器
总览 SYNOPSIS troff [ -abcivzCERU ] [ -d cs ] [ -f fam ] [ -F dir ] [ -m name ] [ -M dir ] [ -n num ] ...
- Python学习笔记(七)——魔法方法
1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...
- 日文NLP分词系统
mecab(http://mecab.sourceforge.net/)是奈良先端科技大学开发的日文分词系统,基于CRF的分词原理,有c++实现,提供python.perl.ruby等接口 日文NLP ...
- Vue.js 复选框
demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- Centos6.5 安装 LAMP
Centos 安装 LAMP 系统: Centos 6.5 Apache 2.4 + PHP 7.2 + Mysql 5.7 准备工作 centos 查看版本 查看 centos版本 How to C ...
- 关于synchronized和Lock
原文链接:关于volatile关键字解析,synchronized和Lock参考 深入浅出,解释的非常清楚,有条理~~~ 以下为转载内容: Java并发编程:volatile关键字解析 volatil ...
- C++——函数模板和类模板
声明: //template 关键字告诉C++编译器 我要开始泛型了.你不要随便报错 //数据类型T 参数化数据类型 template <typename T> void myswap(T ...
- 移动端多选插件-jquery
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...