[CF52C]Circular RMQ【线段树】
题目大意
给你一个环形数列,完成环形数列上区间加法和区间求最小值。
分析
算是一道比较水的线段树模板题。
如果l>r的话,那么修改l,n和1,r区间。
不然的话那么就修改l,r区间。
其他的基础操作可以看我的随笔:【传送门】
还要注意开long long
。
ac代码
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define N 200005
#define ll long long
#define linf 9223372036854775807
using namespace std;
ll a[N];
bool bo;
template <typename T>
inline void read(T &x) {
x = 0; T fl = 1;
bo = 0;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') fl = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
if (ch == ' ') bo = 1;
x *= fl;
}
struct segment_tree {
#define lc (nod << 1)
#define rc (nod << 1 | 1)
#define mid ((l + r) >> 1)
struct node {
ll mn, tag;
int l, r;
node() {
mn = l = r = tag;
}
}tr[N << 2];
void pushup(int nod) {
tr[nod].mn = min(tr[lc].mn, tr[rc].mn);
}
void pushdown(int nod) {
if (tr[nod].tag == 0 || tr[nod].l == tr[nod].r) return;
ll tmp = tr[nod].tag;
tr[nod].tag = 0;
tr[lc].mn += tmp;
tr[rc].mn += tmp;
tr[lc].tag += tmp;
tr[rc].tag += tmp;
}
void build(int l, int r, int nod, ll *a) {
tr[nod].l = l, tr[nod].r = r;
if (l == r) {
tr[nod].mn = a[l];
return;
}
build(l, mid, lc, a);
build(mid + 1, r, rc, a);
pushup(nod);
}
void update_sec(int ql, int qr, int nod, ll val) {
int l = tr[nod].l, r = tr[nod].r;
pushdown(nod);
if (ql <= l && r <= qr) {
tr[nod].mn += val;
tr[nod].tag += val;
return;
}
if (ql <= mid) update_sec(ql, qr, lc, val);
if (qr > mid) update_sec(ql, qr, rc, val);
pushup(nod);
}
ll query_sec_min(int ql, int qr, int nod) {
int l = tr[nod].l, r = tr[nod].r;
pushdown(nod);
if (ql <= l && r <= qr) return tr[nod].mn;
ll res = linf;
if (ql <= mid) res = min(res, query_sec_min(ql, qr, lc));
if (qr > mid) res = min(res, query_sec_min(ql, qr, rc));
return res;
}
}tr;
int n, m;
int main() {
read(n);
for (int i = 1; i <= n; i ++) read(a[i]);
tr.build(1, n, 1, a);
read(m);
while (m --) {
int l, r;
read(l); read(r);
l ++; r ++;
if (!bo) {
ll res = linf;
if (l > r) {
res = min(res, tr.query_sec_min(l, n, 1));
res = min(res, tr.query_sec_min(1, r, 1));
}
else res = min(res, tr.query_sec_min(l, r, 1));
printf("%lld\n", res);
}
else {
ll x;
cin>> x;
if (l > r) {
tr.update_sec(l, n, 1, x);
tr.update_sec(1, r, 1, x);
}
else tr.update_sec(l, r, 1, x);
}
}
return 0;
}
[CF52C]Circular RMQ【线段树】的更多相关文章
- NBU 2475 Survivors(RMQ线段树)
NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...
- UESTC 764 失落的圣诞节 --RMQ/线段树
题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...
- [RMQ] [线段树] POJ 3368 Frequent Values
一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...
- VJ16216/RMQ/线段树单点更新
题目链接 /* 单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减. 求[l,r]的和,用sum(r)-sum(l-1).即可. */ #include<cmath> #inc ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增
https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- poj2763(lca / RMQ + 线段树)
题目链接: http://poj.org/problem?id=2763 题意: 第一行输入 n, q, s 分别为树的顶点个数, 询问/修改个数, 初始位置. 接下来 n - 1 行形如 x, y, ...
- CSU1553 Good subsequence —— 二分 + RMQ/线段树
题目链接: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n n ...
随机推荐
- eclipse中不能保存汉字的解决方法
首先分清是打开jsp页面的问题还是java文件的问题? 对于java文件,只要在你的项目上点击右键选择“Propertise”(属性)然后点击“Info”标签将里面的Text file enco ...
- 使用postman发送post数据时遇到的问题
平时工作最多的内容就是写接口,免不了测试自己写的接口是否正确,postman就是一个不错的选择 使用postman最好了解一些http协议的知识,不然就会闹笑话,比如,下面这个图片中的做法,尝试发送p ...
- Notepad++的一个用法 转换为unix 格式的文件
1. 跟昨天的linux 下面无法执行脚本的blog 一样 今天发现 notepad++ 有一个功能如下图: 双击 就能够选择文件的类型.. 转换为 unix 格式 就可以 在linux 下面执行了. ...
- Linux上的一些基本常用命令
上传下载文件:// 首先安装lrzsz # yum -y install lrzsz // 上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可.# rz // 下载文件,执行命令sz ...
- "errcode":40163,"errmsg":"code been used...报错,做PC微信登录时出现code been used...报错问题
这是一个坑,一个巨坑,一个恶心的坑 出现这个问题的大概意思就是微信回调了两次登录接口,code使用了两次,而在微信官方文档上写着code只能用一次,用来获取access_token,但我TM看着就糊涂 ...
- Linux安装mysql5.6
安装mysql5.6https://www.cnblogs.com/wangdaijun/p/6132632.html
- Python 爬虫 解析库的使用 --- XPath
一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...
- python爬虫之git的使用(windows下pycharm使用)
相信很多同学学会了git或者github以后都不知道怎么跟windows上的pycharm连在一起工作,那么下面我们开始介绍简单的安装和使用方法. 一.安装 1.首先你的有一个github的账户.注册 ...
- AspectJ用注解替换xml配置
AspectJ基于注解的使用 AspectJ简介 AspectJ是一个基于Java语言的AOP框架,一般 其主要用途:自定义开发 一般情况下spring自动生成代理,要配置aop, 首先确定目标类,a ...
- 所活天数!java Date应用
package cn.jiu.com; import java.text.ParseException; import java.text.SimpleDateFormat; import java. ...