社区讨论

萌新妹子初学扫描线WA80pts求调..

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lt7aa37x
此快照首次捕获于
2024/02/29 21:51
2 年前
此快照最后确认于
2024/03/01 11:40
2 年前
查看原帖
谁能帮忙看看我错哪里了qwq
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e4+10;
int T,n,w,h,xx[maxn<<1],cnt;
struct p{
	int x,y,l,to;
}a[maxn<<1];

int cmp(p u,p v){
	if(u.y==v.y){
		return u.l>v.l;
	}
	return u.y<v.y;
}

struct tree{
	ll lazy,maxx;
}t[maxn<<2];

void pushup(int rt){
	t[rt].maxx=max(t[rt<<1].maxx,t[rt<<1|1].maxx);
}
void pushdown(int rt){
	if(t[rt].lazy!=0){
		t[rt<<1].maxx+=t[rt].lazy; t[rt<<1|1].maxx+=t[rt].lazy;
		t[rt<<1].lazy+=t[rt].lazy; t[rt<<1|1].lazy+=t[rt].lazy;
		t[rt].lazy=0;
	}
}
void update(int rt,int l,int r,int L,int R,int x){
	if(L<=l&&r<=R){
		t[rt].lazy+=x; t[rt].maxx+=x;
		return;
	}
	int mid=(l+r)>>1; pushdown(rt);
	if(L<=mid){
		update(rt<<1,l,mid,L,R,x);
	}
	if(mid<R){
		update(rt<<1|1,mid+1,r,L,R,x);
	}
	pushup(rt);
}
ll query(int rt,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		return t[rt].maxx;
	}
	int mid=(l+r)>>1; pushdown(rt); ll mx=0;
	if(L<=mid){
		mx=max(mx,query(rt<<1,l,mid,L,R));
	}
	if(mid<R){
		mx=max(mx,query(rt<<1|1,mid+1,r,L,R));
	}
	return mx;
}
int main(){
	std::ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		ll ans=0;
		cin>>n>>w>>h; 
		for(int i=1;i<=2*n;i++)a[i]={0,0,0};
		for(int i=1;i<=2*n;i++)xx[i]=0;
		for(int i=1;i<=(n<<2);i++)t[i]={0,0};
		for(int i=1;i<=2*n;i+=2){
			cin>>a[i].x>>a[i].y>>a[i].l; 
			a[i+1]=a[i]; a[i+1].y+=h-1; a[i+1].l=-a[i+1].l;
		}
		sort(a+1,a+1+2*n,cmp);
		for(int i=1;i<=2*n;i+=2){
			xx[i]=a[i].x; xx[i+1]=a[i+1].x;
		}
		sort(xx+1,xx+1+2*n); cnt=unique(xx+1,xx+1+2*n)-xx;
		for(int i=1;i<=2*n;i++){
			a[i].to=upper_bound(xx+1,xx+1+cnt,a[i].x+w-1)-xx-1;
			a[i].x=lower_bound(xx+1,xx+1+cnt,a[i].x)-xx;
		}
		for(int i=1;i<=2*n;i++){
			update(1,1,cnt,a[i].x,a[i].to,a[i].l);
			ans=max(ans,t[1].maxx);
		}
		cout<<ans<<'\n';
	}
	return 0;
}

回复

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

正在加载回复...