[bzoj1568]李超线段树模板题(标志永久化)
题意:要求在平面直角坐标系下维护两个操作:
1.在平面上加入一条线段。记第i条被插入的线段的标号为i。
2.给定一个数k,询问与直线 x = k相交的线段中,交点最靠上的线段的编号。
解题关键:注意标志的作用,注意虽然存的是索引,但是线段树的范围是天数的范围,也就是线段树是依据天数建的树
复杂度:$O(nlogn)$
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=;
double a[N],b[N],ans;
int tr[N<<];
bool check(int x,int y,int t){
return a[x]+b[x]*(t-)>a[y]+b[y]*(t-);
} void update(int rt,int l,int r,int now){
if(l==r){
if(check(now,tr[rt],l)) tr[rt]=now;
return;
}
int mid=(l+r)>>;
if(b[now]>b[tr[rt]]){
if(check(now, tr[rt], mid)) update(rt<<,l, mid, tr[rt]),tr[rt]=now;//更新的最后一个是tr[rt]?存的是下标,询问时肯定按log的顺序,而此时now的掌控区间已经确定,需要更新tr[rt]的掌控区间
else update(rt<<|, mid+, r, now);
}
else{
if(check(now,tr[rt],mid)) update(rt<<|, mid+, r, tr[rt]),tr[rt]=now;
else update(rt<<, l, mid, now);
}
} void query(int rt,int l,int r,int now){
ans=max(ans,a[tr[rt]]+b[tr[rt]]*(now-));
if(l==r) return;
int mid=(l+r)>>;
if(now<=mid) query(rt<<, l, mid, now);
else query(rt<<|, mid+, r, now);
} int main(){
int n,m=,c;
char s[];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",s);
if(s[]=='P'){
m++;
scanf("%lf%lf",a+m,b+m);
update(, ,n, m);//线段树中存的是下标,而值需要计算
}else{
scanf("%d",&c);
ans=;
query(, ,n, c);
printf("%d\n",(int)ans/);
}
}
return ;
}
模板2:主要是query函数的两种写法,此写法不需要建全局变量
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const int N=;
double a[N],b[N],ans;
int tr[N<<];
bool check(int x,int y,int t){
return a[x]+b[x]*(t-)>a[y]+b[y]*(t-);
} void update(int rt,int l,int r,int now){
if(l==r){
if(check(now,tr[rt],l)) tr[rt]=now;
return;
}
int mid=(l+r)>>;
if(b[now]>b[tr[rt]]){
if(check(now, tr[rt], mid)) update(rt<<,l, mid, tr[rt]),tr[rt]=now;//更新的最后一个是tr[rt]?存的是下标,询问时肯定按log的顺序,而此时now的掌控区间已经确定,需要更新tr[rt]的掌控区间
else update(rt<<|, mid+, r, now);
}
else{
if(check(now,tr[rt],mid)) update(rt<<|, mid+, r, tr[rt]),tr[rt]=now;
else update(rt<<, l, mid, now);
}
} double query(int rt,int l,int r,int now){
double ans=max(0.0,a[tr[rt]]+b[tr[rt]]*(now-));
if(l==r) return ans;
int mid=(l+r)>>;
if(now<=mid) ans=max(ans,query(rt<<, l, mid, now));
else ans=max(ans,query(rt<<|, mid+, r, now));
return ans;
} int main(){
int n,m=,c;
char s[];
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%s",s);
if(s[]=='P'){
m++;
scanf("%lf%lf",a+m,b+m);
update(, ,n, m);//线段树中存的是下标,而值需要计算
}else{
scanf("%d",&c);
double ans=query(, ,n, c);
printf("%d\n",(int)ans/);
}
}
return ;
}
[bzoj1568]李超线段树模板题(标志永久化)的更多相关文章
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- hdu1823(二维线段树模板题)
hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...
- [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]
可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...
- HDU 1698 Just a Hook (线段树模板题-区间求和)
Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...
- UESTC - 1057 秋实大哥与花 线段树模板题
http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
- zkw线段树模板题
学了zkw线段树,觉得没什么必要刷专题的吧(切不动啊).. 那先放一个模板题吧(我绝不会和你说搬了一道树状数组模板题的!!!) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加 ...
- P1243~P1247 线段树模板题总结
前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界 ...
随机推荐
- Spring笔记:IOC基础
Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...
- Python:笔记(3)——面向对象编程
Python:笔记(3)——面向对象编程 类和面向对象编程 1.类的创建 说明:和Java不同的是,我们不需要显示的说明类的字段属性,并且可以在后面动态的添加. 2.构造函数 构造函数的功能毋庸置疑, ...
- SS中的三种样式来源:创作人员、读者和用户代理
CSS中的样式一共有三种来源:创作人员.读者和用户代理,来源的不同会影响到样式的层叠方式,很多第一次学习CSS的朋友,对这三种来源可能会存在一些困惑,下面我写一下自己的理解,若有错误的地方还请指正. ...
- DB2常见错误
+098 01568 动态SQL语句用分号结束+100 02000 没有找到满足SQL语句的行+110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统+111 0159 ...
- Spring Cloud之服务治理(注册发现)
服务治理SpringCloud Eureka 什么是服务治理 在传统rpc远程调用中,服务与服务依赖关系,管理比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用.负载均衡.容 ...
- TMS Scripter importtool的使用
uses ap_DateUtils; showmessage(dayof(now)); //注册delphi对象或变量 : IDEScripter1 IDEScripter1.AddConstan ...
- Linux离线同步时间
Linux离线同步时间 思路:以其中一台时间为准 脚本 #!/bin/shcurrent=`date '+%H:%M:%S'` for i in bigdata1 bigdata2 bigdata3 ...
- Win7远程桌面_ZC01
1.Win7的远程桌面,在一开始设置成全屏显示,当远程桌面窗口 切换为非全屏的状态时,要想再切换成全屏状态 就比较困难了(我的笔记本ThinkpadE440一直没有弄成功...) 1.1.网上搜索各种 ...
- PHP继承中$this的问题
在父类中的构造函数中使用$this , 这是$this指的是正在实例化的子类对象,不管是parent还是继承调用父类的构造函数. 如: class CompanyController extends ...
- 智课雅思词汇---十四、ante,anti不仅是词根还是前缀
智课雅思词汇---十四.ante,anti不仅是词根还是前缀 一.总结 一句话总结:来源于拉丁语 ante 前.词根ant 为 anti 的变体.ante,anti不仅是词根还是前缀. 词根:ante ...