论文题。

考虑到这题的维护和区间操作是反向的,也就是说无法像V那题快速的合并标记。

我们知道,一个区间的最小值和其他值是可以分开来维护的,因为如果一个区间被整体覆盖,那么最小值始终是最小值。

对于被覆盖一半的区间,讨论一下即可。

对于每个最小值和次小值记录前缀最小值,当前/历史最小值,当到达合法区间的时候:

如果区间最小值>x,直接退出。

如果minv[o]<x<semn[o],那么更新当前的次小值

反之继续向下。

#include<bits/stdc++.h>
const int inf=2e9+;
const int N=;
using namespace std;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int n,m;
struct Segment_Tree_Beats{
#define lson (o<<1)
#define rson (o<<1|1)
int his[N<<],pra[N<<],prb[N<<],a[N<<],b[N<<],minv[N<<],semn[N<<];
inline void pushup(int o){
if(minv[lson]==minv[rson])minv[o]=minv[lson],semn[o]=min(semn[lson],semn[rson]);
else if(minv[lson]<minv[rson]){minv[o]=minv[lson];semn[o]=min(semn[lson],minv[rson]);}
else{minv[o]=minv[rson];semn[o]=min(semn[rson],minv[lson]);}
his[o]=min(his[lson],his[rson]);
}
inline void puttag(int o,int v){
his[o]=min(his[o],minv[o]+v);
a[o]+=v;b[o]+=v;minv[o]+=v;semn[o]+=v;semn[o]=min(semn[o],inf);
pra[o]=min(pra[o],a[o]);
prb[o]=min(prb[o],b[o]);
}
inline void plus(int o,int ax,int pa,int bx,int pb){
his[o]=min(his[o],minv[o]+pa);
pra[o]=min(pra[o],pa+a[o]);
prb[o]=min(prb[o],pb+b[o]);
a[o]+=ax;b[o]+=bx;minv[o]+=ax;semn[o]+=bx;semn[o]=min(semn[o],inf);
}
inline void pushdown(int o){
int mmmm=min(minv[lson],minv[rson]);
if(minv[lson]==mmmm)plus(lson,a[o],pra[o],b[o],prb[o]);else plus(lson,b[o],prb[o],b[o],prb[o]);
if(minv[rson]==mmmm)plus(rson,a[o],pra[o],b[o],prb[o]);else plus(rson,b[o],prb[o],b[o],prb[o]);
a[o]=b[o]=pra[o]=prb[o]=;
}
inline void build(int o,int l,int r){
if(l==r){
minv[o]=read();his[o]=minv[o];semn[o]=inf;
return;
}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
}
inline void optadd(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){puttag(o,v);return;}
int mid=(l+r)>>;pushdown(o);
if(ql<=mid)optadd(lson,l,mid,ql,qr,v);
if(qr>mid)optadd(rson,mid+,r,ql,qr,v);
pushup(o);
}
inline void dfs(int o,int l,int r,int v){
if(minv[o]>=v)return;
if(semn[o]>v){
v-=minv[o];his[o]=min(his[o],minv[o]+v);
pra[o]=min(pra[o],a[o]+v);
a[o]+=v;minv[o]+=v;return;
}
int mid=(l+r)>>;pushdown(o);
dfs(lson,l,mid,v);dfs(rson,mid+,r,v);
pushup(o);
}
inline void change(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){dfs(o,l,r,v);return;}
int mid=(l+r)>>;pushdown(o);
if(ql<=mid)change(lson,l,mid,ql,qr,v);
if(qr>mid)change(rson,mid+,r,ql,qr,v);
pushup(o);
}
inline int querynow(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return minv[o];
int mid=(l+r)>>,ans=inf;pushdown(o);
if(ql<=mid)ans=min(ans,querynow(lson,l,mid,ql,qr));
if(qr>mid)ans=min(ans,querynow(rson,mid+,r,ql,qr));
return ans;
}
inline int queryhis(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return his[o];
int mid=(l+r)>>,ans=inf;pushdown(o);
if(ql<=mid)ans=min(ans,queryhis(lson,l,mid,ql,qr));
if(qr>mid)ans=min(ans,queryhis(rson,mid+,r,ql,qr));
return ans;
}
}T;
int main(){
n=read();m=read();
T.build(,,n);
while(m--){
int opt=read(),l=read(),r=read();
if(opt==){int x=read();T.optadd(,,n,l,r,x);}
if(opt==){int x=read();T.change(,,n,l,r,x);}
if(opt==)printf("%d\n",T.querynow(,,n,l,r));
if(opt==)printf("%d\n",T.queryhis(,,n,l,r));
}
}

