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 ...
随机推荐
- LibCurl编程手册以及代码实例
1. LibCurl编程流程 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcu ...
- linux串口驱动分析——发送数据
一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...
- HDU_2056——相交矩形的面积
Problem Description Given two rectangles and the coordinates of two points on the diagonals of each ...
- PHP中数组转换为XML格式
最近公司要做一个API接口,输出格式要有JSON与XML格式, 在PHP中,输入JSON直接json_encode就可以,但输出XML没有提供函数,于是决定自己写一个. <?php /** * ...
- 组播MAC地址转换关系及唯一性处理
组播地址与其对应的组播MAC换算关系如下: 组播MAC=组播MAC标识+组播IP后23位对应的二进制位(32位的IP地址取后23位导致32组IP地址对应的多播IP相同) (IANA把01:00:5 ...
- mysql中的unique
distinct可以把重复的行去掉,查询时候用select distinct * from ...; unique在MySQL中是完整性约束里的一种,如果某列的值需要是唯一的那么就添加UNIQUE约束 ...
- Spring + mybatis整合方案总结 结合实例应用
Spring + mybatis整合实例应用 项目结构图 (Spring3.0.2 +mybatis3.0.4) 方案一: 通过配置文件整合Spring和mybatis 应用数据库 -- --数据库 ...
- boost::pool与内存池技术
建议看这个链接的内容:http://cpp.winxgui.com/cn:mempool-example-boost-pool Pool分配是一种分配内存方法,用于快速分配同样大小的内存块, ...
- java设计模式---原型模式
原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式结构图 通俗来说:原型模式就是深拷贝和浅拷贝的实现. 浅拷贝 只实现了值拷贝,对于引用对象还是 ...
- XShell连接 Linux系统,显示中文乱码
摘要: Linux系统,中文显示乱码 XShell是一个强大的安全终端模拟软件,它支持SSH1, SSH2及 Microsoft Windows平台的Telnet NetSarang Xshell 4 ...