[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\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...
随机推荐
- git fatal: The remote end hung up unexpectedly 错误
使用git将本地项目添加到远程仓库报以下错误 $ git push -u origin master fatal: The remote end hung up unexpectedly | 11.0 ...
- 20155330 2016-2017-2 《Java程序设计》第八周学习总结
20155330 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 ...
- 【译】第六篇 Integration Services:初级工作流管理
本篇文章是Integration Services系列的第六篇,详细内容请参考原文. 简介在前几篇文章中,我们关注使用增量加载方式加载数据.在本篇文章,我们将关注使用优先约束管理SSIS控制流中的工作 ...
- 关于Python编码问题小记
Python编码问题小记: 引子: 最近在复习redis,当我在获取redis的key的时候,redis 存储英文和汉字下面这个样子的,我知道汉字是用16进制的UTF-8编码了,然后突然很想搞清楚字符 ...
- 《区块链100问》第82集:应用类项目Golem
Golem是第一个基于以太坊区块链打造的计算资源交易平台.通过区块链,Golem能链接全球的算力资源,从而实现计算能力的全球共享.应用所有者和个体用户(算力“请求方”)可以点对点地从其他用户处租用算力 ...
- Unix/Linux系统时间函数API
首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...
- Shell-修改MySQL默认root密码
Code: mysqltmppwd=`cat /tmp/.mysql_secret | cut -b 87-102` mysqladmin -u root -p${mysqltmppwd} passw ...
- c# 通过Windows服务启动外部程序
1. 新建一个Windows服务应用程序 创建项目——>Visual C# 左侧的"+"——>Windows ——>Windows 服务(右侧模板)——>输 ...
- video标签、audio标签
1.video标签 <video src="nans.mp4" controls="controls" autoplay="autoplay& ...
- 洛谷P3119 草鉴定
这个题调了一天.. 传送门 读完题目之后我们不难想出这个题是个tarjan缩点问题,因为尽量多的经过草场,所以一号点所在的强连通分量里左右的点都是不需要在进行走逆向边,所能到达的. 然后问题就落在怎么 ...