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. rm: cannot remove `/home/cn0000/log/formlog.20140417': Read-only file system

    [root@localhost home]# su - cn0000 rm: cannot remove `/home/cn0000/log/monitor_xmllog.20140417': Rea ...

  2. HDU 5505 - BestCoder Round #60 - GT and numbers

    题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1002 思路 : N有若 ...

  3. Raid1源代码分析--写流程

    正确写流程的总体步骤是,raid1接收上层的写bio,申请一个r1_bio结构,将其中的所有bios[]指向该bio.假设盘阵中有N块盘.然后克隆N份上层的bio结构,并分别将每个bios[]指向克隆 ...

  4. solr安装

    Windows solr(tomcat) 1.1. 安装步骤 1.1.1准备工作 1. 服务器:apache-tomcat-7.0.40压缩版,http://localhost:8080/安装是否成功 ...

  5. Fancybox——学习(1)

    转载:http://www.helloweba.com/view-blog-65.html Fancybox是一款优秀的jquery插件,它能够展示丰富的弹出层效果.前面我们有文章介绍了facybox ...

  6. (转)ObjC利用正则表达式抓取网页内容(网络爬虫)

    转自:http://www.cocoachina.com/bbs/read.php?tid=103813 *****boy]原创 2012年5月20日 在开发项目的过程,很多情况下我们需要利用互联网上 ...

  7. 认识ptrace函数

    认识ptrace函数 这是man对于ptrace这个系统调用的解释 http://man7.org/linux/man-pages/man2/ptrace.2.html #include <sy ...

  8. bui上手体验

    在最近的项目中,接触到了bui这个后台管理框架 主页地址:http://builive.com/ 主页上也有一个后台管理的Demo:http://builive.com/apps/default/ma ...

  9. [Angular 2] Using Array ...spread to enforce Pipe immutability

    Pipes need a new reference or else they will not update their output. In this lesson you will use th ...

  10. magento产品eav笔记【持续跟新...】

    //magento把产品信息分在子表中,最顶上的表是catalog_product_entity,仅仅包含产品的信息(SKU) //表eav_attribute,这张表在magento里为全部不 同的 ...