题意: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 ;
}

最新文章

  1. ArchLinux安装指南
  2. RESTful API 设计指南【转】
  3. NopCommerce中的单例
  4. poj2406 KMP
  5. [大牛翻译系列]Hadoop(22)附录D.2 复制连接框架
  6. SqlServer2008误操作数据(delete或者update)后恢复数据
  7. javascript基础之自执行函数
  8. laravel artisan 命令工具
  9. beego: 获取request参数
  10. HDU 6348 序列计数 (树状数组 + DP)
  11. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
  12. [转] ES6展开运算符
  13. 完全背包记录路径poj1787 好题
  14. python_条件语句
  15. linux修改文件读写执行权限命令chmod
  16. Python函数相关
  17. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)
  18. node -- hapi 学习
  19. 从Runoob的Django教程学到的
  20. 转:Redis和Memcache的区别分析

热门文章

  1. springMVC-数据绑定
  2. dom技术解析xml下jaxp解析器详细代码
  3. Spark Streaming 交互 Kafka的两种方式
  4. B1076 Wifi密码 (15分)
  5. 13-在Core Mvc中使用Options
  6. 可以字符串string转化成list,tuple,dict的eval()方法
  7. 17,saltstack高效运维
  8. luogu4196 [CQOI2006]凸多边形 半平面交
  9. web开发学习之路是否有尽头
  10. unity3d中C#与JS的一些区别