[BZOJ 1568][JSOI2008]Blue Mary开公司
[BZOJ 1568][JSOI2008]Blue Mary开公司
题意
\(n\) 次操作, 维护一个一次函数集合 \(S\). 有两种操作:
- 给定 \(b\) 和 \(k\), 向 \(S\) 中插入一个函数 \(f(x)=kx+b\).
- 给定一个 \(x\), 求 \(\max\limits_{f\in S}\{f(x)\}\).
\(n\le 1\times 10^5,x\le 50000\).
题解
AFO前的打板子日常
讲道理为啥一个 \(\log\) 的题数据范围才给这么点啊
李超线段树板子题.
关于李超树
李超线段树是一种特殊的标记永久化线段树. 说它特殊, 是因为标记虽然永久化但是依然会有下传.
在这种线段树中, 每个结点维护的是覆盖当前结点的 "优势线段", 也即当前结点中有超过一半的 \(x\) 的查询值在这个线段处取到. 由于是一次函数, 实际上等价于当前结点的 \(mid\) 处以这个函数为最大函数值.
当插入一个函数 \(f(x)\) 的时候, 分三种情况:
- 如果原来的优势线段 \(g(x)\) 在当前结点所在区间的所有 \(x\) 处都有 \(g(x)\le f(x)\), 那么直接把当前结点的优势线段设为 \(f(x)\) 并结束插入过程.
- 如果 \(\forall x,f(x)\le g(x)\), 那么不进行任何修改, 结束插入过程.
- 如果不满足上面两个条件, 那么判断 \(g(x)\) 和 \(f(x)\) 哪个是优势线段, 并计算出它们的交点. 显然不包含交点的一半子树中 \(f(x)\) 和 \(g(x)\) 的关系如上面两种情况, 但是被淘汰的线段仍然可能在另一个子树中的某个点中成为优势线段, 所以将被淘汰的线段递归处理.
查询的时候就像普通的标记永久化线段树一样查到叶子并用路径上的结点上存储的优势线段更新答案.
不难发现如果维护的是函数集合的话复杂度是一个 \(\log\) 的. 如果是在某一段特定区间上产生一个一次函数状的贡献的话, 会先将这个函数分布到 \(O(\log n)\) 个结点上然后下传, 这种情况下时间复杂度是 \(O(\log^2 n)\) 的.
李超树的实际表现还是很优秀的, 很多时候在区间维护的情况下也不会比普通线段树慢太多.
具体实现的时候善用 std::swap 可以帮助减少冗余代码. 而且交点不用真的去求, 因为是一次函数所以判断区间两端的函数值的大小关系就知道它们是否在这个区间内相交了.
关于这道题
这道坑爹的板子题有几个小坑点:
- 输出的时候需要转单位.
- 初值为 \(0\) (也就是如果唯一的函数在查询的 \(x\) 处为负数的时候应该查得 \(0\)).
- 因为初值是 \(0\) 所以不存在向 \(0\) 取整还是向下取整的问题.
参考代码
#include <bits/stdc++.h>
const int MAXN=1e5+10;
struct Line{
double k;
double b;
Line(double a,double b):k(a),b(b){}
double operator()(const double& x)const{
return k*(x-1)+b;
}
};
struct Node{
int l;
int r;
Line f;
Node* lch;
Node* rch;
Node(int,int);
double Query(int);
void Insert(Line);
};
char buf[100];
int main(){
int q;
bool flag=false;
scanf("%d",&q);
Node* N=new Node(1,5e4);
while(q--){
scanf("%s",buf);
if(*buf=='P'){
flag=true;
double k,b;
scanf("%lf%lf",&b,&k);
N->Insert(Line(k,b));
}
else{
int x;
scanf("%d",&x);
if(!flag)
puts("0");
else
printf("%d\n",int(N->Query(x)/100));
}
}
return 0;
}
double Node::Query(int x){
if(this->l==this->r)
return this->f(x);
else{
if(x<=this->lch->r)
return std::max(this->f(x),this->lch->Query(x));
else
return std::max(this->f(x),this->rch->Query(x));
}
}
void Node::Insert(Line f){
int mid=(this->l+this->r)>>1;
if(f(mid)>this->f(mid))
std::swap(f,this->f);
double ld=this->f(this->l)-f(this->l);
double rd=this->f(this->r)-f(this->r);
if(ld>=0&&rd>=0)
return;
else if(rd>=0)
this->lch->Insert(f);
else
this->rch->Insert(f);
}
Node::Node(int l,int r):l(l),r(r),f(0,0){
if(l!=r){
int mid=(l+r)>>1;
this->lch=new Node(l,mid);
this->rch=new Node(mid+1,r);
}
}

