社区讨论

RE求调

P1502窗口的星星参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mj7az2zr
此快照首次捕获于
2025/12/15 23:22
3 个月前
此快照最后确认于
2025/12/15 23:23
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5;
#define int long long
#define ls p<<1
#define rs p<<1|1
int n,w,h,b[N<<1],cnt,ss,T;
map<int,int> mp;
struct node{
	int x,y,w,yy,yh;
}a[N];
bool cmp(node x,node y){
	if(x.x!=y.x) return x.x<y.x;
	if(x.y!=y.y) return x.y<y.y;
	return x.w<y.w;
}
struct tree{
	int l,r,s,ma;
}g[N<<2];
void build(int p,int l,int r){
	g[p].l=l;
	g[p].r=r;
	g[p].ma=g[p].s=0;
	if(l==r){
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
}
void spread(int p){
	if(g[p].s){
		g[ls].ma+=g[p].s;
		g[rs].ma+=g[p].s;
		g[ls].s+=g[p].s;
		g[rs].s+=g[p].s;
		g[p].s=0;
	}
}
void change(int p,int l,int r,int k){
    if(l>r) return ;
	if(l<=g[p].l&&g[p].r<=r){
		g[p].ma+=k;
		g[p].s+=k;
		return ;
	}
	spread(p);
	int mid=(g[p].l+g[p].r)>>1;
	if(l<=mid) change(ls,l,r,k);
	if(r>mid) change(rs,l,r,k);
	g[p].ma=max(g[ls].ma,g[rs].ma);
}
int ans;
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>T;
    while(T--){
    	cin>>n>>w>>h;
    	for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y>>a[i].w,b[++cnt]=a[i].y,b[++cnt]=a[i].y-h+1;
    	sort(b+1,b+cnt+1);
    	sort(a+1,a+n+1,cmp);
    	for(int i=1;i<=cnt;i++){
    		if(b[i]!=b[i-1]){
    			mp[b[i]]=++ss;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		a[i].yy=mp[a[i].y];
    		a[i].yh=mp[a[i].y-h+1];
    	}
    	build(1,1,cnt);
    	for(int i=1,j=1;i<=n;i++){
    		change(1,a[i].yh,a[i].yy,a[i].w);
    		while(a[j].x+w-1<a[i].x){
    			change(1,a[j].yh,a[j].yy,-a[j].w);
    			j++;
    		}
    		ans=max(ans,g[1].ma);
    	}
    	cout<<ans<<'\n';
        for(int i=1;i<=n;i++) mp[b[i]]=0;
    }
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...