线段树区间更新维护最小值。。。记得下放标记。。。

如果线段树上的一个完整区间被修改,那么最小值和最大值增加相应的值后不变,

会改变是因为一部分改变而另外一部分没有改变所以维护一下就好。

询问的时候也要记得下放标记。。。

数据结构快忘了,贴个板。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+; struct Seg
{
ll lazy;
ll Min;
}tr[maxn<<]; int a[maxn];
int n; #define lid (id<<1)
#define rid (id<<1|1) void build(int l = ,int r = n-,int id = )
{
if(l == r) { tr[id].Min = a[l]; return; }//tr[rt].lazy }
int mid = (l+r)>>, lc = lid, rc = rid;
build(l,mid,lc);
build(mid+,r,rc);
tr[id].Min = min(tr[lc].Min,tr[rc].Min);
} int ql,qr;
ll val; #define Modify(id,v) tr[id].lazy += v; tr[id].Min += v;
void updata(int l = ,int r = n-,int id = )
{
if(ql<=l&&r<=qr) { Modify(id,val) return; }
int mid = (l+r)>>, lc = lid, rc = rid;
if(tr[id].lazy){
ll &t = tr[id].lazy;
Modify(lc,t)
Modify(rc,t)
t = ;
}
if(ql<=mid){
updata(l,mid,lc);
}
if(qr>mid) {
updata(mid+,r,rc);
}
tr[id].Min = min(tr[lc].Min,tr[rc].Min);
} const ll INF = 0x3f3f3f3f3f3f3f3f; ll query(int l = ,int r = n-,int id = )
{
if(ql<=l&&r<=qr){
return tr[id].Min;
}
int mid = (l+r)>>,lc = lid, rc = rid;
if(tr[id].lazy){
ll &t = tr[id].lazy;
Modify(lc,t);
Modify(rc,t);
t = ;
}
ll ret = INF;
if(ql<=mid){
ret = min(ret,query(l,mid,lc));
}
if(qr>mid){
ret = min(ret,query(mid+,r,rc));
}
return ret;
} bool sscan_l(int &x,char *&s)
{
while(!isdigit(*s) && *s != '-'){
if(!*s) return false;
s++;
}
bool fg;
if(*s == '-') fg = true,x = ;
else x = *s-'',fg = false; while(s++,isdigit(*s)) x = x*+*s-'';
if(fg) x = -x;
return true;
} char Line[];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i = ; i < n; i++) scanf("%d",a+i);
build();
int m; scanf("%d\n",&m);
while(m--){
gets(Line);
char *p = Line;
int num[], i;
for(i = ; i < ; i++ ){
if(!sscan_l(num[i],p)) break;
}
if(i == ){
int l = num[],r = num[];
if(l<=r) {
ql = l; qr = r;
printf("%I64d\n",query());
}else {
ql = ; qr = r;
ll ans = query();
ql = l; qr = n-;
ans = min(ans,query());
printf("%I64d\n",ans);
}
}else {
int l = num[], r = num[]; val = num[];
if(l<=r){
ql = l; qr = r;
updata();
}else {
ql = ; qr = r;
updata();
ql = l; qr = n-;
updata();
}
}
}
return ;
}

CodeForces 52C Circular RMQ (线段树)的更多相关文章

  1. [CodeForces 52C]Circular RMQ

    题目传送门 评分:省选/NOI-,难度:普及+/提高 这题真的和RMQ没有半点关系,只需要一个裸的线段树,连pushdown都不需要,只需要两种操作:区间修改和区间求最小值,在回溯时加上标记即可,唯一 ...

  2. CodeForces 52C Circular RMQ(间隔周期段树,间隔更新,间隔总和)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are g ...

  3. NBU 2475 Survivors(RMQ线段树)

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

  4. Buses and People CodeForces 160E 三维偏序+线段树

    Buses and People CodeForces 160E 三维偏序+线段树 题意 给定 N 个三元组 (a,b,c),现有 M 个询问,每个询问给定一个三元组 (a',b',c'),求满足 a ...

  5. CodeForces 877E DFS序+线段树

    CodeForces 877E DFS序+线段树 题意 就是树上有n个点,然后每个点都有一盏灯,给出初始的状态,1表示亮,0表示不亮,然后有两种操作,第一种是get x,表示你需要输出x的子树和x本身 ...

  6. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  7. [Codeforces 1199D]Welfare State(线段树)

    [Codeforces 1199D]Welfare State(线段树) 题面 给出一个长度为n的序列,有q次操作,操作有2种 1.单点修改,把\(a_x\)修改成y 2.区间修改,把序列中值< ...

  8. [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)

    [Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...

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

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

随机推荐

  1. 远程抓取win7 的用户登录时间

    protected void Page_Load(object sender, EventArgs e) { InvokeSystemPS("query user /server:192.1 ...

  2. 一、初识mybatis

    orm框架 1.配置文件(配置别名.mapper xml文件.数据库连接.事务) 2.创建SqlSessionFactory,创建SqlSession 3.创建model,创建Mapper xml文件 ...

  3. SQL将一个表中的某一列值全部插入到另一个表中

    1.  SQL将一个表中的某一列值全部插入到另一个表中 插入的话: insert into a(col) select col from b; 更新的话: update a set col=selec ...

  4. 自定义Swap

    网上看到的一篇文章加深了对指针的了解,收藏一下 自定义的swap函数是一个老掉牙的问题,而这个问题对于理解指针和内存中的栈是很有帮助的 一般自定swap函数是这样的: 1.swap函数的功能是实现两个 ...

  5. C#中的结构体要使用new来实例化吗?

    声明结构的默认(无参数)构造函数是错误的.总是提供默认构造函数以将结构成员初始化为它们的默认值.在结构中初始化实例字段也是错误的. 如果使用 new 运算符创建结构对象,则会创建该结构对象,并调用适当 ...

  6. python 模拟事件触发机制

    EventManager.py # -*- encoding: UTF-8 -*- # 系统模块 from queue import Queue, Empty from threading impor ...

  7. codevs1245 最小的N个和

    1245 最小的N个和 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求这N^2 个和中最小的 N个.

  8. javascript的程序控制结构及语句------(2)循环控制语句、跳转语句、对话框

    一.循环控制语句 循环语句主要就是在满足条件的情况下反复执行某一个操作,循环控制语句主要包括while语句.do...while语句 和for语句. 1.While语句 语法: While(条件表达式 ...

  9. 截取HTML中的JSON数据并利用GSON进行解析(Android)

    截取HTML中的JSON数据并利用GSON进行解析(Android) 前言 最近在做的一个Android项目,需要自行搭建服务器,队友选择买了阿里云的服务器ESC产品,在数据获取上,我们采用了Andr ...

  10. 剑指Offer的学习笔记(C#篇)-- 数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...