题目大意

给你一个环形数列,完成环形数列上区间加法和区间求最小值。

分析

算是一道比较水的线段树模板题。
如果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【线段树】的更多相关文章

  1. NBU 2475 Survivors(RMQ线段树)

    NBU 2475Survivors 题目链接:http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid=2475 题意:给定n个人,每个人有strengt ...

  2. UESTC 764 失落的圣诞节 --RMQ/线段树

    题意:n种物品,每种物品对不同的人都有不同的价值,有三个人选,第一个为普通学生,第二个是集,第三个是祈,集和祈可以选一样的,并且还会获得加分,集和祈选的普通学生都不能选,问三个人怎样选才能使总分最高. ...

  3. [RMQ] [线段树] POJ 3368 Frequent Values

    一句话,多次查询区间的众数的次数 注意多组数据!!!! RMQ方法: 预处理 i 及其之前相同的数的个数 再倒着预处理出 i 到不是与 a[i] 相等的位置之前的一个位置, 查询时分成相同的一段和不同 ...

  4. VJ16216/RMQ/线段树单点更新

    题目链接 /* 单点更新,用RMQ维护最大值,add对c[i]修改,或加,或减. 求[l,r]的和,用sum(r)-sum(l-1).即可. */ #include<cmath> #inc ...

  5. 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)

    题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...

  6. lca 欧拉序+rmq(st) 欧拉序+rmq(线段树) 离线dfs 倍增

    https://www.luogu.org/problemnew/show/P3379 1.欧拉序+rmq(st) /* 在这里,对于一个数,选择最左边的 选择任意一个都可以,[left_index, ...

  7. ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...

  8. poj2763(lca / RMQ + 线段树)

    题目链接: http://poj.org/problem?id=2763 题意: 第一行输入 n, q, s 分别为树的顶点个数, 询问/修改个数, 初始位置. 接下来 n - 1 行形如 x, y, ...

  9. CSU1553 Good subsequence —— 二分 + RMQ/线段树

    题目链接: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n n ...

随机推荐

  1. Django lazy load 懒加载 倒序查询

    Django orm默认懒加载   Django orm默认使用的懒加载,即使用的时候才去访问数据库,且每次默认取最少的数据,当然这样有好处也有坏处... 坏处: 会导致频繁的查询数据库,如涉及到外键 ...

  2. Java中JDK和JRE的区别是什么?它们的作用分别是什么?

    JDK和JRE是Java开发和运行工具,其中JDK包含了JRE,但是JRE是可以独立安装的,它们在Java开发和运行的时候起到不同的作用~ 1.JDK JDK是Java Development Kit ...

  3. React-Native之轮播组件looped-carousel的介绍与使用

    React-Native之轮播组件looped-carousel的介绍与使用 一,关于react-native轮播组件的介绍与对比 1,react-native-swiper在动态使用网页图片,多张图 ...

  4. AngularJS 中的 factory、 service 和 provider区别,简单易懂

    转自:http://blog.csdn.net/ywl570717586/article/details/51306176 初学 AngularJS 时, 肯定会对其提供 factory . serv ...

  5. git上传本地代码到github

      1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小 ...

  6. phpstorm显示页面不停的在indexing转圈中,并且文件名还一直在刷新

    打开 File下的 Invalidate Caches / Restart...下的 Invalidate and Restart. 便可以了 ......

  7. 记录SSM框架项目迁移SpringBoot框架-----pom.xml的迁移

    第一步:迁移pom.xml文件(去除spring相关的依赖) SSM中的pom: <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  8. 用织梦建站如何去掉a这个目录,还有内容页的a

    1.另外建一个站点,将物理路径直接指向a即可. 2.去掉文章页生成的带a的路径: 只需要这一句话:  function='str_replace("/a","" ...

  9. python设计模式第二十天【迭代器模式】

    1.不使用迭代器出现的问题 (1)容器承担了太多的功能,一方面提供添加和删除等功能,还需提供遍历访问功能 (2)在容器访问遍历过程中,需要保存遍历状态,当和元素的添加和删除混杂在一起时,容易引起混乱 ...

  10. 老男孩python学习自修第十一天【内置函数】

    1.基本内置函数 help() 帮助文档 dir() 列出当前文件的所有变量和方法 vars() 列出当前文件的所有变量及其值 type() 返回变量的类型 id() 返回变量的内存地址 len() ...