线段树

先看前三个操作,都是区间修改,我们对于信息维护一个二元组(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. AVOS Cloud 技术支持系统开源了

    非常高兴跟大家说.工单系统(技术支持系统)开源了.代码托管在了Github上. 假设还未见识过工单系统,请移步于 https://ticket.avosapps.com/ 这个系统是用 AVOS Cl ...

  2. django 运行python manage.py sqlall books 时报错 app has migration

    出现这个问题的原因是版本之前的不兼容,我用的django版本是1.8.6 而 这条python manage.py sqlall books 是基于django1.0版本的. 在django1.8.6 ...

  3. Spring学习【Spring概述】

    从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架. 当中採用IoC原理实现的基于Java Beans的配置管理和AOP的思想都是非常值得学习与使用的.以下 ...

  4. 摘自《Linux与unix shell编程指南》

    shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...

  5. ActionChains报错问题总结

    在使用Python2.7+Selenium3.0.2+Firefox50.1时,鼠标事件ActionChains运行总是报错,报错信息如下: C:\Python36\python3.exe C:/Us ...

  6. C# 通过Hook的方法 屏蔽快捷键

     #region 屏蔽Windows功能键(快捷键)         public delegate int HookProc(int nCode, int wParam, IntPtr lParam ...

  7. Hibernate中的Sesson操作

    一.Session概述 Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection.Session对象是通过Session ...

  8. Windows server 2008 R2 如何启动任务计划程序

    使用windows server 2008 R2  的任务计划程序需要启动服务 Task Scheduler 服务, windows server 2008 R2 默认状态下Task Schedule ...

  9. 谷歌浏览器使用SelectorGadget和Xpath Helper获取xpath和css path

    在上篇文章里,介绍了如何在火狐浏览器中获取网页元素的xpath和css path. 这篇文章将介绍,在谷歌浏览器中使用SelectorGadget和Xpath Helper实现同样功能. 这两个谷歌浏 ...

  10. [2017-10-26]Abp系列——DTO入参验证使用方法及经验分享

    本系列目录:Abp介绍和经验分享-目录 声明式的入参验证逻辑 声明式入参验证主要使用了System.ComponentModel.DataAnnotations中提供的各种验证参数的Attribute ...