求助,10分
查看原帖
求助,10分
477118
Noby_Gld楼主2022/1/22 16:53

代码如下

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct hhh{
	ll le,ri,c;
}dl[320010];
struct ggg{
	ll l,r,h;
}q[40010];
ll n,p[80010];
ll ans;
bool cmp(ggg a,ggg b){
	return a.h<b.h;
}
ll find(ll l,ll r,ll x){
	while(l<=r){
		int mid=(l+r)>>1;
		if(p[mid]==x) return mid;
		else if(p[mid]>x) r=mid-1;
		else l=mid+1;
	}
	return 0;
}
void build(ll bh,ll l,ll r){
	dl[bh].le=l,dl[bh].ri=r;
	if(l==r-1) return;
	int mid=(l+r)>>1;
	build(bh*2,l,mid);
	build(bh*2+1,mid,r);
}
void add(ll bh,ll l,ll r,ll x){
	if(dl[bh].le>r||dl[bh].ri<l) return;
	if(dl[bh].le>=l&&dl[bh].ri<=r){
		dl[bh].c=x;
		return;
	}
	int mid=(dl[bh].le+dl[bh].ri)>>1;
	if(dl[bh].c){
		dl[bh*2].c=x;
		dl[bh*2+1].c=x;
		dl[bh].c=0;
	}
	if(mid>=r) add(bh*2,l,r,x);
    else if(mid<=l) add(bh*2+1,l,r,x);
    else{
        add(bh*2,l,r,x);
        add(bh*2+1,l,r,x);
    } 
}
void ask(ll bh){
	if(dl[bh].c){
		ans+=(p[dl[bh].ri]-p[dl[bh].le])*dl[bh].c;
		return;
	}
	if(dl[bh].le==dl[bh].ri-1) return;
	ask(bh*2);
	ask(bh*2+1);
}
int main(){
	//freopen("e.in","r",stdin);
	//freopen("e.out","w",stdout);
	cin>>n;
	int tot=0;
	for(int i=1;i<=n;i++){
		cin>>q[i].l>>q[i].r>>q[i].h;
		p[++tot]=q[i].l,p[++tot]=q[i].r;
	}
	sort(q+1,q+n+1,cmp);
	sort(p+1,p+2*n+1);
	build(1,1,2*n);
	for(int i=1;i<=n;i++){
		int ql=find(1,2*n,q[i].l),qr=find(1,2*n,q[i].r);
		add(1,ql,qr,q[i].h);
	}
	ask(1);
	cout<<ans;
	return 0;
}
2022/1/22 16:53
加载中...