http://codeforces.com/problemset/problem/573/B

 题目大意:

给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块。

思路:考虑第一次取得时候

h[i]=min(h[i-1],h[i]-1,h[i+1])

那么取k次的时候:

h[i]=max(0,min(h[i-j]-(k-j),h[i+j]-(k-j)))

h[i]=max(0,min(h[i-j]+j-k,h[i+j]+j-k))

k为常数,可以先暂时忽略,那就是要求h[i-j]+j和h[i+j]+j的最小值。

然后两遍左右for一下,同时给区间加一

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
struct segtree{
int l,r,mn,tag;
}t[];
int h[],n,l[],r[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void pushdown(int k,int l,int r){
if (l==r||t[k].tag==){
return;
}
t[k*].tag+=t[k].tag;
t[k*].mn+=t[k].tag;
t[k*+].tag+=t[k].tag;
t[k*+].mn+=t[k].tag;
t[k].tag=;
}
void updata(int k,int l,int r){
if (l==r) return;
t[k].mn=std::min(t[k*].mn,t[k*+].mn);
}
void build(int k,int l,int r){
t[k].mn=;
t[k].tag=;
if (l==r){
t[k].mn=h[l];
return;
}
int mid=(l+r)>>;
build(k*,l,mid);
build(k*+,mid+,r);
updata(k,l,r);
}
void add(int k,int l,int r,int x,int y){
pushdown(k,l,r);
if (l==x&&r==y){
t[k].mn++;
t[k].tag++;
pushdown(k,l,r);
return;
}
int mid=(l+r)>>;
if (y<=mid) add(k*,l,mid,x,y);
else
if (x>mid) add(k*+,mid+,r,x,y);
else add(k*,l,mid,x,mid),add(k*+,mid+,r,mid+,y);
updata(k,l,r);
}
int query(int k,int l,int r,int x,int y){
pushdown(k,l,r);
if (l==x&&r==y) return t[k].mn;
int mid=(l+r)>>;
if (y<=mid) return query(k*,l,mid,x,y);
else
if (x>mid) return query(k*+,mid+,r,x,y);
else return std::min(query(k*,l,mid,x,mid),query(k*+,mid+,r,mid+,y));
}
int main(){
n=read();
for (int i=;i<=n;i++) h[i]=read();
h[]=h[n+]=;
build(,,n+);
for (int i=;i<=n;i++){
add(,,n+,,i-);
l[i]=query(,,n+,,i);
}
build(,,n+);
for (int i=n;i>=;i--){
add(,,n+,i+,n+);
r[i]=query(,,n+,i,n+);
}
int ans=;
for (int i=;i<=n;i++)
ans=std::max(ans,std::min(l[i],r[i]));
printf("%d\n",ans);
return ;
}

换种思路:我们的每一个竖列,要嘛在旁边两列消掉以后,一次性消掉,或者是一个一个地消

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
int n,vis[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
int main(){
n=read();
for (int i=;i<=n;i++) vis[i]=read();
vis[]=;
for (int i=;i<=n;i++) vis[i]=std::min(vis[i],vis[i-]+);
vis[n]=;
for (int i=n-;i>=;i--) vis[i]=std::min(vis[i],vis[i+]+);
int ans=;
for (int i=;i<=n;i++) ans=std::max(ans,vis[i]);
printf("%d\n",ans);
return ;
}

Codeforces 573B Bear and Blocks的更多相关文章

  1. CodeForces 574D Bear and Blocks

    Limak is a little bear who loves to play. Today he is playing by destroying block towers. He built n ...

  2. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) B. Bear and Blocks 水题

    B. Bear and Blocks Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/573/pr ...

  3. Codeforces 385C Bear and Prime Numbers

    题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...

  4. Codeforces 385B Bear and Strings

    题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...

  5. Codeforces 680D Bear and Tower of Cubes 贪心 DFS

    链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...

  6. Codeforces 385C Bear and Prime Numbers(素数预处理)

    Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...

  7. [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)

    [Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...

  8. 【32.89%】【codeforces 574D】Bear and Blocks

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Codeforces Round #318 (Div. 2) D Bear and Blocks (数学)

    不难发现在一次操作以后,hi=min(hi-1,hi-1,hi+1),迭代这个式子得到k次操作以后hi=min(hi-j-(k-j),hi-k,hi+j-(k-j)),j = 1,2,3... 当k ...

随机推荐

  1. 【HDOJ】1406 Ferry Loading III

    模拟,注意需要比较队头与当前时间的大小关系. #include <cstdio> #include <cstring> #include <cstdlib> #de ...

  2. oschina服务器软件

    服务器软件 74Apache模块 54Nginx扩展模块 13Radius相关 94PaaS 系统 29服务发现/注册和协调 17Docker 扩展 7Docker 映像 83应用服务器 189HTT ...

  3. HDU_2044——蜜蜂走蜂房,递推

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示.   Input 输入数据的 ...

  4. Bonobos | IT桔子

    Trumaker | IT桔子 Trumaker trumaker.com

  5. 【转】在ASP.NET MVC中,使用Bundle来打包压缩js和css

    在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原 ...

  6. PHP发送POST请求的三种方式

    class Request{ public static function post($url, $post_data = '', $timeout = 5){//curl $ch = curl_in ...

  7. (转)最近研究xcodebuild批量打包的一些心得

    以前的时候只知道做安卓开发的兄弟挺辛苦的,不但开发的时候要适配一堆的机型,好不容易开发完了还要打一堆不同的包给不同的市场.没想到现在这些市场都开辟iOS市场,于是需要打一堆的包给不同的市场,面对暂时给 ...

  8. 计算机网络VLAN学习

    首先要搞明白VLAN的由来,为什么会产生这样一种技术.这得从计算机网络的数据交换说起,最开始,我们的网络处于蛮荒时代,数据是怎么交换的,就是简单的介质共享,大家都接到一条线路上,然后互相发数据,这个必 ...

  9. Redis环境搭建(Linux)

    1.简介       redis是一个开源的key-value数据库.它又经常被认为是一个数据结构服务器.因为它的value不仅包括基本的string类型还有 list,set ,sorted set ...

  10. php增删改查,自己写的demo

    1.链接数据库通用方法:conn.php <?php //第一步:链接数据库 $conn=@mysql_connect("localhost:3306","root ...