Description

属于小Q管辖的n座摩天楼从左往右排成一排,编号依次为1到n,第i座摩天楼的高度为h_i。小Q会进行m次以下两种
操作之一:
2 l r,询问h_l+h_{l+1}+...+h_r。
1 l r,对于第l到r的每座摩天楼i,如果上次操作结束时h_i<h_{i-1},则将第i座摩天楼再往上造一层,即h_i增加1。
你可以认为h_0=正无穷。
请写一个程序回答小Q的每个询问。

Input

第一行包含两个正整数n,m(1<=n<=100000,1<=m<=min(100000,2n)),分别表示摩天楼的数量以及操作的数量。
第二行包含n个正整数h_1,h_2,...,h_n(1<=h_i<=n),表示每座楼的高度。
接下来m行,每行三个正整数op,l,r(1<=op<=2,1<=l<=r<=n),分别表示每个操作。
因为小Q觉得错乱不齐的建筑更加美观,因此你可以认为数据是完全随机的。

Output

对于每个询问输出一行一个整数,即区间内所有摩天楼的高度之和。

可以发现对随机数据$h_i-h_{i-1}<0$的变化次数是O(n)的,因此可以用线段树维护操作,注意特判区间端点。维护区间内h的和,再记一些信息表示再操作几次$h_i-h_{i-1}<0$会出现变化,当出现变化时暴力修改。时间复杂度O(nlogn)。

#include<bits/stdc++.h>
typedef long long i64;
const int N=1e5+,inf=1e8;
char ib[N*],*ip=ib;
int _(){
int x=;
while(*ip<)++ip;
while(*ip>)x=x*+*ip++-;
return x;
}
int n,m,h[N],d[N],_l,_r;
i64 _s;
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}
struct node;
node*at(int x);
struct node{
node*lc,*rc;
int L,R,M,a,sz,v1,v2,v3,cd,dd;
i64 s;
void add(int x){
a+=x;
s+=sz*i64(x);
v1+=x,v2-=x;
if(!M)v3+=dd*x;
}
void dn(){
if(a)lc->add(a),rc->add(a),a=;
}
void set(int x,int y){
sz=d[L];
v1=(x<&&y==)?x:-inf;
v2=(x>=&&y==-)?x:inf;
v3=x;
dd=y;
}
void init(){
s=h[L];
set(h[L]-h[L-],d[L]-d[L-]);
}
void up(){
s=lc->s+rc->s;
sz=lc->sz+rc->sz;
v1=max(lc->v1,rc->v1);
v2=min(lc->v2,rc->v2);
cd=lc->cd||rc->cd;
}
void addl(){
if(M)dn(),(_l<=M?lc:rc)->addl(),up();
else{
cd=(!++v3);
++s,++v1,++v2;
}
}
void addr(){
if(M)dn(),(_r<=M?lc:rc)->addr(),up();
else{
cd=(!v3--);
--v1,--v2;
}
}
void add(){
if(_l<=L&&R<=_r)return add();
dn();
if(_l<=M)lc->add();
if(_r>M)rc->add();
up();
}
void sum(){
if(_l<=L&&R<=_r)return void(_s+=s);
dn();
if(_l<=M)lc->sum();
if(_r>M)rc->sum();
}
bool ir(){
return v1>=||v2<||cd;
}
void chk2(){
if(M)dn(),(_l<=M?lc:rc)->chk2(),up();
else{
if(ir()){
_l=L+;
d[L]^=;
cd=;
}else _l=n+;
set(v3,d[L]-d[L-]);
}
}
void chk(){
if(M)dn(),(lc->ir()?lc:rc)->chk(),up();
else{
_l=L+;
d[L]^=;
cd=;
set(v3,d[L]-d[L-]);
}
}
}ns[N*],*np=ns,*rt;
node*at(int x){
node*w=rt;
while(w->M){
w->dn();
w=x<=w->M?w->lc:w->rc;
}
return w;
}
node*build(int L,int R){
node*w=np++;
w->L=L,w->R=R;
if(L<R){
int M=w->M=(L+R)>>;
w->lc=build(L,M);
w->rc=build(M+,R);
w->up();
}else w->init();
return w;
}
int main(){
fread(ib,,sizeof(ib),stdin);
n=_(),m=_();
h[]=inf;
for(int i=;i<=n;++i)h[i]=_(),d[i]=h[i]<h[i-];
rt=build(,n);
for(int o;m;--m){
o=_(),_l=_(),_r=_();
if(o==){
if(d[_l])rt->addl();
if(_r<n&&d[_r])++_r,rt->addr(),--_r;
if(++_l<=_r)rt->add();
while(rt->ir())for(rt->chk();_l<=n;rt->chk2()); }else{
_s=;
rt->sum();
printf("%lld\n",_s);
}
}
return ;
}

bzoj5050: 建造摩天楼的更多相关文章

  1. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  2. 学会了 C 语言真的可以开发出很多东西吗?

    马里奥碰到花朵就变身. 什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有.什么是花?一个 16 × 16 的正方形.什么是「变身」?把马里奥这个方块里面代表衣 ...

  3. H5坦克大战之【建造敌人的坦克】

      公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...

  4. (转)使用 SCons 轻松建造程序

    在软件项目开发过程中,make 工具通常被用来建造程序.make 工具通过一个被称为 Makefile 的配置文件可以自动的检测文件之间的依赖关系,这对于建造复杂的项目非常有帮助,然而,编写 Make ...

  5. 使用PowerDesigner设计建造MySQL数据库

    使用PowerDesigner设计建造MySQL数据库 一.使用PowerDesigner制作建库脚本 1.设计CDM(Conceptual Data Model) 2.选择 Tools -> ...

  6. 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评

    最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...

  7. 浅谈设计模式--建造器模式(Builder Pattern)

    建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...

  8. 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞

    2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 70  Solved: 24[Submit][Status][D ...

  9. JAVA设计模式之建造模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...

随机推荐

  1. MergeKLists

    public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0) return null; Priori ...

  2. python------Json与pickle数据序列化

    一.json序列化 xml在被json取代,不同平台之间的语言转换,只能处理简单的.复杂的用pickle: pickle只能在python中用,而在Java中json也可以被识别. info = { ...

  3. 【shell编程】之基础知识-流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  4. SpringCloud学习

    1.SpringCloud的参考博客1 首先主要遇到的问题就是1.写好项目然后放到tomcat或者其他的容器中,然后稍微一点修改就要整个项目重新发布,非常麻烦,这就是微服务出现的契机了 基础知识 PS ...

  5. AI 学习

    极简状态机: /* 脚本名称: 脚本作者: 建立时间: 脚本功能: 版本号: */ using UnityEngine; using System.Collections; namespace Voi ...

  6. ArrayList集合方法

  7. quartz.net实现集群部署的笔记

    一..表信息 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron Trigger,包括Cron表达式和 ...

  8. Java之SimpleDateFormat日期格式转换(Date 和 String 类型之间的转换)

    SimpleDateFormat : 可以选择任何用户定义的日期-时间格式的模式    "yyyy-MM-dd HH:mm:ss:SSS"1.格式化:Date -->Stri ...

  9. How tbb proxy works

  10. 預約申領往來港澳通行證及簽注x

    http://www.ctshk.com/passport/talent_bookrep.htm 換領往來港澳通行證和申請簽注延期須知 為方便持<往來港澳通行證>以內地逗留簽注在香港工作. ...