社区讨论
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 条回复,欢迎继续交流。
正在加载回复...