Codeforces 573B Bear and Blocks
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的更多相关文章
- 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 ...
- 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 ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- Codeforces 385B Bear and Strings
题目链接:Codeforces 385B Bear and Strings 记录下每一个bear的起始位置和终止位置,然后扫一遍记录下来的结构体数组,过程中用一个变量记录上一个扫过的位置,用来去重. ...
- Codeforces 680D Bear and Tower of Cubes 贪心 DFS
链接 Codeforces 680D Bear and Tower of Cubes 题意 求一个不超过 \(m\) 的最大体积 \(X\), 每次选一个最大的 \(x\) 使得 \(x^3\) 不超 ...
- Codeforces 385C Bear and Prime Numbers(素数预处理)
Codeforces 385C Bear and Prime Numbers 其实不是多值得记录的一道题,通过快速打素数表,再做前缀和的预处理,使查询的复杂度变为O(1). 但是,我在统计数组中元素出 ...
- [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)
[Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...
- 【32.89%】【codeforces 574D】Bear and Blocks
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- 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 ...
随机推荐
- #翻译# 深入JavaScript的Unicode难题(上)
退一步说, JavaScript处理Unicode时有些怪异. 这篇文章会说明JS在Unicode上令人痛苦的部分, 然后提供解决方案, 并说明在未来的ECMAScript6中是如何改善这些问题的. ...
- DPDK2.1开发者手册3-4
环境抽象层EAL 环境抽象层的任务对访问底层资源例如硬件和内存提供入口.它提供了隐藏应用和库的特殊性性的通用接口.它的责任是初始化分配资源(内存,pci设备,定时器,控制台等等). EAL提供的典型服 ...
- 查看db2表空间使用率
select char(TABLESPACE_NAME,16) tablespace_name,decimal(PAGE_SIZE/1024,4,2) page,used_pages*100/usab ...
- SOFTWARE_INTRODUCE_01
&amp;amp;amp;lt;br data-mce-bogus="1"&amp;amp;amp;gt;&amp;amp;amp; ...
- VS2008编程软件过期的问题,过期弹出须要升级窗体的解决的方法
找到安装文件,再点autorun.exe安装文件,然后反复安装过程就会弹出须要填写系列号的地方,天上以下第一个系列号就可以. Visual Studio 2008 Professional Editi ...
- tomcat与resin的比较
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.由于有了 ...
- [Typescript] Function defination
Define a function type and params type: // The function init // Accept two params which are both typ ...
- Vim 自动文件头注释与模板定义
Vim 自动文件头注释与模板定义 在vim的配置文件.vimrc添加一些配置可以实现创建新文件时自动添加文件头注释,输入特定命令可以生成模板. 使用方法 插入模式输入模式输入seqlogic[Ente ...
- HTM5新增结构化元素&非结构化元素&新增属性详解
(1)HTML5 新增的主体结构元素 (2)HTML5 新增的的非主体结构元素 (3)HTML5 表单新增元素与属性 (4)HTML5 改良的 input 元素的种类
- zip命令的使用
zip命令可以用来将文件压缩成为常用的zip格式.unzip命令则用来解压缩zip文件. 1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip: # zip -r yasuo ...