题意:http://uoj.ac/problem/169

sol  :线段树..........蜜汁TLE了一个点,不管了.....

   代码抄snowMyDream的,orz...........

   线段树需要维护以下奇奇怪怪的一堆东西......

     区间最小值及其lazy标记

     区间严格次小值及其lazy标记

     最小值、严格次小值lazy标记的前缀和,历史最小值

   dalao的博客说了一堆势能之类的东西我也没看懂.......我是看代码才明白的QAQ

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 2147483647
using namespace std;
const int Mx=;
int n,m,root,a[Mx],l[Mx],r[Mx];
int tot,lson[Mx],rson[Mx],val[Mx],lazy[Mx],sum[Mx],Mnhis[Mx];
int Val[Mx],Lazy[Mx],Sum[Mx];//次小值 inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=x*+ch-''; ch=getchar(); }
return x*f;
} void pushup(int x)
{
int L=lson[x],R=rson[x];
Mnhis[x]=min(Mnhis[L],Mnhis[R]);
val[x]=min(val[L],val[R]);
if(val[L]!=val[R])
Val[x]=min(max(val[L],val[R]),min(Val[L],Val[R]));
else
Val[x]=min(Val[L],Val[R]);
} void build(int &x,int L,int R)
{
x=++tot,l[x]=L,r[x]=R;
if(L==R)
val[x]=a[L],Val[x]=inf,Mnhis[x]=val[x];
else
{
int mid=(L+R)/;
build(lson[x],L,mid);
build(rson[x],mid+,R);
pushup(x);
}
} void Push(int x,int i,bool flag)
{
int la=lazy[i],La=Lazy[i],su=sum[i],Su=Sum[i];
if(!flag) la=La,su=Su;
Mnhis[x]=min(Mnhis[x],val[x]+su);
val[x]+=la; if(Val[x]!=inf) Val[x]+=La;
sum[x]=min(sum[x],lazy[x]+su),Sum[x]=min(Sum[x],Lazy[x]+Su);
lazy[x]+=la,Lazy[x]+=La;
} void pushdown(int x)
{
if(!lazy[x]&&!Lazy[x]&&sum[x]>=&&Sum[x]>=) return ;
int L=lson[x],R=rson[x];
if(val[L]==val[R]) Push(L,x,),Push(R,x,);
if(val[L]<val[R]) Push(L,x,),Push(R,x,);
if(val[L]>val[R]) Push(L,x,),Push(R,x,);
lazy[x]=Lazy[x]=sum[x]=Sum[x]=;
} void Add(int x,int ll,int rr,int c)
{
int L=l[x],R=r[x];
if(L>rr||R<ll) return ;
if(ll<=L&&rr>=R)
{
val[x]+=c; if(Val[x]!=inf) Val[x]+=c;
lazy[x]+=c,Lazy[x]+=c;
sum[x]=min(sum[x],lazy[x]),Sum[x]=min(Sum[x],Lazy[x]);
Mnhis[x]=min(Mnhis[x],val[x]);
}
else
{
pushdown(x);
Add(lson[x],ll,rr,c);
Add(rson[x],ll,rr,c);
pushup(x);
}
} void Max(int x,int ll,int rr,int c)
{
int L=l[x],R=r[x];
if(L>rr||R<ll) return ;
if(ll<=L&&rr>=R&&Val[x]>c)
{
if(val[x]<c)
{
lazy[x]+=c-val[x];
val[x]=c;
}
}
else
{
pushdown(x);
Max(lson[x],ll,rr,c);
Max(rson[x],ll,rr,c);
pushup(x);
}
} int Query(int x,int ll,int rr,bool flag)
{
int L=l[x],R=r[x];
if(L>rr||R<ll) return inf;
if(ll<=L&&rr>=R)
{
if(flag) return Mnhis[x];
else return val[x];
}
else
{
pushdown(x);
int ans=min(Query(lson[x],ll,rr,flag),Query(rson[x],ll,rr,flag));
pushup(x);
return ans;
}
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) a[i]=read();;
build(root,,n);
for(int i=,num,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&num,&x,&y);
if(num==) z=read(),Add(root,x,y,z);
if(num==) z=read(),Max(root,x,y,z);
if(num==) printf("%d\n",Query(root,x,y,));
if(num==) printf("%d\n",Query(root,x,y,));
}
return ;
}

uoj169:元旦老人与数列的更多相关文章

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

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

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

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

  3. 【UOJ#169】元旦老人与数列

    论文题. 考虑到这题的维护和区间操作是反向的,也就是说无法像V那题快速的合并标记. 我们知道,一个区间的最小值和其他值是可以分开来维护的,因为如果一个区间被整体覆盖,那么最小值始终是最小值. 对于被覆 ...

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

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

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

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

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

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

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

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

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

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

  9. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. 基于LNMP环境的ssh2扩展

    openssl: 加密算法集合,C语言实现 libssh2:ssh2协议库库,C语言实现 PECL/ssh2: libssh2的php扩展,允许php程序调用libssh2中的函数 依赖关系:PECL ...

  2. python -- configparse读取配置文件

    在开发过程中,有的时候需要将一些参数写入到配置文件中,这样在改动一些相关信息时,可以直接在配置文件中进行修改. 而在python中,可以通过内置模块configparse对标准的配置文件进行读取. 配 ...

  3. python爬虫:利用正则表达式爬取豆瓣读书首页的book

    1.问题描述: 爬取豆瓣读书首页的图书的名称.链接.作者.出版日期,并将爬取的数据存储到Excel表格Douban_I.xlsx中 2.思路分析: 发送请求--获取数据--解析数据--存储数据 1.目 ...

  4. PAT (Basic Level) Practice 1006 换个格式输出整数

    个人练习 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(&lt10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为 ...

  5. C语言进阶—— 接续符和转义符13

    接续符的意义: C语言中的接续符 (\) 是指示编译器行为的利器 我们来看一个案例: #in\ clud\ e <st\ dio.h> in\ t m\ ain(\ ) { pri\ nt ...

  6. rpm、yum命令

    一.rpm命令 挂载光盘文件到/media目录: 进去/media目录下的Packages目录: 查看系统已安装的所有rpm包: 查看系统是否安装dhcp软件包: 安装dhcp软件包: 查看dhcp软 ...

  7. 基于itchat定制聊天机器人

    #coding=utf8import requestsimport itchat #key自己到图灵注册一个 KEY = '************************************** ...

  8. Apache服务配置

    Apache 1.安装Apache服务 第1步:把光盘设备中的系统镜像挂载到/media/cdrom目录. [root@zhangjh ~]# mkdir -p /media/cdrom/ [root ...

  9. mysql in和exists性能比较和使用【转】

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  10. ansible-1

    ansible与salt对比: 相同: 都是为了同时在多台机器上执行相同的命令 都是python开发 不同: agent(saltstack需要安装.ansible不需要) 配置(salt配置麻烦,a ...