分块求调
查看原帖
分块求调
394167
Cure_Wing楼主2024/1/18 11:20

AC×32,WA×8(05_,07_)。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using std::cin;using std::cout;
constexpr int N=200005,B=505;
int n,q,op[N],a[N],b[N],x[N],y[N],c[N<<1],base,k,d[N],e[N];
long long num[B],sum[B];
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);cout.tie(nullptr);
    cin>>n;
    for(int i=1;i<=n;++i){cin>>a[i]>>b[i];c[++k]=a[i];}
    cin>>q;
    for(int i=1;i<=q;++i){
        cin>>op[i]>>x[i];
        if(op[i]<=2) cin>>y[i];
        if(op[i]==1) c[++k]=y[i];
    }
    std::sort(c+1,c+k+1);
    k=std::unique(c+1,c+k+1)-c-1;
    base=sqrt(k);
    for(int i=1;i<=n;++i){
        int p=std::lower_bound(c+1,c+k+1,a[i])-c;
        num[(p-1)/base]+=b[i];
        sum[(p-1)/base]+=1ll*a[i]*b[i];
        e[p]+=b[i];
    }
    for(int i=1;i<=q;++i){
        // for(int j=1;j<=k;++j) cout<<c[j]<<(j==k?'\n':' ');
        // for(int j=1;j<=k;++j) cout<<e[j]<<(j==k?'\n':' ');
        if(op[i]==1){
            int p=std::lower_bound(c+1,c+k+1,a[x[i]])-c;
            num[(p-1)/base]-=b[x[i]];
            sum[(p-1)/base]-=1ll*a[x[i]]*b[x[i]];
            e[p]-=b[x[i]];a[x[i]]=y[i];
            p=std::lower_bound(c+1,c+k+1,y[i])-c;
            e[p]+=b[x[i]];
            // cout<<p<<'\n';
            num[(p-1)/base]+=b[x[i]];
            sum[(p-1)/base]+=1ll*y[i]*b[x[i]];
        }
        if(op[i]==2){
            int p=std::lower_bound(c+1,c+k+1,a[x[i]])-c;
            num[(p-1)/base]+=y[i]-b[x[i]];e[p]+=y[i]-b[x[i]];
            sum[(p-1)/base]+=1ll*a[x[i]]*y[i]-1ll*a[x[i]]*b[x[i]];
            b[x[i]]=y[i];
        }
        if(op[i]==3){
            long long val=0;
            for(int j=(k-1)/base;j>=0;--j)
                if(num[j]<x[i]){
                    // cout<<j<<' '<<x[i]<<' '<<val<<'\n';
                    x[i]-=num[j];
                    val+=sum[j];
                }else{
                    for(int l=std::min((j+1)*base,k);l>=j*base+1;--l){
                        // cout<<l<<' '<<val<<'\n';
                        if(e[l]<x[i]){
                            x[i]-=e[l];
                            val+=1ll*c[l]*e[l];
                        }else{
                            val+=1ll*c[l]*x[i];
                            x[i]=0;
                            goto print;
                        }
                    }
                }
            print:
            if(x[i]) cout<<"-1\n";
            else cout<<val<<'\n';
        }
    }
    return 0;
}
2024/1/18 11:20
加载中...