大致题意:

    给出两个序列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 李超线段树的更多相关文章

  1. Codechef TSUM2 Sum on Tree 点分治、李超线段树

    传送门 点分治模板题都不会迟早要完 发现这道题需要统计所有路径的信息,考虑点分治统计路径信息. 点分治之后,因为路径是有向的,所以对于每一条路径都有向上和向下的两种.那么如果一条向上的路径,点数为\( ...

  2. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  3. 【BZOJ-3165】Segment 李超线段树(标记永久化)

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 148[Submit][Sta ...

  4. 【BZOJ-1568】Blue Mary开公司 李超线段树 (标记永久化)

    1568: [JSOI2008]Blue Mary开公司 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 557  Solved: 192[Submit ...

  5. Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)

    听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...

  6. 【BZOJ3165】[HEOI2013]Segment(李超线段树)

    [BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ...

  7. 【BZOJ1568】[JSOI2008]Blue Mary开公司(李超线段树)

    [BZOJ1568][JSOI2008]Blue Mary开公司(李超线段树) 题面 BZOJ 洛谷 题解 是模板题啊. #include<iostream> #include<cs ...

  8. Luogu P4097 [HEOI2013]Segment 李超线段树

    题目链接 \(Click\) \(Here\) 李超线段树的模板.但是因为我实在太\(Naive\)了,想象不到实现方法. 看代码就能懂的东西,放在这里用于复习. #include <bits/ ...

  9. BZOJ.3938.Robot(李超线段树)

    BZOJ UOJ 以时间\(t\)为横坐标,位置\(p\)为纵坐标建坐标系,那每个机器人就是一条\(0\sim INF\)的折线. 用李超线段树维护最大最小值.对于折线分成若干条线段依次插入即可. 最 ...

随机推荐

  1. AngularJS - 下一个大框架

    AngularJS AngularJS是web应用的下一个巨头. AngularJS如果为创建web应用而设计,那它就是HTML的套路了.具有数据绑定, MVW, MVVM, MVC, 依赖注入的声明 ...

  2. 【转】C# Graphics类详解

    Brush 类 .NET Framework 4 定义用于填充图形形状(如矩形.椭圆.饼形.多边形和封闭路径)的内部的对象. 属于命名空间:  System.Drawing 这是一个抽象基类,不能进行 ...

  3. 基本控件文档-UIKit结构图

    CHENYILONG Blog 基本控件文档-UIKit结构图 Fullscreen   UIKit结构图 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博htt ...

  4. 【leetcode 简单】 第九十一题 找不同

    给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...

  5. 去除zabbix calculate 模式下,有时候分母为零的情况(Cannot evaluate expression: division by zero. )

    zabbix的监控类型支持一种calculate的方式,可以对几个item结果进行简单的计算,但有时会出现分母为零的情况,这时候监控项就会报错 Cannot evaluate expression: ...

  6. linux挂载光盘

    1.找到光盘的位置 ls -l /dev |grep cdrom mount /dev/sr0  /mnt [root@node2 /]# ls -l /dev |grep cdrom lrwxrwx ...

  7. CentOS7最小化安装之后无法联网以及无法使用ifconfig以及无法使用yum安装软件

    无法联网解决办法,CentOS-7默认网卡未激活,进入BOOS设置修改,或者直接修改配置文件,然后重启服务 1 修改网卡配置文件: 激活: 2 重启服务即可: service network rest ...

  8. pytorch梯度裁剪(Clipping Gradient):torch.nn.utils.clip_grad_norm

    torch.nn.utils.clip_grad_norm(parameters, max_norm, norm_type=2) 1.梯度裁剪原理(http://blog.csdn.net/qq_29 ...

  9. Django-ORM简介

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  10. TF-池化函数 tf.nn.max_pool 的介绍

    转载自此大神 http://blog.csdn.net/mao_xiao_feng/article/details/53453926 max pooling是CNN当中的最大值池化操作,其实用法和卷积 ...