[BZOJ 1568][JSOI2008]Blue Mary开公司的更多相关文章
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 602 Solved: 214[Submit ...
- bzoj 1568 [JSOI2008]Blue Mary开公司 超哥线段树
[JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1808 Solved: 639[Submit][Sta ...
- BZOJ.1568.[JSOI2008]Blue Mary开公司(李超线段树)
题目链接 线段树每个节点记录\(f(mid)\)最大的直线(在\(mid\)处函数值最大的直线),称作优势线段(还是直线啊...无所谓了). 如果是在区间插入线段会影响\(O(\log n)\)个区间 ...
- 1568: [JSOI2008]Blue Mary开公司
1568: [JSOI2008]Blue Mary开公司 题目描述 传送门 题目分析 简单分析可以发现就是不停给出了\(n\)条直线,要求每次给出一条直线后求出所有直线在横坐标为\(x\)时\(y\) ...
- 1568: [JSOI2008]Blue Mary开公司(超哥线段树)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 1198 Solved: 418 Descr ...
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...
- 【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 ...
- [Luogu] P4254 [JSOI2008]Blue Mary开公司
题目背景 Blue Mary 最近在筹备开一家自己的网络公司.由于他缺乏经济头脑,所以先后聘请了若干个金融顾问为他设计经营方案. 题目描述 万事开头难,经营公司更是如此.开始的收益往往是很低的,不过随 ...
随机推荐
- vuex数据管理-数据模块化
对于vue这类mvvm框架来说,其核心就是组件与数据,因此做好相应的数据管理极为重要.这里分享下vuex数据模块化管理的方法,有利于搭建便于维护.协作的vue项目. vuex管理基本方法和使用 模块化 ...
- 祸害阿里云宕机 3 小时的 IO HANG 究竟是个什么鬼?!
2019年3月3日凌晨,微博炸锅,有网友反映说阿里云疑似出现宕机,华北很多互联网公司受到暴击伤害,APP.网站全部瘫痪,我自己的朋友圈和微信群里也有好友反馈,刚刚从被窝被叫起来去修Bug,结果发现服务 ...
- Netty 内存回收之 noCleaner 策略
前言 对于堆外内存,使用 System.gc() 是不靠谱的,依赖老年代 FGC 也是不靠谱的,而且大部分调优指南都设置了 -DisableExplicitGC 禁用 System.gc().所以主动 ...
- Java虚拟机--虚拟机字节码执行引擎
Java虚拟机--虚拟机字节码执行引擎 所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 用于支持虚拟机进行方法调用和方 ...
- CentOs 7.3下ELK日志分析系统搭建
系统环境 为了安装时不出错,建议选择这两者选择一样的版本,本文全部选择5.3版本. System: Centos release 7.3 Java: openjdk version "1.8 ...
- CentOS总结归纳之基本操作(linux系管与运维一)
原创作品,转载请在文章明显位置注明出处:https://www.cnblogs.com/sunshine5683/p/10170009.html 使用命令关闭和重启系统: 一.条件:只有root用户才 ...
- Math Magic(完全背包)
Math Magic Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Sta ...
- 面试问题:你了解Java内存模型么(Java7、8、9内存模型的区别)
Java内存模型是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助.由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是 ...
- 天天生鲜 - App设计
天天生鲜-思路数据库设计 天天生鲜-各个App 全文检索 天天生鲜-静态文件 一.项目目录 daily_fresh_demo - daily_fresh_demo - df_cart # 购物车功能 ...
- Nginx的rewrite(地址重定向)剖析
1.rewrite语法: 指令语法:rewrite regex replacement[flag]; 默认值:none 应用位置:server.location.if rewrite是实现URL重定向 ...