社区讨论

求助线段树 AC49 WA5

AT_abc292_h[ABC292Ex] Rating Estimator参与者 21已保存回复 38

讨论操作

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

当前回复
38 条
当前快照
1 份
快照标识符
@m21v1rd9
此快照首次捕获于
2024/10/09 20:43
去年
此快照最后确认于
2025/11/05 01:43
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define lt (cur<<1)
#define rt ((cur<<1)|1)
#define mid ((L+R)>>1)
#define h(x) tr[x].h
#define ld long double
#define ll long long
using namespace std;
const int N=5e5+5;
struct node{
	ll h;
}tr[N<<2];
ll lz[N<<2],n,m,k,a[N],x,y;
bool unb(int L,int R,int l,int r){
	return r<L||R<l;
}
void sq(int cur,ll w){
	lz[cur]+=w;
	h(cur)+=w;
}
void up(int cur){
	h(cur)=max(h(lt),h(rt));
}
void down(int cur){
	 
	if(lt<=n*4) sq(lt,lz[cur]);
	if(rt<=n*4) sq(rt,lz[cur]);
	lz[cur]=0;
}
ll last(int cur,int L,int R,int x){
	if(L==R){
		return h(cur);
	}
	down(cur);
	int u=0;
	if(x<=mid) u=last(lt,L,mid,x);
	else  u=last(rt,mid+1,R,x);
	up(cur);
	return u;	
}
void add(int cur,int l,int r,int L,int R,ll w){
	if(l<=L&&R<=r){
		sq(cur,w);
	}else if(!unb(l,r,L,R)){
		down(cur);
		add(lt,l,r,L,mid,w);
		add(rt,l,r,mid+1,R,w);
		up(cur);	
	}
}
void build(int cur,int L,int R){
	if(L==R){
		tr[cur]=(node){0};
		return ;
	}
	build(lt,L,mid);
	build(rt,mid+1,R);
	up(cur);
} 
int ef(int cur,int L,int R){
	if(L==R){
		return L;
	}
	down(cur);
	int u=0;
	if(h(lt)>=0) u=ef(lt,L,mid); 
	else u=ef(rt,mid+1,R);	
	up(cur);
	return u;
}
int main(){
	cin>>n>>k>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		add(1,i,n,1,n,a[i]-k);
	}	
	for(int i=1;i<=m;i++){
		cin>>x>>y;
		add(1,x,n,1,n,y-a[x]);
		a[x]=y;
		if(h(1)>=0){
			int op=ef(1,1,n);
			ld ans=last(1,1,n,op)*(ld)(1.0)/op+k;
      	  	printf("%.15Lf\n",ans);
		}
		else{
			ld ans=(last(1,1,n,n))*(ld)(1.0)/n+k;
      		printf("%.15Lf\n",ans);
		}
	}
	return 0;
}
/*
5 6 7
5 1 9 3 8
4 9
2 10
1 0
3 0
3 30
5 100
1 100
*/

回复

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

正在加载回复...