悬双关,基础二维线段树
  • 板块灌水区
  • 楼主Resss
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/26 19:53
  • 上次更新2024/12/27 12:40:07
查看原帖
悬双关,基础二维线段树
1042152
Resss楼主2024/12/26 19:53

题目

悬双关,十分钟内到账

#include <iostream>
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
const ll N=2e2,M=1e3,INF=1e10;
struct tree{
	ll trr[4*M+5];
	void changetrr(ll p,ll l,ll r,ll x,ll y,ll z){
		if(x<=l && r<=y){			
			trr[p]=z;
			return;
		}
		ll mid=(l+r)>>1;
		if(y<=mid) changetrr(2*p,l,mid,x,y,z);
		else if(mid+1<=x) changetrr(2*p+1,mid+1,r,x,y,z);
		else{
			changetrr(2*p,l,mid,x,mid,z);
			changetrr(2*p+1,mid+1,r,mid+1,y,z);
		}
		trr[p]=max(trr[2*p],trr[2*p+1]);
		return;
	}
	ll searchtrr(ll p,ll l,ll r,ll x,ll y){
		if(l==x && r==y) return trr[p];
		ll s=-INF,mid=(l+r)>>1;
		if(y<=mid) s=max(s,searchtrr(2*p,l,mid,x,y));
		else if(mid+1<=x) s=max(s,searchtrr(2*p+1,mid+1,r,x,y));
		else{
			s=max(s,searchtrr(2*p,l,mid,x,mid));
			s=max(s,searchtrr(2*p+1,mid+1,r,mid+1,y));	
		}
		return s;
	}
}tr[4*N+5];
void changetr(ll p,ll l,ll r,ll x,ll y,ll z){
	tr[p].changetrr(1,0,M,y,y,z);
	if(l==x && r==x) return;
	ll mid=(l+r)>>1;
	if(x<=mid) changetr(2*p,l,mid,x,y,z);
	else changetr(2*p+1,mid+1,r,x,y,z);
	return;
}
ll searchtr(ll p,ll l,ll r,ll x,ll xx,ll y,ll yy){
	if(l==x && r==xx) return tr[p].searchtrr(1,0,M,y,yy);
	ll s=-INF,mid=(l+r)>>1;
	if(xx<=mid) s=max(s,searchtr(2*p,l,mid,x,xx,y,yy));
	else if(mid+1<=x) s=max(s,searchtr(2*p+1,mid+1,r,x,xx,y,yy));
	else{
		s=max(s,searchtr(2*p,l,mid,x,mid,y,yy));
		s=max(s,searchtr(2*p+1,mid+1,r,mid+1,xx,y,yy));	
	}
	return s;
}
ll m;
int main(){
	while(scanf("%lld",&m)){
		if(m==0) return 0;
		for(ll i=1;i<=4*N;i++){
			for(ll j=1;j<=4*M;j++) tr[i].trr[j]=-INF;
		}
		while(m--){
			char c;
			ll h,hh;
			double a,l,aa;
			cin>>c;
			if(c=='I'){
				scanf("%lld%lf%lf",&h,&a,&l);
				a*=10,l*=10;
				changetr(1,1,N,h,(ll)a,(ll)l);
			}
			else if(c=='Q'){
				scanf("%lld%lld%lf%lf",&h,&hh,&a,&aa); 
				a*=10,aa*=10;
				if(h>hh) swap(h,hh);
				if(a>aa) swap(a,aa);
				ll ans=searchtr(1,1,N,h,hh,(ll)a,(ll)aa);
				if(ans==-INF) printf("-1\n");
				else printf("%lld.%lld\n",ans/10,ans%10);
			}
		}				
	}
	return 0;
}

诶呀呀,你看我这都调不出来呀~~

2024/12/26 19:53
加载中...