社区讨论

166行超级宇宙无敌代码为什么超时了

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mlgxvwnr
此快照首次捕获于
2026/02/11 02:33
4 周前
此快照最后确认于
2026/02/11 02:33
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#ifndef _QUICK_IO
#define _QUICK_IO
struct qistream{}qin;struct qostream{}qout;
template<typename T>inline T readint(){short __f=1;T __num=0;char __c=getchar();while(!isdigit(__c)&&__c!='-')__c=getchar();if(__c=='-')__f=-1,__c=getchar();while(isdigit(__c))__num=__num*10+__c-'0',__c=getchar();return __num*__f;}
template<typename T>qistream&operator>>(qistream&in,T&__a){return __a=readint<T>(),in;}
qistream&operator>>(qistream&in,char&__a){__a=getchar();while(__a==' '||__a=='\n')__a=getchar();return in;}
template<typename T>void __write(T __a){if (!__a)return;__write(__a/10);putchar(__a%10+'0');}
template<typename T>qostream&operator<<(qostream&out,T __a){if (__a<0)putchar('-'),__a=-__a;if (!__a)putchar('0');else __write(__a);return out;}
qostream& operator<<(qostream& out,char __a){putchar(__a);return out;}
qostream& operator<<(qostream& out,const char* __s){while(*__s)putchar(*__s++);return out;}
#define cin qin
#define cout qout
#define endl '\n'
#endif
using namespace std;
int n,q,a[1000005],l,r,w,c,t,block,sum[1005],add[1005],p[1000005],st[1005],ed[1005],b[1000005],pb[1000005],ll,rr;
char ch;
bool bl[1000005];
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	block=sqrt(n);
	t=n/block+(int)(n%block!=0);
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
	ed[t]=n;
	for(int i=1;i<=n;i++){
		p[i]=(i-1)/block+1;
		b[i]=a[i];
	}
	for(int i=1;i<=t;i++){
		for(int j=st[i];j<=ed[i];j++){
			sum[i]+=a[j];
		}
	}
	for(int i=1;i<=t;i++){
		sort(b+st[i],b+ed[i]+1);
	}
	for(int i=1;i<=n;i++){
		int noww=lower_bound(b+st[p[i]],b+ed[p[i]]+1,a[i])-b;
		while(bl[noww]){
			noww++;
		}
		pb[i]=noww;
	}
	while(q--){
		cin>>ch>>l>>r;
		ll=t+1;
		rr=0;
		for(int i=1;i<=t;i++){
			if(st[i]>=l){
				ll=i;
				break;
			}
		}
		for(int i=t;i>=1;i--){
			if(ed[i]<=r){
				rr=i;
				break;
			}
		}
		if(ch=='M'){
			cin>>w;
			if(ll>rr){
				for(int i=l;i<=r;i++){
					a[i]+=w;
					b[pb[i]]+=w;
				}
				int x=p[l];
				for(int i=st[x];i<=ed[x];i++){
					bl[i]=false;
				}
				sort(b+st[x],b+ed[x]+1);
				for(int i=st[x];i<=ed[x];i++){
					int noww=lower_bound(b+st[x],b+ed[x]+1,a[i])-b;
					while(bl[noww]){
						noww++;
					}
					pb[i]=noww;
				}
				x=p[r];
				for(int i=st[x];i<=ed[x];i++){
					bl[i]=false;
				}
				sort(b+st[x],b+ed[x]+1);
				for(int i=st[x];i<=ed[x];i++){
					int noww=lower_bound(b+st[x],b+ed[x]+1,a[i])-b;
					while(bl[noww]){
						noww++;
					}
					pb[i]=noww;
				}
			}
			else{
				for(int i=l;i<st[ll];i++){
					a[i]+=w;
					b[pb[i]]+=w;
				}
				int x=p[l];
				for(int i=st[x];i<=ed[x];i++){
					bl[i]=false;
				}
				sort(b+st[x],b+ed[x]+1);
				for(int i=st[x];i<=ed[x];i++){
					int noww=lower_bound(b+st[x],b+ed[x]+1,a[i])-b;
					while(bl[noww]){
						noww++;
					}
					pb[i]=noww;
				}
				for(int i=ed[rr]+1;i<=r;i++){
					a[i]+=w;
					b[pb[i]]+=w;
				}
				x=p[r];
				for(int i=st[x];i<=ed[x];i++){
					bl[i]=false;
				}
				sort(b+st[x],b+ed[x]+1);
				for(int i=st[x];i<=ed[x];i++){
					int noww=lower_bound(b+st[x],b+ed[x]+1,a[i])-b;
					while(bl[noww]){
						noww++;
					}
					pb[i]=noww;
				}
				for(int i=ll;i<=rr;i++){
					add[i]+=w;
				}
			}
		}
		else{
			int ans=0;
			cin>>c;
			if(ll<rr){
				for(int i=l;i<=r;i++){
					if(a[i]+add[p[i]]>=c){
						ans++;
					}
				}
			}
			else{
				for(int i=l;i<st[ll];i++){
					if(a[i]+add[p[i]]>=c){
						ans++;
					}
				}
				for(int i=ed[rr]+1;i<=r;i++){
					if(a[i]+add[p[i]]>=c){
						ans++;
					}
				}
				for(int i=ll;i<=rr;i++){
					ans+=ed[i]-(lower_bound(b+st[i],b+ed[i]+1,c-add[i])-b)+1;
				}
			}z
			cout<<ans<<endl;
		}
	}
	return 0;
}

回复

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

正在加载回复...