社区讨论
关于分块大小、数组大小以及O2的玄学问题
P2801教主的魔法参与者 10已保存回复 17
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 17 条
- 当前快照
- 1 份
- 快照标识符
- @mi6xpd80
- 此快照首次捕获于
- 2025/11/20 12:31 4 个月前
- 此快照最后确认于
- 2025/11/20 15:20 4 个月前
AC代码见下方。
N为数组大小,B为分块大小(具体见代码)
为什么会出现这种玄学现象...是我哪里写炸了吗?
CPP#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
inline int read()
{
char c;int out=0;
for (c=getchar();c<'0'||c>'9';c=getchar());
for (;c>='0'&&c<='9';c=getchar()){out=(out<<3)+(out<<1)+c-'0';}
return out;
}
void write(int x)
{
if (x>9){write(x/10);}
putchar(x%10+'0');
}
const int B=998;
const int N=1001010;
bool cmp(int x,int y);
void bf(int l,int r,int x);
int bq(int l,int r,int x);
int n,q,a[N],b[N],tag[N/B+10],bl[N],ll[N/B+10],rr[N/B+10];
char wtf[10];
int main()
{
int i,l,r,x,ans;
n=read();
q=read();
for (i=1;i<=n;++i)
{
cin>>a[i];
b[i]=i;
bl[i]=(i-1)/B+1;
}
for (i=1;i<=bl[n];++i)
{
ll[i]=i*B-B+1;
rr[i]=i*B;
sort(b+ll[i],b+rr[i]+1,cmp);
}
rr[bl[n]]=n;
while (q--)
{
scanf("%s",wtf);
l=read();
r=read();
x=read();
if (wtf[0]=='M')
{
if (bl[l]==bl[r])
{
bf(l,r,x);
}
else
{
bf(l,rr[bl[l]],x);
bf(ll[bl[r]],r,x);
for (i=bl[l]+1;i<bl[r];++i)
{
tag[i]+=x;
}
}
}
else
{
if (l/B==r/B)
{
cout<<bq(l,r,x)<<endl;
}
else
{
ans=bq(l,rr[bl[l]],x)+bq(ll[bl[r]],r,x);
for (i=bl[l]+1;i<bl[r];++i)
{
a[N-1]=x-tag[i];
ans+=upper_bound(b+ll[i],b+rr[i]+1,N-1,cmp)-b-ll[i];
}
cout<<ans<<endl;
}
}
}
return 0;
}
bool cmp(int x,int y)
{
return a[x]>a[y];
}
void bf(int l,int r,int x)
{
for (int i=l;i<=r;++i)
{
a[i]+=x;
}
sort(b+ll[bl[l]],b+rr[bl[l]]+1,cmp);
}
int bq(int l,int r,int x)
{
int i,out=0;
for (i=l;i<=r;++i)
{
out+=(a[i]>=x);
}
return out;
}
回复
共 17 条回复,欢迎继续交流。
正在加载回复...