坑爹啊 不断徘徊与TL与WA之间
简单的矩形覆盖
注意区间问题
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int n_max=40005;
ll h[n_max<<3];
ll hmax[n_max<<3];
ll add[n_max<<3];
ll x[n_max<<1];
struct building
{
ll l,r,h;
void init(ll tl,ll tr,ll th)
{
l=tl, r=tr, h=th;
}
}bud[n_max];
void build(int l,int r,int id)
{
h[id]=hmax[id]=add[id]=0;
if(l==r)
{
return ;
}
int m=(l+r)>>1;
build(l,m,id<<1);
build(m+1,r,id<<1|1);
}
void update(int l,int r,int id,int pl,int pr,ll H)
{
if(pl<=l&&pr>=r)
{
if(hmax[id]<=H)
{
h[id]=hmax[id]=H;
}
add[id]=max(add[id],H);
return ;
}
int m=(l+r)/2;
if(add[id])
{
update(l,m,id<<1,l,m,add[id]);
update(m+1,r,id<<1|1,m+1,r,add[id]);
add[id]=0;
}
if(m>=pl)
{
update(l,m,id<<1,pl,pr,H);
}
if(m<pr)
{
update(m+1,r,id<<1|1,pl,pr,H);
}
if(h[id<<1]==h[id<<1|1])
{
h[id]=h[id<<1];
}
else
{
h[id]=0;
}
hmax[id]=max(hmax[id<<1],hmax[id<<1|1]);
}
ll search(int l,int r,int id)
{
if(h[id])
{
return (x[r+1]-x[l])*h[id];
}
if(l==r)
{
return 0;
}
int m=(l+r)/2;
if(add[id])
{
update(l,m,id<<1,l,m,add[id]);
update(m+1,r,id<<1|1,m+1,r,add[id]);
add[id]=0;
}
return search(l,m,id<<1)+search(m+1,r,id<<1|1);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,nx=0;
ll A,B,H;
x[nx++]=0;
for(i=0;i<n;i++)
{
scanf("%lld%lld%lld",&A,&B,&H);
bud[i].init(A,B,H);
x[nx++]=A;
x[nx++]=B;
}
sort(x,x+nx);
nx=unique(x,x+nx)-x;
build(1,nx-1,1);
int pl,pr;
for(i=0;i<n;i++)
{
pl=lower_bound(x,x+nx,bud[i].l)-x;
pr=lower_bound(x,x+nx,bud[i].r)-x;
update(1,nx-1,1,pl,pr-1,bud[i].h);
}
printf("%lld\n",search(1,nx-1,1));
}
return 0;
}