社区讨论

分块90pts求助玄关(T两个点)

P2801教主的魔法参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mhjbbfuk
此快照首次捕获于
2025/11/03 23:46
4 个月前
此快照最后确认于
2025/11/03 23:46
4 个月前
查看原帖
CPP
#include<iostream>
#include<algorithm>
#include<cmath>
#define gc getchar
#define N 1000005
#define sort stable_sort
#define int long long
int bar=2333;
int rd(){
	int x=0,f=1;char c=gc();
	for(;!isdigit(c);c=gc())f=c==45?-1:f;
	for(; isdigit(c);c=gc())x=x*10+c-'0';
	return x*f;
} 
char rdc(){
	char c=gc();
	while(c!='A'&&c!='M')c=gc();
	return c;
}
using namespace std;
int n,q;
int a[N],c[N],belong[N],len[N],cnt;
struct BAR{
	int l,r,tag;
}b[N];
void Sort(int x){
	for(int i=b[x].l;i<=b[x].r;i++)c[i]=a[i];
	sort(c+b[x].l,c+b[x].r+1);
}
void build(){
	cnt=(n-1)/bar+1;
	for(int i=1;i<=cnt;i++)b[i].l=(i-1)*bar+1,b[i].r=i*bar;
	b[cnt].r=n;
	for(int i=1;i<=cnt;i++){
		for(int j=b[i].l;j<=b[i].r;j++)belong[j]=i;
		len[i]=b[i].r-b[i].l+1;
		sort(c+b[i].l,c+b[i].r+1);
	}
}
void add(int l,int r,int w){
	int x=belong[l],y=belong[r];
	if(x==y){
		for(int i=l;i<=r;i++)a[i]+=w;
		Sort(x);return;
	}
	for(int i=x+1;i<y;i++)b[i].tag+=w;
	for(int i=l;i<=b[x].r;i++)a[i]+=w;
	for(int i=b[y].l;i<=r;i++)a[i]+=w;
	Sort(x),Sort(y);
}
int query(int l,int r,int C){
	int x=belong[l],y=belong[r],ret=0;
	if(x==y){
		for(int i=l;i<=r;i++)
			if(a[i]+b[x].tag>=C)ret++;
		return ret;
	}
	for(int i=l;i<=b[x].r;i++)if(a[i]+b[x].tag>=C)ret++;
	for(int i=b[y].l;i<=r;i++)if(a[i]+b[y].tag>=C)ret++;
	for(int i=x+1;i<y;i++){
		ret+=b[i].r-(lower_bound(c+b[i].l,c+b[i].r+1,C-b[i].tag)-c)+1;
	}
	return ret;
}
signed main(){
	n=rd(),q=rd();
	for(int i=1;i<=n;i++)a[i]=c[i]=rd();
	while(q--){
		char opt=rdc();
		int l=rd(),r=rd(),w=rd();
		if(opt=='M'){
			add(l,r,w);
		}
		else {
			printf("%lld\n",query(l,r,w));
		}
	}
	return 0;
}

回复

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

正在加载回复...