[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.递归边界 ...
随机推荐
- Linux服务器上的tomcat中部署web项目
首先了解一下下面几个概念,讲得不太准确:1.JVMJVM是class以及jar(实际上就是很多个class压缩在一起)的运行环境,特征就是java和javaw命令,通过这两个命令,你可以执行class ...
- 高性能js之数据访问性能
js中si中基本数据访问: 直接量, 变量, 数组项, 对象成员 性能问题: 首先要理解作用域链的基本概念,例如,当一个函数被创建时,就会产生一个激活对象(AO对象),AO对象中存储了该函数中所有的属 ...
- [java]Arrays.copyOf() VS System.arrayCopy()
If we want to copy an array, we can use either System.arraycopy() or Arrays.copyOf(). In this post, ...
- PHP把时间转换成几分钟前、几小时前、几天前的几个函数、类分享
这篇文章主要介绍了php计算时间几分钟前.几小时前.几天前的几个函数.类分享,需要的朋友可以参考下一.函数实现实例1: <?php header("Content-type: text ...
- 【Educational Codeforces Round 38】D. Buy a Ticket 堆优化Dijkstra
题意 给定一张无向图,对每个点$i\in S$求$\min_{j\in S} {2\times d(i,j)+a_j}$ 考虑多源多汇最短路会超时,换个角度考虑每个$j$,如果$j=i$,那么答案为$ ...
- rust ownership 系统
### 对象销毁规则 未被使用的函数返回值 被let绑定的值, 在函数末尾销毁,除非被moved ``` let v = obj::new("a"); other_fun(v); ...
- Java 关于创建String对象过程的内存分配
一.String s = "abc" 和 String s = new String("abc") 的区别 1.String s = "abc&qu ...
- [: xxxx: Unexpected operator
/*************************************************************************** * [: xxxx: Unexpected o ...
- 把自定义的demuxer加入ffmpeg源码
.简介:把上一篇文章中的demuxer加入ffmpeg源码中去,使可以用命令行方式调用自定义的demuxer 第一步: 在libavformat目录下新建mkdemuxer.c和mkdemuxer.h ...
- ACM学习历程—SNNUOJ1132 余数之和(数论)
Description F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数.例如F(6) = 6 % 1 + 6 % ...