QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#749867#7787. Maximum RatingpodysRE 0ms0kbC++143.5kb2024-11-15 11:03:312024-11-15 11:03:31

Judging History

你现在查看的是最新测评结果

  • [2024-11-15 11:03:31]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-11-15 11:03:31]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"
const int N=2e5+5;
int a[N];
// ll sum[N <<5];
// int ls[N <<5], rs[N <<5], ct[N << 5];
class tre{
public:
    vector<ll> sum;
    vector<int> ls,rs,ct;
    tre(){
        // sum=vector<ll>(N<<5);
        // ls=vector<int>(N<<5);
        // rs=vector<int>(N<<5);
        // ct=vector<int>(N<<5);
        sum=vector<ll>(1,0);
        ls=vector<int>(1,0);
        rs=vector<int>(1,0);
        ct=vector<int>(1,0);
    }
    // root 表示整棵线段树的根结点;cnt 表示当前结点个数
    int cnt=0, root=0;
    // 用法:update(root, 1, n, x, f); 其中 x 为待修改节点的编号
    void update(int& p, int s, int t, int x, int f,int g) {  // 引用传参
        if(cnt+2>=sum.size()){
            sum.resize(sum.size()*2,0);
            ls.resize(ls.size()*2,0);
            rs.resize(rs.size()*2,0);
            ct.resize(ct.size()*2,0);
            // cerr<<cnt<<" "<<sum.size()<<endl;
            // sum.push_back(0);
            // ls.push_back(0);
            // rs.push_back(0);
            // ct.push_back(0);
        }
        if (!p) p = ++cnt;  // 当结点为空时,创建一个新的结点
        if (s == t) {
            sum[p] += f;
            ct[p] += g;
            return;
        }
        int m = (s + t >> 1);
        if (x <= m){
            update(ls[p], s, m, x, f,g);
        }else{
            update(rs[p], m + 1, t, x, f,g);
        }
        sum[p] = sum[ls[p]] + sum[rs[p]];  // pushup
        ct[p] = ct[ls[p]] + ct[rs[p]];  // pushup
    }
    // 用法:query(root, 1, n, l, r);
    // int query(int p, int s, int t, int l, int r) {
    //     if (!p) return 0;  // 如果结点为空,返回 0
    //     if (s >= l && t <= r) return sum[p];
    //     int m = s + ((t - s) >> 1), ans = 0;
    //     if (l <= m) ans += query(ls[p], s, m, l, r);
    //     if (r > m) ans += query(rs[p], m + 1, t, l, r);
    //     return ans;
    // }
    int check(int p,int s,int t,ll &now){
        if (!p) return 0;  // 如果结点为空,返回 0
        if(now<=0) return 0;
        if(sum[p]<=now){
            now-=sum[p];
            return ct[p];
        }
        if(s==t){
            if(ct[p]==0) return 0;
            int ret=now/s;
            now-=ret*s;
            return ret;
        }
        int m = (s + t >> 1), ans = 0;
        if(now>0) ans+=check(ls[p],s,m,now);
        if(now>=m+1) ans+=check(rs[p],m+1,t,now);
        return ans;
    }
};
int get(){
    return (rand() << 15 | rand());
}
void solve(){
    tre t1;
    int n,q;
    cin>>n>>q;
    // n = 2e5,q=2e2;
    ll sum=0;
    int mx=1e9;
    int inf=2e9;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        // a[i]=get()%inf+1-mx;
        if(a[i]<=0){
            sum-=a[i];
        }else{
            t1.update(t1.root, 1, mx, a[i], a[i],1);
        }
    }
    while(q--){
        int x,v;
        cin>>x>>v;
        // x=get()%n+1;
        // v=get()%inf+1-mx;
        if(a[x]<=0){
            sum+=a[x];
        }else{
            t1.update(t1.root, 1, mx, a[x], -a[x],-1);
        }
        a[x]=v;
        if(v<=0){
            sum-=v;
        }else{
            t1.update(t1.root, 1, mx, v, v,1);
        }
        // sum=1;
        ll tmp=sum;
        cout<<t1.check(t1.root,1,mx,tmp)+1<<endl;
    }
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    // srand(time(0));
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Runtime Error

input:

3 5
1 2 3
3 4
2 -2
1 -3
3 1
2 1

output:


result: