题目链接 https://codeforces.com/gym/102448/problem/F
The christmas spirit is taking over the city of Arcoverde! In honor of this special day, the mayor of this renowned metropolis decided to decorate all of the city's front view. To do this, he asked his engineer friends Icaro and Cortizo how much it would cost.
It is known that the mayor likes to save as much money as possible. Therefore, Icaro and Cortizo need to find out what is the minimum area necessary to comprise the entire city's front view.
Arcoverde is made only of rectangular buildings, in two dimensions, and all buildings were built on the same base height, as shown on the picture below.
Icaro and Cortizo were very tired, since they were also responsible for building the biggest christmas tree ever seen on Pernambuco, so they asked for your help.
Input
The first input line contains an integer NN(1≤N≤1051≤N≤105), indicating the number of buildings in Arcoverde. Then, NN lines follow, each one containing three integers LiLi (0≤Li<1090≤Li<109), RiRi (Li<Ri≤109Li<Ri≤109) and HiHi (1≤Hi≤1061≤Hi≤106), which are, respectively, the left X-coordinate, the right X-coordinate and the height of the ii-th building.
Output
The output consists in a single integer number, which is the minimum area required to decorate the entire front view of Arcoverde.
Example
Input
6 2 6 9 9 14 11 12 20 6 17 25 20 23 31 14 29 36 18
Output
451
题意:给你很多矩形,每个矩形都是从同一水平面出发,有不同的高和宽;可能有多个矩形有重叠部分,重叠部分取最大值;问该图形的最小面积;因为出现重叠的矩形数目不一,无法直接遍历一遍就去求面积,还是得用到线段树;
思路:当时做的时候,没时间做,现在补题补了一下午///将每个矩形的边缘l,r;放到一个数组a中对于每次更新线段树的就在访问每个矩形的时候去更新;因为直接更新a数组的话不知道这个a[i],是属于那个矩形。最后遍历一下a数组,每次求值就可以。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;
struct node
{
ll l,r,h;
}e[maxn*4];
ll deep[maxn*4];
ll a[maxn*4];
ll tree[maxn*4];
void push_up(int node)
{
tree[node]=max(tree[node*2],tree[node*2+1]);
}
void push_down(int node)
{
if(deep[node])
{
deep[node*2]=max(deep[node*2],deep[node]);
deep[node*2+1]=max(deep[node*2+1],deep[node]);
tree[node*2]=max(deep[node],tree[node*2]);
tree[node*2+1]=max(deep[node],tree[node*2+1]);
deep[node]=0;
}
}
void updata(ll node,ll l,ll r,ll x,ll y,ll d)
{
if(l>=x&&r<=y)
{
tree[node]=max(tree[node],d);
deep[node]=max(deep[node],d);
return ;
}
push_down(node);
int mid=(l+r)/2;
if(x<=mid)
{
updata(node*2,l,mid,x,y,d);
}
if(y>mid)
{
updata(node*2+1,mid+1,r,x,y,d);
}
push_up(node);
}
ll query(ll node,ll l,ll r,ll x,ll y)
{
if(l>=x&&r<=y)
{
return tree[node];
}
int mid=(l+r)/2;
ll ans=0;
push_down(node);
if(x<=mid)
{
ans=max(ans,query(node*2,l,mid,x,y));
}
if(y>mid)
{
ans=max(ans,query(node*2+1,mid+1,r,x,y));
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
int tot=0;
for(int i=1;i<=n;i++)
{
cin>>e[i].l>>e[i].r>>e[i].h;
a[++tot]=e[i].l;
a[++tot]=e[i].r;
}
sort(a+1,a+tot+1);
int cnt=unique(a+1,a+tot+1)-(a+1);
// cout<<cnt<<endl;
// for(int i=1;i<=cnt;i++)
// {
// cout<<a[i]<<" ";
// }
// cout<<endl;
for(int i=1;i<=n;i++)
{
ll l=lower_bound(a+1,a+cnt+1,e[i].l)-a;
ll r=lower_bound(a+1,a+cnt+1,e[i].r)-a;
// cout<<l<<" "<<r<<endl;
updata(1,1,cnt,l,r-1,e[i].h);
}
ll ans=0;
for(int i=1;i<cnt;i++)
{
// ll l=lower_bound(a,a+cnt,e[i].l)-a;
// ll r=lower_bound(a,a+cnt,e[i].r)-a;
// cout<<query(1,1,cnt,i,i)<<" "<<a[i]<<" "<<a[i+1]<<endl;
ans+=query(1,1,cnt,i,i)*(a[i+1]-a[i]);
}
cout<<ans<<endl;
return 0;
}
代码: