#37 RE求调
查看原帖
#37 RE求调
926212
std_qwq楼主2024/3/25 17:46

#37 RE

报错代码:Runtime Error.Exit code is -1073741819 Program exited with code 5.

#include<bits/stdc++.h>
#define ls u<<1
#define rs u<<1|1
using namespace std;
typedef long long ll;
const int N=100010;
struct Tree{
    int l,r;
    ll v,t;
}tr[N<<3];
ll v[N<<1],a[N];
void pushup(int u){
    tr[u].v=tr[ls].v+tr[rs].v;
    tr[u].t=tr[ls].t+tr[rs].t;
}
void build(int u,int l,int r){
    tr[u].l=l,tr[u].r=r,tr[u].t=tr[u].v=0;
    if(l==r)return;
    int M=l+r>>1;
    build(ls,l,M),build(rs,M+1,r);
    pushup(u);
}
void modify(int u,int x,int k){
    if(tr[u].l==x&&tr[u].r==x){
        tr[u].v+=(ll)v[x]*k;
        tr[u].t+=k;
        return;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(x>mid)modify(rs,x,k);
    else modify(ls,x,k);
    pushup(u);
}
typedef pair<ll,ll> PII;
#define PX first
#define PY second
ll query(int u,int l,int r,int &cnt){
    if(tr[u].l>=l&&tr[u].r<=r){
        cnt+=tr[u].t;
        return tr[u].v;
    }
    int mid=tr[u].l+tr[u].r>>1;
    if(l>mid)return query(rs,l,r,cnt);
    if(r<=mid)return query(ls,l,r,cnt);
    ll lr=query(ls,l,r,cnt);
    ll rr=query(rs,l,r,cnt);
    return lr+rr;
}
struct Query{
    int op;ll x,v;
}Q[N];
int n,q;
int m;
//对所有出现的水银体积做离散化建立SGT,维护离散化数组v的区间和(实际上需要前缀和)
//首先原a数组是要统计一次
//对每个op (1,p,x)需要实时修改a数组,先把修改前的a[p]在SGT对应位置减少一个(-v[find(a[p]]))
//在新的值对应位置加一次
//对op(2,v),二分
int main(){
    cin>>n>>q;
    //build(1,1,n);
    for(int i=1;i<=n;i++){cin>>a[i];v[i]=a[i];}
    m=n;
    for(int i=1;i<=q;i++){
        cin>>Q[i].op;
        if(Q[i].op==1){
            cin>>Q[i].x>>Q[i].v;
            v[++m]=Q[i].v;
        }
        else{
            Q[i].x=0;
            cin>>Q[i].v;
        }
    }
    sort(v+1,v+1+m);
    int LEN=unique(v+1,v+1+m)-v-1;
    m=LEN;
    build(1,1,m);
    for(int i=1;i<=n;i++){
        int loc=lower_bound(v+1,v+1+m,a[i])-v;
        modify(1,loc,1);
    }
    for(int i=1;i<=q;i++){
    
        int op=Q[i].op;ll val=Q[i].v,x=Q[i].x;
        if(op==1){
            int loc1=lower_bound(v+1,v+1+m,a[x])-v;
            int loc2=lower_bound(v+1,v+1+m,val)-v;
            modify(1,loc1,-1);
            a[x]=val;
            modify(1,loc2,1);
        }
        else{
            double L=0,R=1e15,mid;
            while(R-L>1e-5){
                mid=(L+R)/2;
                int loc=lower_bound(v+1,v+1+m,ceil(mid))-v;
                int cnt=0;
                ll S=query(1,1,loc-1,cnt);
                if(S+val>cnt*mid) L=mid;
                else R=mid;
            }
            printf("%.5lf\n",mid);
        }
    }
}
2024/3/25 17:46
加载中...