题目链接

线段树每个节点记录\(f(mid)\)最大的直线(在\(mid\)处函数值最大的直线),称作优势线段(还是直线啊...无所谓了)。

如果是在区间插入线段会影响\(O(\log n)\)个区间,每个区间的更新是\(O(\log n)\)的,所以插入复杂度为\(O(n\log^2n)\)。

(这题是在\([1,n]\)插入所以复杂度是一个\(log\)的吧)

查询时利用标记永久化的思想,答案一定在某一条经过节点的优势线段上。复杂度\(O(\log n)\)。

注意b是S-P不是S。。

//4928KB	192MS
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 1000000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=50005; char IN[MAXIN],*SS=IN,*TT=IN;
struct Segment_Tree
{
#define ls rt<<1
#define rs rt<<1|1
#define lson l,m,ls
#define rson m+1,r,rs
#define S N<<2
double K[S],B[S];
#undef S
void Insert(int l,int r,int rt,double k,double b)
{
if(!K[rt]) {K[rt]=k, B[rt]=b; return;}
double l1=k*l+b,r1=k*r+b,l2=K[rt]*l+B[rt],r2=K[rt]*r+B[rt];
if(l1<=l2 && r1<=r2) return;
if(l1>l2 && r1>r2) {K[rt]=k, B[rt]=b; return;}
double p=(B[rt]-b)/(k-K[rt]);//交点坐标
int m=l+r>>1;
if(l1<l2)
if(p<=m) Insert(lson,K[rt],B[rt]), K[rt]=k, B[rt]=b;
else Insert(rson,k,b);
else
if(p<=m) Insert(lson,k,b);
else Insert(rson,K[rt],B[rt]), K[rt]=k, B[rt]=b;
}
double Query(int l,int r,int rt,int x)
{
if(l==r) return K[rt]*x+B[rt];
int m=l+r>>1;
return std::max(K[rt]*x+B[rt],x<=m?Query(lson,x):Query(rson,x));
}
}T; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline double readdb()
{
double x=0,y=0.1,f=1;register char c=gc();
for(;!isdigit(c)&&c!='.';c=='-'&&(f=-1),c=gc());
for(;isdigit(c);x=x*10+c-'0',c=gc());
for(c=='.'&&(c=gc());isdigit(c);x+=(c-'0')*y,y*=0.1,c=gc());
return x*f;
} int main()
{
const int n=50000; double k,b;
for(int Q=read(); Q--; )
{
register char c=gc(); while(c!='Q'&&c!='P') c=gc();
switch(c)
{
case 'Q': printf("%d\n",(int)(T.Query(1,n,1,read())/100)); break;
case 'P': b=readdb(),k=readdb(),T.Insert(1,n,1,k,b-k); break;
}
}
return 0;
}

BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)的更多相关文章

  1. JSOI2008 Blue Mary开公司 | 李超线段树学习笔记

    题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...

  2. [bzoj1568][JSOI2008]Blue Mary开公司——李超线段树

    题目大意 题解 这道题需要用到一种叫做李超线段树的东西.我对于李超线段树,是这样理解的: 给节点打下的标记不进行下传,而是仅仅在需要的时候进行下传,这就是所谓永久化标记. 对于这道题,借用一张图, 这 ...

  3. [JSOI2008]Blue Mary开公司[李超线段树]

    题面 bzoj luogu 好久以前听lxl讲过 咕掉了.. 竟然又遇到了 安利blog #include <cmath> #include <cstring> #includ ...

  4. [BZOJ 1568][JSOI2008]Blue Mary开公司

    [BZOJ 1568][JSOI2008]Blue Mary开公司 题意 \(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作: 给定 \(b\) 和 \(k\), 向 \(S\) 中 ...

  5. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 602  Solved: 214[Submit ...

  6. 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 192[Submit ...

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

    [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1808  Solved: 639[Submit][Sta ...

  8. 2019.02.11 bzoj1568: [JSOI2008]Blue Mary开公司(线段树)

    传送门 题意简述:维护整体加一条线段,求单点极值. 思路: 直接上李超线段树维护即可. 代码: #include<bits/stdc++.h> #define ri register in ...

  9. BZOJ-1568: Blue Mary开公司 (李超线段树)

    Description Input 第一行 :一个整数N ,表示方案和询问的总数. 接下来N行,每行开头一个单词“Query”或“Project”. 若单词为Query,则后接一个整数T,表示Blue ...

随机推荐

  1. cf965C 二分+推方程

    #include<bits/stdc++.h> using namespace std; #define ll long long ll n,k,M,D,anss; ll calc(ll ...

  2. bzoj 2761

    神题... 其实这题巨水,用各种诡异的方法都能A,包括STL等等 我之所以写题解,是因为我发现了一个bug:bz和luogu时限有问题! 这题我用了两种做法: ①:直接使用STL-map(不能直接用数 ...

  3. python+selenium滑动式验证码解决办法

    from selenium.webdriver import ActionChains action = ActionChains(driver) source=driver.find_element ...

  4. 理解并设计rest/restful风格接口

    网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...

  5. ActiveSync之HTTP

    Exchange ActiveSync:HTTP协议让客户端能够同步存储在服务器上的数据. 互联网工程工作小组(IETF)要求所有互联网协议都比支持UTF-8编码.因此,ActiveSync传输所使用 ...

  6. spring中的xml配置出处

  7. HTTP 599: SSL certificate problem: unable to get local issuer certificate错误

    自己在用 PySpider 框架爬虫运行代码后时出现 HTTP 599: SSL certificate problem: unable to get local issuer certificate ...

  8. centos安装pg以及pg配置ssl

    https://blog.csdn.net/iteye_21194/article/details/82645389 https://blog.csdn.net/rudy5348/article/de ...

  9. 【转】Android逆向入门流程

    原文:https://www.jianshu.com/p/71fb7ccc05ff 0.写在前面 本文是笔者自学笔记,以破解某目标apk的方式进行学习,中间辅以原理性知识,方便面试需求. 参考文章的原 ...

  10. Ubuntu 16.04 卸载Postgresql

    首先确保postgresql是否在运行,在命令窗口输入 netstat -nlt han@han-OptiPlex-:~/project/0_ng_practice/ng-test$ netstat ...