P2801分块TLE求助
  • 板块题目总版
  • 楼主T20201126
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/4/8 20:18
  • 上次更新2023/10/23 19:01:22
查看原帖
P2801分块TLE求助
419474
T20201126楼主2023/4/8 20:18
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define re read()
inline int read(){
	int x=0,b=1;char c=getchar();
	while(!isdigit(c)){if(c=='-') b=-1;c=getchar();}
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x*b;
}
const int N=1000007;

int n,Q,a[N],l,r,w,cnt;
int L[N],R[N],pos[N],tag[N],d[N];

void change(int l,int r,int x){
	if(pos[l]==pos[r]){
		for(int i=l;i<=r;++i)
			a[i]+=x,d[i]=a[i];
		sort(d+L[pos[l]],d+R[pos[l]]+1);
		return ;
	}
	for(int i=l;i<=R[pos[l]];++i) 
		a[i]+=x,d[i]=a[i];
	sort(d+L[pos[l]],d+R[pos[l]]+1);
	for(int i=L[pos[r]];i<=r;++i)
		a[i]+=x,d[i]=a[i];
	sort(d+L[pos[r]],d+R[pos[r]]+1);
	for(int i=pos[l]+1;i<pos[r];++i) 
		tag[i]+=x;
	return ;
}

int ques(int l,int r,int x){
	int ans=0;
	if(pos[l]==pos[r]){
		for(int i=l;i<=r;++i) ans+=a[i]+tag[pos[l]]>=x?1:0;
		return ans;
	}
	for(int i=l;i<=R[pos[l]];++i) 
		ans+=a[i]+tag[pos[l]]>=x?1:0;
	for(int i=L[pos[r]];i<=r;++i)
		ans+=a[i]+tag[pos[r]]>=x?1:0;
	for(int i=pos[l]+1;i<pos[r];++i) 
	{
		int xx=L[i],y=R[i],mid=xx+((y-xx)>>1);
		while(xx<y){
			mid=xx+((y-xx)>>1);
			if(d[mid]+tag[i]>=x) xx=mid;
			else y=mid+1;
		}
		ans+=R[i]-xx+1;
	}
	return ans;
}
int len;
signed main(){
	n=re;Q=re;len=sqrt(n);
	if(n%len==0) cnt=n/len;
	else cnt=n/len+1;
	for(int i=1;i<=cnt;++i) {
		L[i]=(i-1)*len+1;
		R[i]=i*len;
	}
	R[cnt]=n;
	for(int i=1;i<=cnt;++i)
		for(int j=L[i];j<=R[i];++j) 
			pos[j]=i; 
	for(int i=1;i<=n;++i) a[i]=re,d[i]=a[i];
	for(int i=1;i<=cnt;++i)
		sort(d+L[i],d+R[i]+1);
	for(int i=1;i<=n;++i)
	for(int i=1;i<=Q;++i){
		char ch;cin>>ch;
		if(ch=='M'){
			l=re;r=re;w=re;
			change(l,r,w);
		}
		if(ch=='A'){
			l=re;r=re;w=re;
			printf("%lld\n",ques(l,r,w));
		}
	}
	return 0;
}
2023/4/8 20:18
加载中...