大致题意:

    给出两个序列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. Golang入门教程(一)GOPATH与工作空间(Windows)

    https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/01.2.md Windows 环境: 下面我就 ...

  2. [转载]bootstrap 2.3版与3.0版的使用区别

    http://www.weste.net/2013/8-20/93261.html bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3. ...

  3. [php]php总结(2)

    18.数组$arr[null] = 20; //array([]=>20)$arr[] = 20;//默认为下一个下标赋值unset()可以删除数组元素,但不会重建索引array_values( ...

  4. 对于最近一星期jsp培训有感

    这周上课是jsp的培训,找的是外面的一个培训机构的讲师,人挺好的,讲的也不错,不过交给我们的任务是一星期做出一个网站模型——新闻发布系统. 由于我们组本科学计算机的人实在太少了,所以这个重担落在我的身 ...

  5. 14、BigInteger类简介

    BigInteger类概述 BigInteger类可以让超过Integer范围的数据进行运算,通常在对数字计算比较大的行业中应用的多一些. package com.sutaoyu.usually_cl ...

  6. 最短路径—Floyd算法

    Floyd算法 所有顶点对之间的最短路径问题是:对于给定的有向网络G=(V,E),要对G中任意两个顶点v,w(v不等于w),找出v到w的最短路径.当然我们可以n次执行DIJKSTRA算法,用FLOYD ...

  7. C# 链接webservice报错

    未处理 System.ServiceModel.EndpointNotFoundException  Message="没有终结点对可能接受消息的 http://192.168.0.168/ ...

  8. 电脑蓝屏提示unexpected store exception的解决方法

    在我们使用电脑的过程中常常会遇到许多问题,对于许多不熟悉电脑的用户常常摸不着头脑,而部分用户在使用电脑时,电脑常常出现蓝屏的情况,并提示你的电脑遇到问题需要重新启动,与此同时,其报告错误代码为“une ...

  9. mvc 分部视图(Partial)显示登陆前后变化以及Shared文件夹在解决方案资源管理器中没有显示的问题

    刚开始我的解决方案资源管理器中没有显示Shared文件夹,但Shared文件夹在项目中是实际存在的,我搜了下好像没有类似的解答(可能是我搜索的关键词不够准确).后来自己看了下vs2012. 其实解决方 ...

  10. http请求与传参

    这并不算是文章,暂时只做粗略地记录,以免忘记,因此会显得杂乱无章,随便抓了几个包和对postman截图,日后有空再完善 1.get方式 只有一种方式,那就是在url后面跟参数 2.post方式 1)表 ...