TLE on #8 求助
查看原帖
TLE on #8 求助
556362
Unnamed114514楼主2022/2/27 15:24
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5,maxk=1e3+5;
int n,q,len,t,L[maxk],R[maxk],del[maxn],a[maxn],b[maxn],tag[maxk];
inline int f(int x,int k){
	int qwq=R[x]-L[x]+1;
	int l=0,r=qwq;
	while(l<r){
		int mid=l+r+1>>1;
		if(b[L[x]+mid-1]>=k)
			l=mid;
		else
			r=mid-1;
	}
	return r;
}
inline int read(){
	char ch=getchar();
	int res=0;
	while(ch<'0'||ch>'9')
		ch=getchar();
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=getchar();
	}
	return res;
}
int main(){
	n=read(),q=read();
	len=sqrt(n);
	t=(n+len-1)/len;
	for(int i=1;i<=n;++i)
		b[i]=a[i]=read();
	for(int i=1;i<=t;++i){
		L[i]=(i-1)*len+1;
		R[i]=min(n,i*len);
		sort(b+L[i],b+R[i]+1);
	}
	for(int i=1;i<=q;++i){
		char c=getchar();
		while(c!='M'&&c!='A')
			c=getchar();
		int l=read(),r=read(),k=read();
		int x=del[l],y=del[r];
		if(c=='M'){
			if(x==y){
				for(int j=l;j<=r;++j)
					a[j]+=k;
				for(int j=L[x];j<=R[x];++j)
					b[j]=a[j];
				sort(b+L[x],b+R[x]+1);
			} else{
				for(int j=l;j<=R[x];++j)
					a[j]+=k;
				for(int j=L[x];j<=R[x];++j)
					b[j]=a[j];
				sort(b+L[x],b+R[x]+1);
				for(int j=L[y];j<=r;++j)
					a[j]+=k;
				for(int j=L[y];j<=R[y];++j)
					b[j]=a[j];
				sort(b+L[x],b+R[x]+1);
				for(int j=x+1;j<y;++j)
					tag[j]+=k;
			}
		} else{
			int ans=0;
			if(x==y){
				for(int j=l;j<=r;++j)
					ans+=(a[j]+tag[x]>=k);
			} else{
				for(int j=l;j<=R[x];++j)
					ans+=(a[j]+tag[x]>=k);
				for(int j=L[y];j<=r;++j)
					ans+=(a[j]+tag[y]>=k);
				for(int j=x+1;j<y;++j)
					ans+=f(j,k-tag[j]);
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}
2022/2/27 15:24
加载中...