bzoj5117
线段树
先看前三个操作,都是区间修改,我们对于信息维护一个二元组(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的更多相关文章
随机推荐
- AVOS Cloud 技术支持系统开源了
非常高兴跟大家说.工单系统(技术支持系统)开源了.代码托管在了Github上. 假设还未见识过工单系统,请移步于 https://ticket.avosapps.com/ 这个系统是用 AVOS Cl ...
- django 运行python manage.py sqlall books 时报错 app has migration
出现这个问题的原因是版本之前的不兼容,我用的django版本是1.8.6 而 这条python manage.py sqlall books 是基于django1.0版本的. 在django1.8.6 ...
- Spring学习【Spring概述】
从本文開始,我们就要一起学习Spring框架,首先不得不说Spring框架是一个优秀的开源框架. 当中採用IoC原理实现的基于Java Beans的配置管理和AOP的思想都是非常值得学习与使用的.以下 ...
- 摘自《Linux与unix shell编程指南》
shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...
- ActionChains报错问题总结
在使用Python2.7+Selenium3.0.2+Firefox50.1时,鼠标事件ActionChains运行总是报错,报错信息如下: C:\Python36\python3.exe C:/Us ...
- C# 通过Hook的方法 屏蔽快捷键
#region 屏蔽Windows功能键(快捷键) public delegate int HookProc(int nCode, int wParam, IntPtr lParam ...
- Hibernate中的Sesson操作
一.Session概述 Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection.Session对象是通过Session ...
- Windows server 2008 R2 如何启动任务计划程序
使用windows server 2008 R2 的任务计划程序需要启动服务 Task Scheduler 服务, windows server 2008 R2 默认状态下Task Schedule ...
- 谷歌浏览器使用SelectorGadget和Xpath Helper获取xpath和css path
在上篇文章里,介绍了如何在火狐浏览器中获取网页元素的xpath和css path. 这篇文章将介绍,在谷歌浏览器中使用SelectorGadget和Xpath Helper实现同样功能. 这两个谷歌浏 ...
- [2017-10-26]Abp系列——DTO入参验证使用方法及经验分享
本系列目录:Abp介绍和经验分享-目录 声明式的入参验证逻辑 声明式入参验证主要使用了System.ComponentModel.DataAnnotations中提供的各种验证参数的Attribute ...