讲个笑话,这个题很休闲的。

大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题。

后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改。

大概就是一个不断拔高,最后拔得跟区间最大值一样高的过程。

后来开始想做法,感觉是不是可以维护一下最小的深度差,然后这个以内直接加,超过了就重构?

感觉似乎有点道理,写写写

自己想又感觉这个不太靠谱,可能会重构上天,然后就删了。

(flag++)

然后问了栋老师,栋老师一眼星际(跟我下午一样),然后忙着写集训队作业去了。

(天下神犇都神的相似,傻逼各有各的傻法)

后来问了lxl,挂张图:

他说的似乎有点道理,然而我没太弄懂他想表达什么

于是GG看其他题目去了。。。。。。

后来看了题解……

mdzz这不是我下午想的那个吗……?

然后想了下这个随机期望的复杂度,不太会,问了下栋老师,大概得到的结果是这样的:

首先分类讨论。

所以重构会在常数次,因此题解的复杂度是正确的~

然后谈一下维护:

由于变化会影响左右两边,所以维护一下左右两边的最小深度,每次在线段树上收集重构节点,大力计算就好。

#include<bits/stdc++.h>
#define lson (o<<1)
#define rson (o<<1|1)
const int N=;
const int inf=;
typedef long long ll;
inline int min(int x,int y){return x<y?x:y;}
using namespace std;
int n,m,a[N],exis[N],exl[N],exr[N],cnt,q[N];
ll sumv[N<<];int addv[N<<],minl[N<<],minr[N<<],size[N<<];
const int ch_top=4e7+;
typedef long long ll;
char ch[ch_top],*now_r=ch-,*now_w=ch-;
inline int read(){
while(*++now_r<'');
register int x=*now_r-'';
while(*++now_r>='')x=x*+*now_r-'';
return x;
}
inline void write(ll x){
static char st[];static int top;
while(st[++top]=''+x%,x/=);
while(*++now_w=st[top],--top);
*++now_w='\n';
}
inline void pushup(int o){
minr[o]=min(minr[lson],minr[rson]);
minl[o]=min(minl[lson],minl[rson]);
}
inline void puttag(int o,int v){
sumv[o]+=v*size[o];addv[o]+=v;minl[o]-=v;minr[o]-=v;
}
inline void pushdown(int o){
if(!addv[o])return;
puttag(lson,addv[o]);puttag(rson,addv[o]);
addv[o]=;
}
inline void build(int o,int l,int r){
if(l==r){
sumv[o]=a[l];size[o]=exis[l];minl[o]=exl[l];minr[o]=exr[l];
return;
}
int mid=(l+r)>>;
build(lson,l,mid);build(rson,mid+,r);
pushup(o);
sumv[o]=sumv[lson]+sumv[rson];
size[o]=size[lson]+size[rson];
}
inline void recalc(int o,int l,int r,int q){
if(l==r){
if(exis[l])a[l]+=addv[o];
addv[o]=;return;
}
pushdown(o);
int mid=(l+r)>>;
if(q<=mid)recalc(lson,l,mid,q);else recalc(rson,mid+,r,q);
}
inline ll querysum(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return sumv[o];
pushdown(o);
int mid=(l+r)>>;ll ans=;
if(ql<=mid)ans+=querysum(lson,l,mid,ql,qr);
if(qr>mid)ans+=querysum(rson,mid+,r,ql,qr);
return ans;
}
inline void change(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return void(puttag(o,));
pushdown(o);int mid=(l+r)>>;
if(ql<=mid)change(lson,l,mid,ql,qr);
if(qr>mid)change(rson,mid+,r,ql,qr);
pushup(o);
sumv[o]=sumv[lson]+sumv[rson];
}
inline void recexi(int o,int l,int r,int q){
if(l==r){
size[o]=exis[l];minl[o]=exl[l];minr[o]=exr[l];
return;
}
pushdown(o);int mid=(l+r)>>;
if(q<=mid)recexi(lson,l,mid,q);else recexi(rson,mid+,r,q);
pushup(o);
size[o]=size[lson]+size[rson];
}
inline void recml(int o,int l,int r,int q,int v){
if(l==r){minl[o]=v;return;}
pushdown(o);int mid=(l+r)>>;
if(q<=mid)recml(lson,l,mid,q,v);else recml(rson,mid+,r,q,v);
minl[o]=min(minl[lson],minl[rson]);
}
inline void recmr(int o,int l,int r,int q,int v){
if(l==r){minr[o]=v;return;}
pushdown(o);int mid=(l+r)>>;
if(q<=mid)recmr(lson,l,mid,q,v);else recmr(rson,mid+,r,q,v);
minr[o]=min(minr[lson],minr[rson]);
}
inline void dfs(int o,int l,int r){
if(minl[o]>&&minr[o]>=)return;
if(l==r){
if(minl[o]<=&&q[cnt]!=l)q[++cnt]=l;
if(minr[o]<)q[++cnt]=l+;
return;
}
pushdown(o);int mid=(l+r)>>;
dfs(lson,l,mid);dfs(rson,mid+,r);
}
inline bool flag(int i){return a[i-]>a[i];}
inline int calcl(int i){return exis[i]&&!exis[i-]?a[i-]-a[i]:inf;}
inline int calcr(int i){return exis[i]&&!exis[i+]?a[i+]-a[i]:inf;}
inline void calcexl(int i){if(i<||i>n)return;recml(,,n+,i,calcl(i));}
inline void calcexr(int i){if(i<||i>n)return;recmr(,,n+,i,calcr(i));}
inline void get(int i){if(i<||i>n)return;recalc(,,n+,i);}
inline void qwq(int i){
if(i<||i>n)return;get(i);get(i-);get(i+);exis[i]=flag(i);exl[i]=calcl(i);exr[i]=calcr(i);
recexi(,,n+,i);calcexl(i+);calcexr(i-);
}
int main(){
fread(ch,,ch_top,stdin);
n=read();m=read();
a[]=exl[]=exr[]=inf;a[n+]=exl[n+]=exr[n+]=inf;
for(int i=;i<=n;i++)a[i]=read(),exis[i]=flag(i);
for(int i=;i<=n;i++)exl[i]=calcl(i),exr[i]=calcr(i);
build(,,n+);
while(m--){
int opt=read(),x=read(),y=read();
if(opt==){
cnt=;change(,,n+,x,y);dfs(,,n+);
for(int i=;i<=cnt;i++)qwq(q[i]);
qwq(x);qwq(y+);
}
else{
write(querysum(,,n+,x,y));
}
}
fwrite(ch,,now_w-ch,stdout);
}

