分块怎么优化
查看原帖
分块怎么优化
976777
lidongcheng楼主2024/3/9 11:40

问a2那部分可以怎么优化,好像说可以用二分但不会

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long st[N],ed[N],a[N],n,c,k,fk[N],q,x,y,z,t[N];
char o;
void a1(int u,int v,int w){
	int p=fk[u],q=fk[v];
	if(p==q){
		for(int i=u;i<=v;i++)a[i]+=w;
	}
	else{
		for(int i=p+1;i<q;i++)t[i]+=w;
		for(int i=u;i<=ed[p];i++)a[i]+=w;
		for(int i=st[q];i<=v;i++)a[i]+=w;
	}
	return;
}
long long a2(int u,int v,int w){
	long long s=0;
	for(int i=u;i<=v;i++){
		if(a[i]+t[fk[i]]>=w)s++;
	}
	return s;
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	c=sqrt(n);
	k=n/c;
	if(n%c!=0)k++;
	for(int i=1;i<=k;i++){
		st[i]=(i-1)*c+1;
		ed[i]=i*c;
	}
	ed[k]=n;
	for(int i=1;i<=n;i++){
		fk[i]=(i-1)/c+1;
	}
	while(q--){
		cin>>o;
		if(o=='M'){
			cin>>x>>y>>z;
			a1(x,y,z);
		}
		else{
			cin>>x>>y>>z;
			cout<<a2(x,y,z)<<'\n';
		}
	}
    return 0;
}
2024/3/9 11:40
加载中...