求调,WA Sub#0 4,5,7,8,11,Sub#1 1
查看原帖
求调,WA Sub#0 4,5,7,8,11,Sub#1 1
555868
Lovya楼主2025/2/5 23:13
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,t,x,y,z,w_num,w_block,a[1000005],w_sorted[1000005],w_left[1005],w_right[1005],w_belong[1000005],w_lazy_tag[1005];
char c[5];
void w_build()
{
	w_block=(int)(sqrt((double)n));
	w_num=(int)(sqrt((double)n))+(n%w_block!=0);
	for(int i=1;i<=w_num;i++)
	{
		w_left[i]=w_block*(i-1)+1;
		w_right[i]=min(w_block*i,n);
		sort(w_sorted+w_left[i],w_sorted+w_right[i]+1);
	}
	for(int i=1;i<=n;i++)
		w_belong[i]=(i+w_block-1)/w_block;
}
void w_change_block(int w_id,int w_start,int w_end,int k)
{
	for(int i=w_start;i<=w_end;i++)
	{
		a[i]+=k;
		w_sorted[i]=a[i];
	}
	sort(w_sorted+w_left[w_id],w_sorted+w_right[w_id]+1);
}
void w_change(int x,int y,int k)
{
	if(w_belong[x]==w_belong[y])
	{
		w_change_block(w_belong[x],x,y,k);
		return;
	}
	w_change_block(w_belong[x],x,w_right[w_belong[x]],k);
	w_change_block(w_belong[y],w_left[w_belong[y]],y,k);
	for(int i=w_belong[x]+1;i<w_belong[y];i++)
		w_lazy_tag[i]+=k;
}
int w_query_block(int w_id,int w_start,int w_end,int k)
{
	int w_temp=0;
	for(int i=w_start;i<=w_end;i++)
	{
		if(a[i]+w_lazy_tag[w_id]>=k)
			w_temp++;
	}
	return w_temp;
}
int w_query(int x,int y,int k)
{
	if(w_belong[x]==w_belong[y])
		return w_query_block(w_belong[x],x,y,k);
	int w_temp=0;
	w_temp+=w_query_block(w_belong[x],x,w_right[w_belong[x]],k);
	w_temp+=w_query_block(w_belong[y],w_left[w_belong[y]],y,k);
	for(int i=w_belong[x]+1;i<w_belong[y];i++)
		w_temp+=w_right[i]-(lower_bound(w_sorted+w_left[i],w_sorted+w_right[i]+1,k-w_lazy_tag[i])-w_sorted)+1;
	return w_temp;
}
int main()
{
	scanf("%d %d",&n,&t);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		w_sorted[i]=a[i];
	}
	w_build();
	while(t--)
	{
		scanf("%s %d %d %d",c+1,&x,&y,&z);
		if(c[1]=='M')
			w_change(x,y,z);
		else
			printf("%d\n",w_query(x,y,z));
	}
	return 0;
}
2025/2/5 23:13
加载中...