社区讨论

ABC E求调,对0的处理有问题

学术版参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi1a2fb0
此快照首次捕获于
2025/11/16 13:31
4 个月前
此快照最后确认于
2025/11/17 09:10
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
#define ll long long
ll a[N],b[N],c[N];
int now0 = 0;
int lowbit(int x){
	return x&-x;
}
void add(ll p[],ll x,ll v){
	for(;x<=N;x+=lowbit(x)){
		p[x]+=v;
	}
}
ll query(ll p[],ll x){
	ll res = 0;
	for(;x;x-=lowbit(x)){
		res+=p[x];
	}
	return res;
}
int main(){
	int n,q;
	cin>>n>>q;
	for(int i = 1;i<=n;i++)cin>>a[i];
	for(int i = 1;i<=n;i++){
		add(b,a[i],a[i]);
		add(c,a[i],1);
	}
	for(int i = 1;i<=q;i++){
		int x;
		cin>>x;
		if(x==1){
			int u,v;
			cin>>u>>v;
			if(a[u]!=0){
				add(b,a[u],-a[u]);
				cout<<query(c,a[u])<<" ";
				add(c,a[u],-1);
				cout<<query(c,a[u])<<" ";
			}
			else now0--;
			a[u] = v;
			if(v!=0){
				add(b,a[u],a[u]);
				add(c,a[u],1);
			}
			else now0++;
			cout<<query(c,N)<<endl;
		}
		if(x==2){
			int l,r;
			cin>>l>>r;
			if(r<=l)cout<<1ll*n*l<<"\n";
			else{
				ll r1 = query(b,l);
				//cout<<1;
				ll r2 = query(b,r);
				//cout<<2;
				ll r3 = query(b,N-10);
				//cout<<3;
				ll p1 = query(c,l);
				//cout<<4;
				ll p2 = query(c,r);
				//cout<<5;
				ll p3 = query(c,N-10);
				//cout<<6;
				ll ans = 0;
				for(int i = 1;i<=n;i++)cout<<a[i]<<" ";
				cout<<endl;
				cout<<p1<<" "<<p2<<" "<<p3<<endl;
				ans+=1ll*(p3-p2)*r;
				//cout<<ans<<" ";
				ans+=1ll*p1*l;
				//cout<<ans<<" ";
				ans+=r2-r1;
				ans+=1ll*l*now0;
				//cout<<ans<<" ";
				cout<<ans<<"\n";
			}
		}
	}
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...