[CodeChef - STREETTA] The Street 李超线段树
大致题意:
给出两个序列A,B,A初始为负无穷,B初始为0,有三种操作
1、在A上区间[u,v]上加一个等差数列,取与原本A序列的最大值。
2、在B上区间[u,v]上加一个等差数列。
3、给出一个点X,询问A[X]+B[X]的值。
学习一个李超线段树就ojbk了,对于每次加入的等差数列,可以转化为y=a*i+b的一条线段,用李超线段树维护所有线段
所覆盖的区间即可。数据范围比较大,线段树可以动态开点,也可以离散化。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
#include<cstdlib>
#include<cmath>
#include<list>
using namespace std;
#define MAXN 10000006
#define eps 1e-8
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Fore(i,a,b) for(int i=a;i>=b;i--)
#define lson l,mid
#define rson mid+1,r
#define mkp make_pair
#define pb push_back
#define cr clear()
#define sz size()
#define met(a,b) memset(a,b,sizeof(a))
#define iossy ios::sync_with_stdio(false)
#define fr freopen
#define pi acos(-1.0)
#define Vector Point
#define fir first
#define sec second
const long long inf=1LL<<;
const int Mod=1e9+;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
inline int scan(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct LcSegmentTree{
ll k,b,sk,sb;
int mk;
int ls,rs;
};
ll ans1,ans2;
LcSegmentTree t[MAXN];
int tot=;
void seg1_change(int L,int R,ll a,ll b,int l,int r,int &rt){
if(!rt) {
rt=++tot;
t[rt].k=;
t[rt].b=-inf;
}
//cout<<L<<" "<<R<<" "<<a<<" "<<b<<" "<<l<<" "<<r<<" "<<rt<<" "<<t[rt].mk<<" "<<t[rt].k<<" "<<t[rt].b<<endl;
if(L==l && R==r){
bool f1=(t[rt].k*l+t[rt].b>=a*l+b),f2=(t[rt].k*r+t[rt].b>=a*r+b);
if(f1&&f2) return ;
if(!f1 && !f2) {t[rt].k=a,t[rt].b=b;return ;}
int mid=l+r>>;
bool fm=t[rt].k*mid+t[rt].b>=a*mid+b;
if(f1){
if(fm) seg1_change(mid+,R,a,b,rson,t[rt].rs);
else {
seg1_change(L,mid,t[rt].k,t[rt].b,lson,t[rt].ls);
t[rt].k=a;
t[rt].b=b;
}
}else{
if(fm) seg1_change(L,mid,a,b,lson,t[rt].ls);
else {
seg1_change(mid+,R,t[rt].k,t[rt].b,rson,t[rt].rs);
t[rt].k=a;t[rt].b=b;
}
}
return ;
}
int mid=l+r>>;
if(R<=mid) seg1_change(L,R,a,b,lson,t[rt].ls);
else if(L>mid) seg1_change(L,R,a,b,rson,t[rt].rs);
else seg1_change(L,mid,a,b,lson,t[rt].ls),seg1_change(mid+,R,a,b,rson,t[rt].rs);
}
void seg2_change(int L,int R,ll a,ll b,int l,int r,int &rt){
if(!rt) {
rt=++tot;
t[rt].k=;
t[rt].b=-inf;
}
if(L==l && R==r) {
t[rt].sk+=a;
t[rt].sb+=b;
return ;
}
int mid=l+r>>;
if(R<=mid) seg2_change(L,R,a,b,lson,t[rt].ls);
else if(L>mid) seg2_change(L,R,a,b,rson,t[rt].rs);
else seg2_change(L,mid,a,b,lson,t[rt].ls),seg2_change(mid+,R,a,b,rson,t[rt].rs);
}
void query(int xx,int l,int r,int rt){
if(!rt) return ;
ans1+=t[rt].sk*xx+t[rt].sb;
ans2=max(ans2,t[rt].k*xx+t[rt].b);
if(l==r) return ;
int mid=l+r>>;
if(xx<=mid) query(xx,lson,t[rt].ls);
else query(xx,rson,t[rt].rs);
}
int n,m,ty,u,v,ps,rot;
ll a,b;
void solve(){
met(t,);
tot=;rot=;
n=scan();m=scan();
while(m--){
ty=scan();
if(ty==) {
ps=scan();
ans1=;ans2=-inf;
query(ps,,n,rot);
if(ans2<=-inf) puts("NA");
else printf("%lld\n",ans1+ans2);
}else{
u=scan();v=scan();a=scan();b=scan();
b=b-a*u;
if(ty==) seg1_change(u,v,a,b,,n,rot);
else seg2_change(u,v,a,b,,n,rot);
}
}
}
int main(){
int t=;
while(t--) solve();
return ;
}
[CodeChef - STREETTA] The Street 李超线段树的更多相关文章
- Codechef TSUM2 Sum on Tree 点分治、李超线段树
传送门 点分治模板题都不会迟早要完 发现这道题需要统计所有路径的信息,考虑点分治统计路径信息. 点分治之后,因为路径是有向的,所以对于每一条路径都有向上和向下的两种.那么如果一条向上的路径,点数为\( ...
- 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交
4515: [Sdoi2016]游戏 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 304 Solved: 129[Submit][Status][ ...
- 【BZOJ-3165】Segment 李超线段树(标记永久化)
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 368 Solved: 148[Submit][Sta ...
- 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)
1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 557 Solved: 192[Submit ...
- Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)
听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...
- 【BZOJ3165】[HEOI2013]Segment(李超线段树)
[BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...
- 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)
[BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...
- Luogu P4097 [HEOI2013]Segment 李超线段树
题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...
- BZOJ.3938.Robot(李超线段树)
BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
随机推荐
- Maximal Rectangle&Largest Rectangle in Histogram
这两天在做leetcode的题目,最大矩形的题目以前遇到很多次了,一直都是用最笨的方法,扫描每个柱子,变换宽度,计算矩形面积,一直都以为就这样O(n2)的方法了,没有想到居然还有研究出了O(n)的算法 ...
- 【AtCoder Grand Contest 001F】Wide Swap [线段树][拓扑]
Wide Swap Time Limit: 50 Sec Memory Limit: 512 MB Description Input Output Sample Input 8 3 4 5 7 8 ...
- Spring Aop、拦截器、过滤器的区别
Filter过滤器:拦截web访问url地址.Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问.Spring AOP拦截器:只能拦截Spring管理Bean的访 ...
- mysql定时删除数据
删除三天前的数据的sql DELETE FROM table WHERE created_on < DATE_SUB(CURDATE(),INTERVAL 3 DAY); CURDATE() 返 ...
- python初步学习-Python模块之 re
re 正则表达式 python正则表达式在线检验网站 python re正则表达式语法 匹配字符 语法 解释 表达式 匹配实例 . 匹配任意除"\n"以外的任何字符 a.c abc ...
- Linux的基础优化-2
1.启动网卡 ifup eth0 2.SSH链接 ifconfig 查看IP后SSH终端连接3.更新源 最小化安装是没有wget工具的,必须先安装再修改源 yum install wget 备份原系统 ...
- HTTP请求方法 之 HEAD
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- BOOST 之filesystem, path
目录[-] 使用 boost::filesystem 的第一个程序 清单 1. 用于确定某个文件的类型是否为 Directory 的代码 了解 Boost path 对象 清单 2. 创建 Boost ...
- 网页中嵌入swf文件的几种方法
1. object + embed 传统的方法 优点:浏览器兼容性好,是 Macromedia 一直以来的官方方法缺点:a.embed 标签是不符合 W3C 的规范的,无法通过验证.当然, ...
- FPGA quartus开发中常见的错误处理
1.Warning: An incorrect timescale is selected for the Verilog Output (.VO) file of this PLL design. ...