【UOJ#169】元旦老人与数列的更多相关文章

  1. 2018.07.28 uoj#169. 【UR #11】元旦老人与数列(线段树)

    传送门 线段树好题. 维护区间加,区间取最大值,维护区间最小值,历史区间最小值. 同样先考虑不用维护历史区间最小值的情况,这个可以参考这道题的解法,维护区间最小和次小值可以解决前两个操作,然后使用历史 ...

  2. uoj169:元旦老人与数列

    题意:http://uoj.ac/problem/169 sol  :线段树..........蜜汁TLE了一个点,不管了..... 代码抄snowMyDream的,orz........... 线段 ...

  3. 网路流 uoj 168 元旦老人与丛林

    http://uoj.ac/problem/168 没想到是网络流 官方题解地址 http://jiry-2.blog.uoj.ac/blog/1115 subtask2告诉我们度数为012的点对答案 ...

  4. UOJ169. 【UR #11】元旦老人与数列

    传送门 考虑用 \(segment~tree~beats\) 那一套理论,维护区间最小值 \(mn\) 和严格次小值 \(se\) 那么可以直接 \(mlog^2n\) 维护前三个操作 考虑维护历史最 ...

  5. [UOJ #167]【UR #11】元旦老人与汉诺塔

    题目大意:给你一个有$n$个盘子的汉诺塔状态$S$,问有多少种不同的操作方法,使得可以在$m$步以内到达状态$T$.$n,m\leqslant100$ 题解:首先可以知道的是,一个状态最多可以转移到其 ...

  6. UOJ 52 元旦激光炮

    http://uoj.ac/problem/52 题意:每次可以得到3个序列中 思路:每次分别取出三个序列的K/3长度的位置,取最小的那个,然后每次减掉它,总复杂度是Nlog3N #include & ...

  7. UR11 A.元旦老人与汉诺塔

    题目:http://uoj.ac/contest/23/problem/167 如果我们拿个map来存状态的话.设当前状态是v,下一个状态是s.有f[i+1][s]+=f[i][v]. 初始f[0][ ...

  8. uoj167 元旦老人与汉诺塔(记忆化搜索)

    QwQ太懒了,题目直接复制uoj的了 QwQ这个题可以说是十分玄学的一道题了 首先可以暴搜,就是\(dfs\)然后模拟每个过程是哪个柱子向哪个柱子移动 不多解释了,不过实现起来还是有一点点难度的 直接 ...

  9. 2018.07.29~30 uoj#170. Picks loves segment tree VIII(线段树)

    传送门 线段树好题. 维护区间取两种最值,区间加,求区间两种历史最值,区间最小值. 自己的写法调了一个晚上+一个上午+一个下午+一个晚上并没有调出来,90" role="prese ...

随机推荐

  1. openstack之horizon部署

    登录官网 www.openstack.org 查看安装文档 https://docs.openstack.org/newton/install-guide-rdo/horizon.html 第一步yu ...

  2. 转:DP和HDP

    Dirichlet Process and Hierarchical Dirichlet Process 原文:http://hi.baidu.com/zentopus/item/46a622f5ef ...

  3. Elasticsearch 插件head和kibana

    本次安装在win7下,linux操作差不多. Elasticsearch的版本是6.5.1 一.前置条件 1.安装nodejs,如果已经安装了,检查一下版本,最好大于6以上,不然后面会失败,官网上已经 ...

  4. Shell编程学习总结

    Shell编程总结 一.Hello World 新建文件test.sh 然后编辑代码: #!bin/bash/ echo “hello world !” cd 到目标目录下: chmod +x ./t ...

  5. java 实验四

    北京电子科技学院(BESTI) 实  验  报  告 课程: Java        班级:1352          姓名:黄卫         学号:201352221 成绩:           ...

  6. JavaScript非阻塞加载脚本

    As more and more sites evolve into “Web 2.0″ apps, the amount of JavaScript increases. This is a per ...

  7. C++之内部类与外部类(嵌套类)及友元

    转载于:http://www.cnblogs.com/qzhforthelife/p/3226885.html 先上代码: class Outer { public: Outer(){m_outerI ...

  8. zigbee ------ JN5169低功耗设置

    低功耗睡眠设置Power Manager (PWRM) PWRM_vInit() 如果进入睡眠模式,设置芯片进入何种睡眠模式 PWRM_eScheduleActivity()设置进入睡眠多长时间(时钟 ...

  9. sql 建表以及查询---复杂查询之成绩排名

    废话不说,直接建表 1.表Player USE T4st -- 设置当前数据库为T4st,以便访问sysobjects IF EXISTS(SELECT * FROM sysobjects WHERE ...

  10. [设计篇]01.RESTFUL URI 简单入门设计

    1. HTTP Methods HTTP 常用方法: GET: 获取某个资源. POST: 创建一个新的资源. PUT: 替换某个已有的资源. PATCH: 修改某个已有的资源.-->这个自己没 ...