题目链接

UOJ #164

题解

首先,这道题有三种询问:区间加、区间减(减完对\(0\)取\(\max\))、区间修改。

可以用一种标记来表示——标记\((a, b)\)表示把原来的值加上\(a\)后对\(b\)取\(\max\)。

那么区间加\(x\)就是\((x, -\infty)\),区间减\(x\)就是\((-x, 0)\), 区间修改就是\((-\infty, x)\)。

然后,这道题有两个询问,一个询问当前值,一个询问历史最大值,于是我们打两种不同的标记,分别维护两个询问的答案:\((a_0, b_0)\)表示当前,\((a_1, b_1)\)表示历史最大值。

下面的问题就是如何下放标记(默认\((a, b)\)是原有的,\((c, d)\)是后来加上的)。

合并\((a_0, b_0)\)和\((c_0, d_0)\):\((a_0 + c_0, \max(b_0 + c_0, d_0))\)

合并\((a_1, b_1)\)和\((c_1, d_1)\):\((\max(a_1, a_0 + c_1), \max(b_1, b_0 + c_1, d_1))\)

然后就可以写了 = =

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#define space putchar(' ')
#define enter putchar('\n')
typedef long long ll;
using namespace std;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 500005;
const ll INF = 1e18;
int n, m;
ll a[4*N][2], b[4*N][2], val[N]; void upt(int k){
a[k][1] = max(a[k][1], a[k][0] + a[k >> 1][1]);
b[k][1] = max(b[k][1], max(b[k][0] + a[k >> 1][1], b[k >> 1][1]));
a[k][0] = max(a[k][0] + a[k >> 1][0], -INF);
b[k][0] = max(b[k][0] + a[k >> 1][0], b[k >> 1][0]);
}
void pushdown(int k){
upt(k << 1), upt(k << 1 | 1);
a[k][0] = a[k][1] = 0, b[k][0] = b[k][1] = -INF;
}
void change(int k, int l, int r, int ql, int qr, ll x, ll y){
if(ql <= l && qr >= r){
a[k][1] = max(a[k][1], (a[k][0] + x));
b[k][1] = max(b[k][1], max(b[k][0] + x, y));
a[k][0] = max(a[k][0] + x, -INF);
b[k][0] = max(b[k][0] + x, y);
return;
}
pushdown(k);
int mid = (l + r) >> 1;
if(ql <= mid) change(k << 1, l, mid, ql, qr, x, y);
if(qr > mid) change(k << 1 | 1, mid + 1, r, ql, qr, x, y);
}
ll query(int k, int l, int r, int p, int o){
if(l == r) return max(val[l] + a[k][o], b[k][o]);
pushdown(k);
int mid = (l + r) >> 1;
if(p <= mid) return query(k << 1, l, mid, p, o);
else return query(k << 1 | 1, mid + 1, r, p, o);
} int main(){ read(n), read(m);
for(int i = 1; i <= n; i++) read(val[i]);
int op, l, r;
ll x;
while(m--){
read(op);
if(op <= 3){
read(l), read(r), read(x);
if(op == 1) change(1, 1, n, l, r, x, -INF);
if(op == 2) change(1, 1, n, l, r, -x, 0);
if(op == 3) change(1, 1, n, l, r, -INF, x);
}
else read(x), write(query(1, 1, n, x, op - 4)), enter;
} return 0;
}

UOJ #164. 【清华集训2015】V | 线段树的更多相关文章

  1. UOJ #164 [清华集训2015]V (线段树)

    题目链接 http://uoj.ac/problem/164 题解 神仙线段树题. 首先赋值操作可以等价于减掉正无穷再加上\(x\). 假设某个位置从前到后的操作序列是: \(x_1,x_2,..., ...

  2. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

  3. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  4. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  5. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  6. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

  7. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  8. 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

    传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...

  9. @uoj - 164@ 【清华集训2015】V

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化 ...

随机推荐

  1. (转)Putty server refused our key的三种原因和解决方法

    原文 上一篇博文介绍了使用Putty免密码登录,我后面试了另一台虚拟机,结果putty显示错误server refused our key(在linux下则表现为仍需要输入密码),搜索了下,很多人都遇 ...

  2. Luogu P2657 [SCOI2009]windy数

    一道比较基础的数位DP,还是挺套路的. 首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式: \(f[a,b]=f(b)-f(a-1)\) 然后考虑如何求解\(f(x)\).我 ...

  3. Part 6:静态文件--Django从入门到精通系列教程

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 前面我们编写了一个经过测试的投票应用,现在让 ...

  4. 12.14 Daily Scrum

      Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             邓亚梅             美化搜索框UI. 美 ...

  5. Natural Language Generation/Abstractive Summarization

    调研目的: 了解生成式文本摘要的常用技术和当前的发展趋势,明确当前项目有什么样的摘要需求,判断现有技术能否用于满足当前的需求,进一步明确毕业设计方向及其可行性 调研方向: 项目中需要用到摘要的地方以及 ...

  6. ml-模型评估与选择

    1.基本概念 错误率E=分类错误的样本数a/总样本数m:精度=1-a/m 经验误差/训练误差:在训练集上产生的 泛化误差:在测试集上产生的=====>要把这个泛化误差降到最小化. 2.评估方法 ...

  7. 量产救U盘

    同事U盘不能格式化,快速格式化失败,非快速格式化也失败.就问谁有360安全软件,试试能不能格式化. 我说我有火绒,但是不知道火绒并没有格式化U盘的功能(应该没有吧,反正我找了以后没找到) 那怎么办呢? ...

  8. CodeIgniter中使用base_url()时显示http://::1/ci/

    URL 辅助函数文件包含了一些帮助你处理 URL 的函数. 加载辅助函数后,你可以使用base_url(),site_url(),current_url()等一些列函数,但是有时候你会遇到这种问题,就 ...

  9. PyXB: Python XML Schema Bindings

    http://pyxb.sourceforge.net/ PyXB (“pixbee”) is a pure Python package that generates Python source c ...

  10. 排查mysql innodb Lock wait timeout exceeded; try restarting transaction的问题

    OMG写的时候崩溃了一次. 触发关注这个问题的事情是 我们在使用pt-online-schedule 改表的时候总是拿不到锁,并且报出mysql innodb Lock wait timeout ex ...