可以平衡树或线段树维护斜率来做。还有一种线段树直接打标记的做法(李超线段树):线段树每个节点存一条线段作为标记,打标记时如果已有标记,则把占优区间小的那个线段下放。

#include<cstdio>
#include<algorithm>
#define N 50000
#define M (l+r>>1)
#define P (k<<1)
#define S (k<<1|1)
#define L l,M,P
#define R M+1,r,S
#define Z \
int l=0,int r=N-1,int k=1
using namespace std;
struct node{
double s,t;
double val(int x){
return s*x+t;
}
}e[N*2],*u=e,*a[N*4];
void apply(node*s,Z){
if(!a[k])a[k]=s;
else{
if(a[k]->val(M)<s->val(M))
swap(a[k],s);
if(l!=r)
a[k]->s<s->s?apply(s,R):apply(s,L);
}
}
double query(int s,Z){
double v=a[k]?a[k]->val(s):0;
if(l!=r)
v=max(v,s<=M?query(s,L):query(s,R));
return v;
}
int i,m;
char k[8];
double s,t;
int main(){
for(scanf("%d",&m);m;--m){
scanf("%s",k);
if(*k==80){
scanf("%lf%lf",&t,&s);
apply(&(*u++=(node){s,t}));
}
else{
scanf("%d",&i);
printf("%d\n",(int)query(i-1)/100);
}
}
}

之前写的是一个奇怪的做法……

答案序列一定是个下凸壳,因此添加的等差数列与其之差是个单峰函数,可以先三分求出最值,再二分求出零点,然后用线段树,将得到的区间修改为一个等差数列。

要降低复杂度的话可以把三分和二分写到线段树里面……

#include<cstdio>
#define Z \
int l=1,int r=N,int k=1
#define N 50000
#define M (l+r>>1)
#define P (k<<1)
#define S (k<<1|1)
#define K l,r,k
#define L l,M,P
#define R M+1,r,S
double a[N*4],b[N*4];
void devolve(Z){
if(b[k]){
a[S]=a[k]+(M-l+1)*(b[P]=b[S]=b[k]);
a[P]=a[k],b[k]=0;
}
}
double query(int s,Z){
if(l!=r){
devolve(K);
return s<=M?query(s,L):query(s,R);
}
return a[k];
}
void amend(double u,double v,int s,int t,Z){
if(s==l&&t==r)
a[k]=u,b[k]=v;
else{
devolve(K);
if(t<=M)
amend(u,v,s,t,L);
else if(s>M)
amend(u,v,s,t,R);
else{
amend(u,v,s,M,L);
amend(u+(M-s+1)*v,v,M+1,t,R);
}
}
}
double s,t;
int i,j,m,r,l;
char k[8];
void solve(){
scanf("%lf%lf",&s,&t);
l=1,r=N;
while(l!=r){
i=l+(r-l)/3;
j=r-(r-l)/3;
if(t*(i-j)<query(i)-query(j))
l=i+1;
else r=j-1;
}
if(s+t*l-t>query(l)){
r=l,l=1;
while(l!=r){
i=l+r>>1;
if(s+t*i-t>query(i))
r=i;
else l=i+1;
}
j=l,r=N;
while(l!=r){
i=l+r+1>>1;
if(s+t*i-t>query(i))
l=i;
else r=i-1;
}
amend(s+t*j-t,t,j,l);
}
}
int main(){
for(scanf("%d",&m);m;--m){
scanf("%s",k);
if(*k==80)
solve();
else{
scanf("%d",&i);
printf("%d\n",(int)query(i)/100);
}
}
}

最后吐槽一句这题啥破样例啊。

BZOJ1568: [JSOI2008]Blue Mary开公司的更多相关文章

  1. bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司

    http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...

  2. BZOJ1568: [JSOI2008]Blue Mary开公司【李超树】

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

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

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

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

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

  5. 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)

    [BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...

  6. 【BZOJ1568】[JSOI2008]Blue Mary开公司 线段树

    [BZOJ1568][JSOI2008]Blue Mary开公司 Description Input 第一行 :一个整数N ,表示方案和询问的总数.  接下来N行,每行开头一个单词“Query”或“P ...

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

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

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

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

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

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

随机推荐

  1. 解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案

    SQL Server是如何使用内存 最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉.所以一般我们在看sta ...

  2. WinForm 问题集锦

    [1]重用项目窗体解决方案: 1. 把FmMain.cs 和 FmMain.Designer.cs 和 FmMain .resx 三个文件复制到程序目录下: 2. 在vs里面添加现有项, 选择FmMa ...

  3. 从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  4. 新的博客 bincoding.github.io

    最近周围的人都在用静态博客,随主流也换了github page搭建hexo. bincoding.github.io 个人网站,用来上线乱七八糟的东西: bincoding.cn

  5. Git与GitHub到底有什么联系?

    Git与GitHub区别 git 是一个软件 版本控制器 分享合并代码, 团队开发 时间机器, 可以获取到任意阶段时间节点开发的代码, 代码找回 git, cvs, bitkeeper, svn 典型 ...

  6. session超时设置

    session的设置方法有三种: 1.直接在应用服务器中设置 如果是Tomcat,可以在Tomcat目录下conf/web.xml中找到<session-config>元素,tomcat默 ...

  7. 传入任意json数据源进行格式化处理并用Angularjs显示

    在项目开发中,有些时候我们并不知道传入的数据源(只针对于json格式的)的内部结构,本文用最笨的办法先把数据源格式化一遍,把所有的key值替换成自定义的值,然后在页面上用angularjs展示. ht ...

  8. supervisor

    文章转自:http://cpper.info/2016/04/14/supervisor-usage.html在此只是当做笔记使用,不做他用     Linux进程管理工具supervisor安装及使 ...

  9. NPOI使用手册[转]

    NPOI使用手册 目录 1.认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 2.1.1创建Workbook和Sheet 2.1.2创建DocumentSummaryInforma ...

  10. 多线程中的synchronized

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码 ...