[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.递归边界 ...
随机推荐
- rails dependent
dependent 可以設定當物件刪除時,也會順便刪除它的 has_many 物件: class Event < ActiveRecord::Base has_many :attendees, ...
- vo类总结
1.Camera类 camera类里面,首先camera有5个变量,fx_,fy_,cx_,cy_,depth_scale_5个变量,由外部传fx,fy,cx,cy,depth_scale给它.定义了 ...
- Vim 的命令模式转插入模式
一.在命令模式输入下面的快捷方式: i 在当前光标前插入字符: I 在当前行行首插入字符: a 在当前光标后插入字符: A 在当前行行尾插入字符: o 在当前行下面另起一新行: O 在当前行上面另起一 ...
- SpringCloud之Eureka高可用集群环境搭建
注册中心集群 在微服务中,注册中心非常核心,可以实现服务治理,如果一旦注册出现故障的时候,可能会导致整个微服务无法访问,在这时候就需要对注册中心实现高可用集群模式. Eureka集群相当简单:相互注册 ...
- (转)edm注意事项
格式编码 1.页面宽度请设定在600到800px以内,长度1024px以内. 2.HTML编码请使用utf-8. 3.HTML代码在15KB以内.(各个邮箱的收件标准不一样,如果超出15KB您的邮件很 ...
- spring 4 + jpa(hibernate 3/4) + spring mvc 多数据源配置
先从persistence.xml开始: <?xml version=”1.0″ encoding=”UTF-8″?><persistence version=”2.1″ xmlns ...
- JavaUtil_06_HttpUtil_使用httpclient实现
一.简介 使用 appache 的 httpclient 来实现的 二.源码 package com.ray.weixin.gz.util; import java.io.File; import j ...
- json-lib简单处理json和对json的简单介绍
JSON 1.json是什么? *它是js提供的一种数据交换格式 2.json的语法 *{}:是对象! >属性名必须使用双引号括起来!单引号不行!!! >属性值: *null *数值 *数 ...
- mfc创建文档视图过程
一.如何创建文档视图界面: 创建新的文档视图界面,只需要调用CDocTemplate::OpenDocumentFile(strpath)即可.(strpath为要打开的文档路径,如果是NULL,则生 ...
- leetcode 258. Add Digits(数论)
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...