线段树#6 #8 WA 求调
查看原帖
线段树#6 #8 WA 求调
1398636
yezhengjie0000001楼主2025/8/3 19:53
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;
struct node{
	ll a,s;
}h[100010];
struct Max{
	ll ord,val;
};
struct Tree{
	ll lazy;
	ll mx,l,r,ord;
}b[400010];
Max st[100010];
void build(int l,int r,int rot){
	if(l==r){
		b[rot].l=l;
		b[rot].r=r;
		b[rot].mx=h[l].a; 
		b[rot].lazy=-1;
		b[rot].ord=l;
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,rot*2);
	build(mid+1,r,rot*2+1);
	if(b[rot*2].mx<b[rot*2+1].mx){
		b[rot].ord=b[rot*2+1].ord;
	}else{
		b[rot].ord=b[rot*2].ord;
	}
	b[rot].mx=max(b[rot*2].mx,b[rot*2+1].mx);
	b[rot].l=b[rot*2].l;
	b[rot].r=b[rot*2+1].r;
	b[rot].lazy=-1;
	return ;
}
void down(int rot){
	if(b[rot].lazy!=-1){
		b[rot*2].mx=b[rot].lazy;
		b[rot*2].ord=b[rot*2].l;
		b[rot*2].lazy=b[rot].lazy;
		b[rot*2+1].lazy=b[rot].lazy;
		b[rot*2+1].ord=b[rot*2+1].l;
		b[rot*2+1].mx=b[rot].lazy;
		b[rot].lazy=-1;
	}
	return ;
}
void update(int l,int r,int rot,int x,int y,int k){
	if(l>y||r<x){
		return ;
	}
	if(x<=l&&r<=y){
		b[rot].lazy=k;
		b[rot].ord=l;
		b[rot].mx=k;
		return ;
	}
	int mid=(l+r)>>1;
	down(rot);
	if(x<=mid) update(l,mid,rot*2,x,y,k);
	if(y>mid) update(mid+1,r,rot*2+1,x,y,k); 
	b[rot].mx=max(b[rot*2].mx,b[rot*2+1].mx);
	if(b[rot*2].mx<b[rot*2+1].mx){
		b[rot].ord=b[rot*2+1].ord;
	}else{
		b[rot].ord=b[rot*2].ord;
	}
}
Max query(int l,int r,int rot,int x,int y){
	if(l>r){
		return {0,-1};
	}
	if(l>y||r<x){
		return {0,-1};
	}
	if(x<=l&&r<=y){
		return {b[rot].ord,b[rot].mx};
	}
	int mid=(l+r)>>1;
	down(rot);
	ll mx,mxx;
	Max t1=query(l,mid,rot*2,x,y),t2=query(mid+1,r,rot*2+1,x,y);
	mx=max(t1.val,t2.val);
	if(t1.val<t2.val){
		mxx=t2.ord;
	}else{
		mxx=t1.ord;
	}
	return {mxx,mx};
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i].s;
	}
	for(int i=1;i<=n;i++){
		cin>>h[i].a; 
	}
	for(int i=n;i>0;i--){
		st[i].val=max(h[i].s+h[i].a,st[i+1].val);
		if(h[i].s+h[i].a<st[i+1].val){
			st[i].ord=st[i+1].ord;
		}else{
			st[i].ord=i;
		}
	}
	build(1,n,1);
	int mm=0;
	ll ans=0;
	st[n+1]={0,-114514114514};
	for(int i=1;i<=n;i++){
		Max t1=query(1,n,1,1,mm-1),t2=st[mm+1];
		if(t1.val>2*(t2.val-h[t2.ord].a-h[mm].s)+h[t2.ord].a){
			update(1,n,1,t1.ord,t1.ord,0);
			ans+=h[t1.ord].a;
			cout<<ans<<'\n';
		}else{
			update(1,n,1,t2.ord,t2.ord,0);
			ans+=2*(t2.val-h[t2.ord].a-h[mm].s)+h[t2.ord].a;
			mm=t2.ord;
			cout<<ans<<'\n';
		}
	}
	return 0;
}
2025/8/3 19:53
加载中...