P1502 0ptsC++求调
  • 板块学术版
  • 楼主Ian_NIE
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/1 11:10
  • 上次更新2025/8/1 16:30:25
查看原帖
P1502 0ptsC++求调
602171
Ian_NIE楼主2025/8/1 11:10

https://www.luogu.com.cn/record/228134918

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
#define lc (x<<1)
#define rc (x<<1|1)
using namespace std;

const int MAXN=1e4+5;
int t,n,w,h,ans,y[MAXN<<1],tr[MAXN<<3],f[MAXN<<3];
struct xy{
	int x1,y1,x2,y2,h;
}a[MAXN];
struct node{
	int x,l,r,v;
	bool operator<(const node& b)const{
		if(x!=b.x)return x<b.x;
		return v>b.v;
	}
}s[MAXN<<1];

void recover(int x,int l,int r){
	tr[x]=tr[lc]+tr[rc];
}
void update(int x,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){
		f[x]+=k;
		if(f[x])tr[x]=y[r]-y[l];
		else if(l+1==r)tr[x]=0;
		else recover(x,l,r);
		return;
	}
	int mid=l+r>>1;
	if(ql<mid)update(lc,l,mid,ql,qr,k);
	if(qr>mid)update(rc,mid,r,ql,qr,k);
	if(!f[x])recover(x,l,r);
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>t;
	while(t--){
		memset(s,0,sizeof s); 
		memset(tr,0,sizeof tr);
		memset(f,0,sizeof f);
		cin>>n>>w>>h;
		for(int i=1;i<=n;i++){
			cin>>a[i].x1>>a[i].y1>>a[i].h;
			a[i].x2=a[i].x1+w-1;
			a[i].y2=a[i].y1+h-1;
			y[i]=a[i].y1,y[n+i]=a[i].y2;
		}
		sort(y+1,y+2*n+1);
		int sz=unique(y+1,y+2*n+1)-y-1;
		for(int i=1;i<=n;i++){
			s[i].x=a[i].x1;
			s[i].l=lower_bound(y+1,y+sz+1,a[i].y1)-y;
			s[i].r=lower_bound(y+1,y+sz+1,a[i].y2)-y;
			s[i].v=a[i].h;
			s[n+i]=node{a[i].x2,s[i].l,s[i].r,-a[i].h};
		}
		sort(s+1,s+2*n+1),ans=0;
		for(int i=1;i<2*n;i++){
			update(1,1,sz,s[i].l,s[i].r,s[i].v);
			ans=max(ans,tr[1]);
		}
		cout<<ans<<endl;
	}
	return 0;
} 
2025/8/1 11:10
加载中...