【BZOJ1568】【Tyvj3490】Blue Mary开公司 李超线段树
Time:2016.08.02
Author:xiaoyimi
转载注明出处谢谢
传送门1
传送门2
思路:
题意大致为
维护有斜率和截距的若干直线,并求直线x=T(T∈N)与当前已加入直线交点的ymaxy_{max}
利用李超线段树的优势区间维护[1,50000]的直线相交情况
新加入直线与线段树节点所存的原直线进行比较,取具有优势区间的直线作为线段树节点所存的新直线,另一直线在相应的区间内继续下放,最多下放log(n)log(n)次
查询时直接比较最大值即可,每次访问log(n)log(n)个节点
总时间复杂度nlog(n)nlog(n)(默认天数与询问次数同一数量级,均为n)
(以上均为个人见解,可能有不对的地方,望大神指正,共同进步)
注意:
好像不用标记??应该是有更优的做法吧,我的code码着码着就不像超哥线段树了
BZOJ跑了648ms
Tyvj在1s左右
代码:
#include<cstdio>
#include<iostream>
#define M 100004
#define inf 1e9
using namespace std;
int n;
char ch;
struct Seg
{double k,b;bool operator ==(const Seg other)const{return k==other.k&&b==other.b;}
}tr[M<<1];
Seg null={0,-inf};
double cal(int T,Seg x){return x.k*T+x.b;}
Seg judge(int T,Seg x,Seg y){return cal(T,x)>=cal(T,y)?x:y;}
void update(int rt,int begin,int end,Seg node)
{Seg f1=judge(begin,tr[rt],node),f2=judge(end,tr[rt],node);if (f1==tr[rt]&&f2==tr[rt]) return;else if (f1==node&&f2==node)tr[rt]=node;else{int mid=begin+end>>1;double p=(node.b-tr[rt].b)/(tr[rt].k-node.k);if (tr[rt].k>=node.k)if (p<=mid)update(rt<<1,begin,mid,node);elseswap(node,tr[rt]),update(rt<<1|1,mid+1,end,node);elseif (p>mid)update(rt<<1|1,mid+1,end,node);elseswap(node,tr[rt]),update(rt<<1,begin,mid,node);}
}
Seg get(int rt,int begin,int end,int T)
{if (begin==end) return tr[rt];Seg p=tr[rt];int mid=begin+end>>1;if (mid>=T) return judge(T,p,get(rt<<1,begin,mid,T));else return judge(T,p,get(rt<<1|1,mid+1,end,T));
}
main()
{scanf("%d",&n);while (n--){ch=getchar();while (ch!='P'&&ch!='Q') ch=getchar();while (getchar()!=' ');if (ch=='P'){double k,b;scanf("%lf%lf",&b,&k);update(1,0,50000-1,(Seg){k,b});}else{int p;scanf("%d",&p);p--;Seg ans=get(1,0,50000-1,p);printf("%d\n",(int)(cal(p,ans)/100));}}
}
【BZOJ1568】【Tyvj3490】Blue Mary开公司 李超线段树相关推荐
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...
- bzoj1568 [JSOI2008]Blue Mary开公司 标记永久化线段树
维护n条直线,保存斜率和截距. 注意维护的时候分类讨论: 1.两端都大于 2.两端都小于 3.交点在中点左 4.交点在中点右 注: 点数不是询问数 初值 码: #include<iostream ...
- 【李超树】李超线段树维护凸包(凸壳) (例题:blue mary开公司+线段游戏+ZZH的旅行)
文章目录 前言 李超树 引入(斜率优化) 什么是李超树? 李超树活着能干点什么? 算法思想(使用手册?) 插入 查询 模板 判断是否覆盖(优不优) 插入 查询 例题 板题:BlueMary开公司 分析 ...
- BZOJ 1568 Blue Mary开公司
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1568 题意:两个操作:(1)添加一条直线y=kx+b:(1<=k<=100) ...
- 【BZOJ 1568】【JSOI 2008】Blue Mary开公司
经典的splay维护凸壳,但是看了看zky学长的题解最后决定写线段树维护标记永久化. Round1考到了这个之后一直没有理解标记永久化,CTSC也因为自己的缺陷丢掉了一些部分分,so sad 看来以后 ...
- P4254-[JSOI2008]Blue Mary开公司【李超树】
正题 题目链接:https://www.luogu.com.cn/problem/P4254 题目大意 要求支持操作 插入一条直线. 询问一个纵坐标最高的在直线上的点. 解题思路 李超树的模板题,大概 ...
- 斜率优化之凸包优化与李超线段树
文章目录 前言 凸包优化 第一步 第二步 最后一步 例一 转移方程 凸包优化 代码 例二 题目大意 转移方程 凸包优化 代码 李超线段树 思想 插入 查询 代码 例三 代码 例四 转移方程 怎么做 代 ...
- 数据结构专题-学习笔记:李超线段树
数据结构专题 - 学习笔记:李超线段树 1. 前言 2. 详解 3. 应用 4. 总结 5. 参考资料 1. 前言 本篇博文是博主学习李超线段树的学习笔记. 2020/12/21 的时候我在 线段树算 ...
- 数据结构之线段树Ⅴ——(李超线段树)Robot,Product Sum,Building Bridges,Jump mission
文章目录 Robot Product Sum Building Bridges Jump mission Robot BZOJ3938 机器人每次一旦改变速度,直到下一次改变速度为止 这一时间段内机器 ...
最新文章
- 电脑录屏工具_屏幕录制工具有哪些?这些录屏软件须知
- js ScripX插件打印
- openstack中glance组件images的全部python API 汇总
- python tqdm_推荐一些实用的的 Python 库
- Elasticsearch:Elasticsearch基础上构建推荐引擎 资料收集
- java引用类的关键字_java中定义类通常使用的关键字有哪些
- Invalidate和postInvalidate
- java jdom 设置第1行_Java通过jdom操作生成XML文件的实例代码下载
- 丘成桐科学奖计算机类,2017东润丘成桐科学奖计算机参赛指引.PDF
- 暑期训练日志----2018.8.22
- 什么是REST?以及RESTful的实现
- 三层交换机关于VLAN的划分以及ACL的使用
- UNIX网络编程读书笔记:原始套接口
- python 实现读取图片的像素值。
- 如何下载石家庄市卫星地图高清版大图
- 公有云、私有云与混合云到底有什么区别?
- 网络设置错误造成cluster不能启动(oifcfg setif cluster_interconnect )
- C语言程序设计学习笔记:P3-判断
- 怎样成为一个PS高手
- js(javascript)页面刷新
热门文章
- 【奇技淫巧】Android真机调试看不到应用logcat或者应用logcat信息太少的解决方法
- Ansible初级应用
- 干货下载:可能是你见过的最全的网络爬虫总结
- 和华为云一起做件“伟大的事”,24万奖金等你来!
- mysql hy093_请问SQLSTATE [HY093]:参数号无效:未定义参数
- 红橙Darren视频笔记 从AIDL Demo分析Android源码走向
- Think in Java第四版 读书笔记5第11章
- Android:Activity统一堆栈管理(实现随时finish特定或是所有Activty)
- 高等组合学笔记(四): 生成函数应用, Catalan问题
- scipy.sparse.csr_matrix函数和coo_matrix函数