题意:向N个连续且高度不同的平台灌水,平台各有宽度,且高度各不相同。一开始,先向高度最低的平台灌水,直到灌满溢出,流向其他的平台,直至所有平台都被覆盖。已知每分钟注入高度为1且宽度为1的水,问每个平台恰好被高度为1的水覆盖的时间。

分析:

1、对于每个平台,L代表其左边的平台标号,R代表其右边的平台标号,随着平台被淹没,R,L会随之改变。

2、平台标号为1~n,其两侧平台0和n-1高度初始化为正无穷作为界线,因此只需统计淹没了n个平台的情况即可。

3、Find_lowest();---得到最低的平台标号。

4、update_lowest(cur);---淹没当前平台后,cur更新为水流溢出后,即将流向的平台标号。

5、将当前平台的水注满到与两侧较矮平台齐平的高度,将较矮的平台宽度更新为加上当前平台后的宽度,与此同时,更新当前平台两侧的平台的左右平台标号。

#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 1e9 + 7;
const double pi = acos(-1.0);
const int MAXN = 1e5 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int N;
struct Node{
int L, R;
LL w, h, ans;
void read(){
scanf("%lld%lld", &w, &h);
}
}num[MAXN];
int Find_lowest(){
LL mi = LL_INF, cur = 0;
for(int i = 1; i <= N; ++i){
if(num[i].h < mi){
mi = num[i].h;
cur = i;
}
}
return cur;
}
int update_lowest(int cur){
while(1){
int l = num[cur].L, r = num[cur].R;
if(num[l].h < num[cur].h) cur = l;
else if(num[r].h < num[cur].h) cur = r;
else return cur;
}
}
void solve(int cur){
int cnt = 0;
LL sum = 0;
while(cnt < N){
sum += num[cur].w;//将水注满到刚好覆盖该平台
num[cur].ans = sum;
++cnt;
int l = num[cur].L, r = num[cur].R;
sum += (Min(num[l].h, num[r].h) - num[cur].h - 1) * num[cur].w;//将当前平台的水注满到与两侧较矮平台齐平的高度
num[l].R = r;//更新两侧平台的左右平台
num[r].L = l;
if(num[l].h < num[r].h){
num[l].w += num[cur].w;
cur = l;
}
else{
num[r].w += num[cur].w;
cur = r;
}
cur = update_lowest(cur);
}
}
int main(){
scanf("%d", &N);
for(int i = 1; i <= N; ++i){
num[i].read();
}
for(int i = 0; i <= N + 1; ++i){
num[i].L = i - 1;
num[i].R = i + 1;
}
num[0].w = num[N + 1].w = 1;
num[0].h = num[N + 1].h = LL_INF;
int cur = Find_lowest();
solve(cur);
for(int i = 1; i <= N; ++i){
printf("%lld\n", num[i].ans);
}
return 0;
}

  

POJ - 3658 Artificial Lake的更多相关文章

  1. POJ 3658 Artificial Lake (单调栈)

    题意: 析:利用单调栈,维护一个单调递增的栈,首先在最低的平台开始,每次向两边进行扩展,寻找两边最低的,然后不断更新宽度. 代码如下: #pragma comment(linker, "/S ...

  2. poj-3658 Artificial Lake(模拟)

    http://poj.org/problem?id=3658 Description The oppressively hot summer days have raised the cows' cl ...

  3. POJ No.2386 Lake Counting

    题目链接:http://poj.org/problem?id=2386 分析:八联通的则为水洼,我们则需遍历一个单位附近的八个单位并将它们都改成'.',但附近单位可能仍连接着有'W'的区域,这种情况下 ...

  4. POJ 之2386 Lake Counting

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20003   Accepted: 10063 D ...

  5. 【POJ - 2386】Lake Counting (dfs+染色)

    -->Lake Counting 直接上中文了 Descriptions: 由于近日阴雨连天,约翰的农场中中积水汇聚成一个个不同的池塘,农场可以用 N x M (1 <= N <= ...

  6. POJ3658Matrix( 双重二分+负数+死循环)

    POJ 3658 Matrix 双重二分,wa了一下午,实在不太明白为啥一写二分就会进入死循环. INF要设的大一些,本题设0x3f3f3f3f会wa. 本题有负数, 二分时(l+r)/2与(l+r) ...

  7. POJ 2386 Lake Counting(深搜)

    Lake Counting Time Limit: 1000MS     Memory Limit: 65536K Total Submissions: 17917     Accepted: 906 ...

  8. DFS:Lake Counting(POJ 2386)

    好吧前几天一直没更新博客,主要是更新博客的确是要耗费一点精力 北大教你数水坑 最近更新博客可能就是一点旧的东西和一些水题,主要是最近对汇编感兴趣了嘻嘻嘻 这一题挺简单的,没什么难度,简单深搜 #inc ...

  9. poj - 2386 Lake Counting && hdoj -1241Oil Deposits (简单dfs)

    http://poj.org/problem?id=2386 http://acm.hdu.edu.cn/showproblem.php?pid=1241 求有多少个连通子图.复杂度都是O(n*m). ...

随机推荐

  1. P1068 万绿丛中一点红

    P1068 万绿丛中一点红 转跳点:

  2. POJ 3274:Gold Balanced Lineup 做了两个小时的哈希

    Gold Balanced Lineup Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13540   Accepted:  ...

  3. 在linux7(centos)中安装python3.7.2

    一般情况下linux上都默认安装了python,检查一下我的版本 没有安装python3,但是目前已经是python3了,所以为了方便,还是要在系统上安装一下比较好. 上面的命令,直接输入python ...

  4. Oracle修改密码

    1. 登陆oracle sqlplus '/as sysdba' 2. 修改密码 ALTER USER 用户名IDENTIFIED BY 要修改的密码 ; 3.解锁 alter user 用户名 ac ...

  5. C++编程学习(十二) STL

    一.简介 标准模板库STL,是一组模板类和函数.提供了: 1.容器.用于存储信息. 2.迭代器.用于访问容器中的信息. 3.算法.操作容器内容. 1.容器 STL有两种类型的容器类: (1)顺序容器 ...

  6. 004.CI4框架CodeIgniter, 配置mysql数据库,并进行数据库查询

    01.在app的Config目录的Database文件里面填写数据库配置,并把pConnect设置成true,此处为一直连接mysql数据库 02.在Models中,创建一个System目录,再在Sy ...

  7. java 立方变自身

    立方变自身 观察下面的现象,某个数字的立方,按位累加仍然等于自身. 1^3 = 1 8^3 = 512 5+1+2=8 17^3 = 4913 4+9+1+3=17 - 请你计算包括1,8,17在内, ...

  8. 关于div水平垂直居中的几种方法

    Dom结构: <div class="box"> <div class="inner"> 123 </div> </d ...

  9. 读取docx表格中的信息

    参考了 http://blog.csdn.net/qq_34475777/article/details/62055523 http://www.cnblogs.com/deepwaterplan/a ...

  10. 3.2Adding custom methods to mappers(在映射器中添加自定义方法)

    3.2Adding custom methods to mappers(在映射器中添加自定义方法) 有些情况下,我们需要实现一些MapStruct无法直接自动生成的复杂类型间映射.一种方式是复用其他已 ...