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 ...
随机推荐
- 并发编程-TPL
并发编程-TPL 本节导航 基本概念 并发编程 TPL 线程基础 windows为什么要支持线程 线程开销 CPU的发展 使用线程的理由 如何写一个简单Parallel.For循环 数据并行 Para ...
- 【BZOJ4720】【NOIP2016】换教室
我当年真是naive…… 原题: 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节 课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节 ...
- Java中的权限学习笔记
1.Java中的权限有两个层次,一个是类这一层,另一个是类成员那一层. 类这一层: public class可以在本包内被访问,也可以在包外被访问.而没有被public修饰的class只能在本包内被调 ...
- MySQL Binlog和Relaylog生成和清理
=====================================================================================binlog文件生成:在每条二 ...
- 05基于python玩转人工智能最火框架之TensorFlow基础知识
从helloworld开始 mkdir mooc # 新建一个mooc文件夹 cd mooc mkdir 1.helloworld # 新建一个helloworld文件夹 cd 1.helloworl ...
- easyUI的datagrid每行数据添加操作按钮的方法
今天做项目的时候,想在easyui的datagrid每一列数据后边都加上一个操作按钮,一开始想在后台拼接字符串用JSON传回,但是我测试之后发现这个方法不管用,在网上搜索了一下,整理如下: 其实要加一 ...
- node api 之:Error
Node.js 中运行的应用程序一般会遇到以下四类错误: 标准的 JavaScript 错误: <EvalError> : 当调用 eval() 失败时抛出. <SyntaxErro ...
- navicat外键设置
https://blog.csdn.net/qq_32486599/article/details/73497810
- cvsnt报错:Administrator: Switch to user failed due to configuration error. Contact your System Administrator
在安装CVSNT一开始用Administrator登录时总是报[login aborted]Switch to user failed due to configuration error. Cont ...
- dojo Datagrid 实现数据删除功能
DataGrid实现数据动态刷新功能见前一个帖子:http://www.cnblogs.com/qq552048250/p/4447103.html 实现数据删除只需要向表格中动态添加按钮,并为按钮的 ...