线段树

先看前三个操作,都是区间修改,我们对于信息维护一个二元组(a,b),表示x=max(x+a,b),那么第一个操作就是(a,-inf),第二个是(-a,0),第三个是(-inf,a)

然后看查询,第一个就是维护所有信息,那么考虑合并标记,(a,b)=(max(a1+a2,-inf),max(max(b1+a2,-inf),b2)),这里和-inf取max是为了防止溢出

然后是最后一个查询,其实就是相当于最大前缀和,那么我们考虑维护这个东西,每次下来标记,设为(f,g),f是父节点的最大子段和,g是总和,那么ff=max(max(ff->a,tt->a+f->a,max(tt->b,f->b)),就是可以取原来的和原来的和加上新的操作,可以取max,因为我们希望的是最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5e5 + ;
const ll inf = 1e16;
inline ll rd()
{
ll x = , f = ; char c = getchar();
while(c < '' || c > '') { if(c == '-') f = -; c = getchar(); }
while(c >= '' && c <= '') { x = x * + c - ''; c = getchar(); }
return x * f;
}
int n, m;
ll a[N];
struct node {
ll A, B;
node() { A = ; B = -inf; }
node(ll _, ll __) : A(_), B(__) {}
node friend max(const node &a, const node &b) {
return node(max(a.A, b.A), max(a.B, b.B));
}
node friend operator + (const node &a, const node &b) {
return node(max(a.A + b.A, -inf), max(max(a.B + b.A, -inf), b.B));
}
bool Null()
{
return A == && B == -inf;
}
} T[N << ], F[N << ];
void paint(int x, node f, node t)
{
F[x] = max(F[x], T[x] + f);
T[x] = T[x] + t;
}
void pd(int x)
{
if(F[x].Null() && T[x].Null()) return;
paint(x << , F[x], T[x]);
paint(x << | , F[x], T[x]);
F[x] = T[x] = node(, -inf);
}
void modify(int l, int r, int x, int a, int b, node t)
{
if(l > b || r < a) return;
if(l >= a && r <= b)
{
paint(x, t, t);
return;
}
pd(x);
int mid = (l + r) >> ;
modify(l, mid, x << , a, b, t);
modify(mid + , r, x << | , a, b, t);
}
int query(int l, int r, int x, int p)
{
if(l == r) return x;
pd(x);
int mid = (l + r) >> ;
if(p <= mid) return query(l, mid, x << , p);
else return query(mid + , r, x << | , p);
}
int main()
{
n = rd();
m = rd();
for(int i = ; i <= n; ++i) a[i] = rd();
while(m--)
{
int opt = rd(), l, r, x;
if(opt == )
{
l = rd();
r = rd();
x = rd();
modify(, n, , l, r, node(x, -inf));
}
if(opt == )
{
l = rd();
r = rd();
x = rd();
modify(, n, , l, r, node(-x, ));
}
if(opt == )
{
l = rd();
r = rd();
x = rd();
modify(, n, , l, r, node(-inf, x));
}
if(opt == )
{
l = rd();
x = query(, n, , l);
printf("%lld\n", max(a[l] + T[x].A, T[x].B));
}
if(opt == )
{
l = rd();
x = query(, n, , l);
printf("%lld\n", max(a[l] + F[x].A, F[x].B));
}
}
return ;
}

bzoj5117的更多相关文章

随机推荐

  1. Django小项目练习

    Django学生管理系统 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^class_list/', views.class_list ...

  2. Linux安装Java/Maven

    所需文件:jdk 下载 安装Java INSTALL_PATH=/opt/soft TAR_FILE=/mnt/d/resources/soft/jdk-8u152-linux-x64.tar.gz ...

  3. Android 短信验证码控件

    Android 短信验证码控件,便于项目中使用统一样式,统一提示改动.个人觉得挺好用的 <span style="font-size:18px;">public cla ...

  4. Python自动生成文章

    为了应付某些情况,需要做17份记录.虽然不很重要,但是17份完全雷同也不很好.大体看了一下,此记录大致分为四段.于是决定每段提供四种选项,每段四选一,拼凑成四段文字,存成一个文件.文件名就叫“XX记录 ...

  5. AngularJs 在控制器中过滤

    <html> <head> <title>Simple app</title> <script src="https://ajax.go ...

  6. STL algorihtm算法iter_swap(29)

    iter_swap原型: std::iter_swap template <class ForwardIterator1, class ForwardIterator2> void ite ...

  7. [iOS] 初探 iOS8 中的 Size Class

    本文转载至  http://www.itnose.net/detail/6112176.html   以前和安卓的同学聊天的时候,谈到适配一直是一个非常开心的话题,看到他们被各种屏幕适配折磨的欲仙欲死 ...

  8. EasyDarwin开源流媒体云平台中boost Base64编解码后与源长度不匹配的bug

    本文转自EasyDarwin团队Alex的博客:http://blog.csdn.net/cai6811376 EasyDarwin云平台中部分协议使用了Base64编码昨晚报文通信的载体.比如在对摄 ...

  9. flume采集微信小程序数据

    flume采集微信小程序数据 flume收集前端埋点数据[1]POST请求http://f.x.com:50000数据格式: JsonArray数据格式示例:[{ "headers" ...

  10. service oriented architecture 构造分布式计算的应用程序的方法 面向服务的架构 分解技术

    zh.wikipedia.org/wiki/面向服务的架构 [程序功能做为服务] 面向服务的体系结构(英语:service-oriented architecture)是构造分布式計算的应用程序的方法 ...