QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#749867 | #7787. Maximum Rating | podys | RE | 0ms | 0kb | C++14 | 3.5kb | 2024-11-15 11:03:31 | 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