bzoj5050: 建造摩天楼
Description
Input
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: 建造摩天楼的更多相关文章
- 【bzoj5050】【bzoj九月月赛H】建造摩天楼
讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...
- 学会了 C 语言真的可以开发出很多东西吗?
马里奥碰到花朵就变身. 什么是马里奥?一个装着 16 × 32 个小色块的长方形,其中一些色块填着颜色,另一些没有.什么是花?一个 16 × 16 的正方形.什么是「变身」?把马里奥这个方块里面代表衣 ...
- H5坦克大战之【建造敌人的坦克】
公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...
- (转)使用 SCons 轻松建造程序
在软件项目开发过程中,make 工具通常被用来建造程序.make 工具通过一个被称为 Makefile 的配置文件可以自动的检测文件之间的依赖关系,这对于建造复杂的项目非常有帮助,然而,编写 Make ...
- 使用PowerDesigner设计建造MySQL数据库
使用PowerDesigner设计建造MySQL数据库 一.使用PowerDesigner制作建库脚本 1.设计CDM(Conceptual Data Model) 2.选择 Tools -> ...
- 游戏测评-桥梁建造系Poly Bridge破力桥?游戏测评
最近在b站看到了谜之声的视频:大家来造桥吧! 实在是太搞笑了,看到是一款新出不久还未正式发行的游戏,兴致一来便入手玩了玩.顺手也就写下了这篇测评. POLY BRIDGE 对这个游戏名怎么起个有趣的中 ...
- 浅谈设计模式--建造器模式(Builder Pattern)
建造器模式,是于创建带有大量参数的对象,并避免因参数数量多而产生的一些问题(如状态不一致-JavaBean的setter模式). 如果参数多且有些是必须初始化的,有些是不一定需要初始化的时候,创建对象 ...
- 【BZOJ-2937】建造酿酒厂 前缀和 + 展环为链 + 乱搞
2937: [Poi2000]建造酿酒厂 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 70 Solved: 24[Submit][Status][D ...
- JAVA设计模式之建造模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal representation ...
随机推荐
- SFM学习记录(二)
分析生成文件 在.nvm.cmvs/00/下有:(也可能是其他数字) models/option-0000.ply:是生成的密集点云模型 txt:文件夹下(还没弄明白ν_v) visualize:保存 ...
- 云计算SPI(SaaS、PaaS、IaaS)
云计算SPI(SaaS.PaaS.IaaS) The other day, I arrived at the SAP LABS CHINA for interview with my pleasure ...
- mvc core2.1 Identity.EntityFramework Core 实例配置 (四)
https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/customize_identity_model?view=a ...
- (24)ajax上传json格式的数据
urs.py from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpat ...
- 【HDOJ1018】【大数阶乘位数】【斯特林公式】
http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big Number Time Limit: 2000/1000 MS (Java/Others) ...
- Centos6.8 搭建Tomcat服务器
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,是一个可以提供web服务同时也支持Servlet的JSP服务器. ...
- 使用JQuery提交表单的两种方式选择
有一个表单,如果使用JQuery提交的话,可以使用下面2中方式,但他们的区别却是根据实际需求需要进行选择的. 第一种:表单按照action路径提交后,页面会刷新. $("#id") ...
- 【SpringBoot】SpringBoot热部署和配置文件自动注入实战
========================3.SpringBoot热部署devtool和配置文件自动注入实战 ============================ 1.SpringBoot2 ...
- linux系统调用的三种方法
通过glibc提供的库函数 [23:02:14] gcc chmodtest.c [23:02:17] ls -l kali //记得先创建这个文件 -rwxrwxrwx. 1 root root 0 ...
- sqler sql 转rest api 2.0 试用
sqler 的迭代还是很快的,已经2.0 了,2.0 有好多新功能的添加,同时也有好多不兼容的修改 说明: 测试使用docker-compose,同时我已经push 了docker 镜像 dalong ...