【bzoj5050】【bzoj九月月赛H】建造摩天楼的更多相关文章

  1. bzoj5050: 建造摩天楼

    Description 属于小Q管辖的n座摩天楼从左往右排成一排,编号依次为1到n,第i座摩天楼的高度为h_i.小Q会进行m次以下两种 操作之一: 2 l r,询问h_l+h_{l+1}+...+h_ ...

  2. bzoj 1600 &amp; Usaco 月赛 2008 建造栅栏 题解

    [原题] 1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 785  Solved: 443 [Subm ...

  3. BZOJ 4070:[APIO2015]雅加达的摩天楼 最短路

    4070: [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 164[Submit][Sta ...

  4. BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )

    QAQ我没读过书...四边形都不会判定了 简单的dp.... --------------------------------------------------------------------- ...

  5. BZOJ 1600: [Usaco2008 Oct]建造栅栏

    1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Description 勤奋的Farmer John想要建造一个四面的 ...

  6. 洛谷九月月赛II

    题解:模拟 一旦不匹配就要break #include<iostream> #include<cstdio> #include<cstring> #include& ...

  7. bzoj 4070 [Apio2015]雅加达的摩天楼 Dijkstra+建图

    [Apio2015]雅加达的摩天楼 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 644  Solved: 238[Submit][Status][D ...

  8. BZOJ 4070 [Apio2015]雅加达的摩天楼 ——分块 SPFA

    挺有趣的分块的题目. 直接暴力建边SPFA貌似是$O(nm)$的. 然后考虑分块,$\sqrt n$一下用虚拟节点辅助连边, 以上的直接暴力连边即可. 然后卡卡时间,卡卡空间. 终于在UOJ上T掉辣. ...

  9. BZOJ 1600 [Usaco2008 Oct]建造栅栏:dp【前缀和优化】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1600 题意: 给你一个长度为n的木板,让你把这个木板切割成四段(长度为整数),并且要求这四 ...

随机推荐

  1. 【bzoj3064】Tyvj 1518 CPU监控 线段树维护历史最值

    题目描述 给你一个序列,支持4种操作:1.查询区间最大值:2.查询区间历史最大值:3.区间加:4.区间赋值. 输入 第一行一个正整数T,表示Bob需要监视CPU的总时间. 然后第二行给出T个数表示在你 ...

  2. 多线程---handlerthread

    当我们需要工作线程来操作的时候,很多时候会有同步问题,UI更新问题. Handle机制就是为了解决这个问题而产生的. android允许每个线程都有自己的消息队列,同时也可以是主线程消息队列. 但是很 ...

  3. python 序列化 pickle shelve json configparser

    1. 什么是序列化 我们把变量从内存中变成可存储或传输的过程称之为序列化. 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上. 反过来,把变量内容从序列化的对象重新读到内存里称 ...

  4. Probability|Given UVA - 11181(条件概率)

    题目大意:n个人去购物,要求只有r个人买东西.给你n个人每个人买东西的概率,然后要你求出这n个人中有r个人购物并且其中一个人是ni的概率pi. 类似于5个人中 抽出三个人  其中甲是这三个人中的一个的 ...

  5. 【BZOJ2460】元素(贪心,线性基)

    [BZOJ2460]元素(贪心,线性基) 题面 BZOJ Description 相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔 法矿石炼制法杖的技术.那时人们就认识到 ...

  6. [学习笔记]Min-25筛

    %%yyb %%zsy 一. 基本操作:筛1~N中的素数个数.n=1e9 设F(M,j)表示,2~M的所有数中,满足以下条件之一的数的个数:①x是质数②x最小质因子大于(注意是大于没有等号)$P_j$ ...

  7. 【CF601C】Kleofáš and the n-thlon

    Portal -->CF601C Description 大概是说\(m\)个人参加\(n\)场比赛,每场一人有一个排名,每场没有两个人排名相同,一个人最后的得分是\(n\)场比赛的排名相加,现 ...

  8. 【乱搞】【CF1095E】 Almost Regular Bracket Sequence

    Description 给定一个长度为 \(n\) 的小括号序列,求有多少个位置满足将这个位置的括号方向反过来后使得新序列是一个合法的括号序列.即在任意一个位置前缀左括号的个数不少于前缀右括号的个数, ...

  9. jsp 的 3 个编译指令

    JSP 的编译指令是通知 JSP 引擎的消息,它不直接生成输出. 常见的编译指令有如下三个: 1.page:该指令是针对当前页面的指令 2.include:用于指定包含另一个页面 3.taglib:用 ...

  10. 「电脑应用」在mac上使用aria2

    Chrome 一. 需要工具: Chrome浏览器,Aria2GUI,Chrome里BaiduExporter插件. 首先先明确一件事情,平时生活中使用的所有工具都建议到官方下载,此处用到的几样提供给 ...