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. Android studio 开发中 用git实现批量忽略特定文件的方法

    git实现批量忽略特定文件的方法 在用AndroidStudio开发项目的时候,3个人协同开发,那么用Git同步代码,会将模块中的大量iml文件同步,每次都会提交和更新,一个一个的去忽略他们,显然是最 ...

  2. CentOS下MySQL无法正常启动错误

    一.非正常关机/退出MySQL时报错:/var/lib/mysql/mysql.sock 1.重启机器:shutdown -h now 2.删除或重命名:rm -r /var/lib/mysql/my ...

  3. solr索引

    solr索引 当我们真正进入到Lucene源代码之中的时候,我们会发现: • Lucene的索引过程,就是按照全文检索的基本过程,将倒排表写成此文件格式的过程. • Lucene的搜索过程,就是按照此 ...

  4. Python偏函数实例

    目标: 1.编写一个gui,生成按钮 2.通过偏函数,生成按钮 3.通过装饰器,实现按钮输出信息功能 1.使用Tkinter,创建一个按钮 代码如下: handetiandeMacBook-Pro:~ ...

  5. js 截取字符串

    转:http://blog.csdn.net/dotnet25/article/details/8331959 字符串:var s = "1,2,3,4,5," 目标:删除最后一个 ...

  6. WP独立文件资源字典

    有时候,开发者想把资源字典定义在单独的XAML文件中,在网上找了找,没找到比较详细的,自己弄了许久. 1. 新建xaml资源字典文件,如在根目录下“ResourceDictionary1.xaml”, ...

  7. 二十六个月Android学习工作总结

    1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来. 3.要有自己的知识库,可以是 ...

  8. 题目:[NOIP1999]拦截导弹(最长非递增子序列DP) O(n^2)和O(n*log(n))的两种做法

    题目:[NOIP1999]拦截导弹 问题编号:217 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...

  9. [SVG] Simple introduce for SVG

    Just like create html page, you can create a svg tag by: <?xml version="1.0" encoding=& ...

  10. 数据库系统原理及其应用总结---ShinePans

    第一章  数据库概论 1.在数据库管理技术的发展过程中.数据库独立性最高的是"数据库系统"阶段 2.三大经典的数据结构模型是"关系.层次和网状模型" 3.单个用 ...