问题描述
在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。
从横截面图来看,坑底成阶梯状,由从左至右的 1…N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:
每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。
请你计算每个平面被水覆盖的时间。
输入
输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。
输出
输出每个平面被水覆盖的时间。
样例
输入(1)
3
4 2
2 7
6 4
输出(1)
4
50
26
输入(2)
3
4 2
6 4
2 7
输出(2)
4
18
50
代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct node
{
int id;
long long int width;
long long int height;
struct node *front;
struct node *back;
};
int n;
scanf("%d",&n);
long long int time[100005];
struct node *left,*right;
left=(struct node*)malloc(sizeof(struct node));
left->width=0;
left->height=100005;
struct node *start;
start=left;
struct node *ppre;
ppre=left;
struct node *p;
for(int i=1;i<=n;i++)
{
p=(struct node*)malloc(sizeof(struct node));
scanf("%lld %lld",&p->width,&p->height);
p->id=i;
p->front=ppre;
ppre->back=p;
p->back=NULL;
struct node *c1;
c1=p;
ppre=c1;
if(start->height>p->height)
{
start=p;
}
}
right=(struct node*)malloc(sizeof(struct node));
right->width=0;
right->height=100005;
right->back=NULL;
right->front=p;
p->back=right;
long long int t=0;
for(int i=1;i<n;i++)
{
time[start->id]=t+start->width;
if(start->front->height>start->back->height)
{
struct node *c1,*c2;
long long int w;
w=start->width;
c1=start->front;
c2=start->back;
t=t+(c2->height-start->height)*w;
c2->width+=w;
c1->back=c2;
c2->front=c1;
start=c2;
if((start->height<c1->height)&&(start->height<c2->height))
{
continue;
}
else
{
while(start->height>start->back->height)
{
start=start->back;
}
}
}
else
{
struct node *c1,*c2;
c1=start->front;
c2=start->back;
long long int w;
w=start->width;
t=t+(c1->height-start->height)*w;
c1->width+=w;
c1->back=c2;
c2->front=c1;
start=c1;
if((start->height<c1->height)&&(start->height<c2->height))
{
continue;
}
else
{
while(start->height>start->front->height)
{
start=start->front;
}
}
}
}
time[start->id]=t+start->width;
int x;
x=1;
int i=1;
while(x>0)
{
if(i>n)
{
break;
}
else
{
printf("%lld\n",time[i]);
i++;
}
}
return 0;
}