悬双关
查看原帖
悬双关
1042152
songzhenghao2023楼主2025/1/23 14:48

#2 #6 WA,求助

#include <bits/stdc++.h>
#define ll long long
#define lb(x) x&(-x)
using namespace std;
const ll N=2e5,INF=1e10;
struct node{
	ll x,y,dis;
}a[N+5];
ll n,q;
ll tr[4*N+5],trr[N+5];
void add(ll x,ll y){
	for(ll i=x;i<=n;i+=lb(i)) trr[i]+=y;
	return;
}
ll get_sum(ll x){
	ll s=0;
	for(ll i=x;i;i-=lb(i)) s+=trr[i];
	return s;
}
void update(ll p){
	tr[p]=max(tr[2*p],tr[2*p+1]);
	return;
}
void change(ll p,ll l,ll r,ll x,ll y){
	if(l==r){
		tr[p]=y;
		return;
	}
	ll mid=(l+r)>>1;
	if(x<=mid) change(2*p,l,mid,x,y);
	else change(2*p+1,mid+1,r,x,y);
	update(p);
	return;
}
ll searchh(ll p,ll l,ll r,ll x,ll y){
	if(x>y) return -INF;
	if(l==x && r==y) return tr[p];
	ll s=-INF;
	ll mid=(l+r)>>1;
	if(y<=mid) s=max(s,searchh(2*p,l,mid,x,y));
	else if(x>=mid+1) s=max(s,searchh(2*p+1,mid+1,r,x,y));
	else{
		s=max(s,searchh(2*p,l,mid,x,mid));
		s=max(s,searchh(2*p+1,mid+1,r,mid+1,y));
	}
	return s;
}
ll get_dis(ll x,ll y,ll xx,ll yy){
	return abs(x-xx)+abs(y-yy);
}
void gx(ll z){
	if(z==1 || z==n) return;
	ll dis_ab=get_dis(a[z-1].x,a[z-1].y,a[z].x,a[z].y);
	ll dis_bc=get_dis(a[z].x,a[z].y,a[z+1].x,a[z+1].y);
	ll dis_ac=get_dis(a[z-1].x,a[z-1].y,a[z+1].x,a[z+1].y);
	a[z].dis=dis_ab+dis_bc-dis_ac;
	change(1,1,n,z,a[z].dis);
	return;
}
int main(){
//	freopen("P3113_2.in","r",stdin);
//	freopen("test.out","w",stdout);
	scanf("%lld%lld",&n,&q);
	for(ll i=1;i<=4*n;i++) tr[i]=-INF;
	for(ll i=1;i<=n;i++){
		scanf("%lld%lld",&a[i].x,&a[i].y);
		a[i].dis=-INF;
		if(i>=2) add(i,get_dis(a[i-1].x,a[i-1].y,a[i].x,a[i].y));
	}
	for(ll i=2;i<n;i++){
		ll dis_ab=get_dis(a[i-1].x,a[i-1].y,a[i].x,a[i].y);
		ll dis_bc=get_dis(a[i].x,a[i].y,a[i+1].x,a[i+1].y);
		ll dis_ac=get_dis(a[i-1].x,a[i-1].y,a[i+1].x,a[i+1].y);
		a[i].dis=dis_ab+dis_bc-dis_ac;
		change(1,1,n,i,a[i].dis);
	}
	while(q--){
		char op;
		cin>>op;		
		if(op=='Q'){
			ll x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",get_sum(y)-get_sum(x)-searchh(1,1,n,x+1,y-1));
		}
		else if(op=='U'){
			ll x,y,z;
			scanf("%lld%lld%lld",&z,&x,&y);
			if(z>=2){
				add(z,get_dis(a[z-1].x,a[z-1].y,x,y)-get_dis(a[z-1].x,a[z-1].y,a[z].x,a[z].y));
				if(z<n) add(z+1,get_dis(a[z+1].x,a[z+1].y,x,y)-get_dis(a[z+1].x,a[z+1].y,a[z].x,a[z].y));
			}			
			a[z].x=x,a[z].y=y;
			gx(z),gx(z-1),gx(z+1);
		}
	}
	return 0;
} 

2025/1/23 14:48
加载中...