社区讨论
求助线段树 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 条回复,欢迎继续交流。
正在加载回复...