syf2008 @ 2022-08-11 20:42:24
我hack我自己
#include <bits/stdc++.h>
using namespace std;
int w;int zf;char c;
int read()
{
w=0;zf=1;c=getchar();
while(c<'0'||c>'9'){if(c=='-')zf=-1;c=getchar();}
while(c>='0'&&c<='9'){w=(w<<3)+(w<<1)+(c^48);c=getchar();}
return w*zf;
}
char cread(){c=getchar();while(c!='A'&&c!='M')c=getchar();return c;}
int n,q,a[1000005],b[1000005],belong[1000005],tag[1000005],l[2005],r[2005],kuai,s,ans;
void update(int p,int x,int y,int k)
{
if(belong[x]==belong[y])
{
for(int i=x;i<=y;i++){a[i]+=k;b[i]=a[i];}
sort(b+l[belong[x]],b+r[belong[x]]+1);
}
else{
for(int i=x;i<=r[belong[x]];i++)a[i]+=k;
for(int i=l[belong[x]];i<=r[belong[x]];i++)b[i]=a[i];
sort(b+l[belong[x]],b+r[belong[x]]+1);
for(int i=l[belong[y]];i<=y;i++)a[i]+=k;
for(int i=l[belong[y]];i<=r[belong[y]];i++)b[i]=a[i];
sort(b+l[belong[y]],b+r[belong[y]]+1);
for(int i=belong[x]+1;i<=belong[y]-1;i++)tag[i]+=k;
}
}
void query(int p,int x,int y,int k)
{
ans=0;
if(belong[x]==belong[y])
{
for(int i=x;i<=y;i++)if(tag[belong[x]]+a[i]>=k)ans++;
}
else{
for(int i=x;i<=r[belong[x]];i++)if(tag[belong[x]]+a[i]>=k)ans++;
for(int i=l[belong[y]];i<=y;i++)if(tag[belong[y]]+a[i]>=k)ans++;
for(int i=belong[x]+1;i<=belong[y]-1;i++)
{
int xx=lower_bound(b+l[i],b+r[i]+1,k-tag[i])-b;
ans+=r[i]-xx+1;
}
}
}
char cc;
int ll,rr,k;
int main()
{
n=read();q=read();kuai=sqrt(n);s=n/kuai;
for(int i=1;i<=s;i++){l[i]=(i-1)*kuai+1;r[i]=i*kuai;}
if(r[s]<n){++s;l[s]=r[s-1]+1;r[s]=n;}
for(int i=1;i<=n;i++)belong[i]=(i-1)/kuai+1;
for(int i=1;i<=n;i++)a[i]=b[i]=read();
for(int i=1;i<=s;i++)sort(b+l[i],b+r[i]+1);
while(q--)
{
cc=cread();ll=read();rr=read();k=read();
if(cc=='M')update(1,ll,rr,k);
if(cc=='A')
{
ans=0;
query(1,ll,rr,k);
printf("%d\n",ans);
}
}
}
input:
100 5
40 7 47 44 52 81 87 60 82 49 40 30 44 90 62 68 81 44 46 17 44 71 89 79 44 95 57 4 6 36 26 61 62 64 14 93 46 35 20 98 55 6 71 9 85 31 1 70 93 100 82 33 57 14 83 56 40 67 27 53 43 39 44 4 59 32 49 72 91 60 67 84 16 64 9 21 59 30 100 34 47 62 10 9 56 88 19 20 16 92 22 11 68 56 62 16 77 94 20 10
M 66 67 1
M 82 97 13
M 14 90 20
M 47 76 7
A 58 86 80
output:
13
我输出12 死因:
if(belong[x]==belong[y])
{
for(int i=x;i<=y;i++){a[i]+=k;b[i]=a[i];}
sort(b+l[belong[x]],b+r[belong[x]]+1);
}
没有把所有的b[i]转移过去
by syf2008 @ 2022-08-11 20:43:15
@离散小波变换°
by fjy666 @ 2022-08-11 20:43:16
好叉
by syf2008 @ 2022-08-11 20:44:20
@fjy666 那肯定的
by syf2008 @ 2022-08-11 20:44:58
@fjy666 我因为这个错误调了另一道题1个下午+晚上
by irris @ 2022-08-11 21:38:53
你去 loj 呗,这题数据真是水的要死
by 离散小波变换° @ 2022-08-18 19:10:45
@syf2008 已添加,感谢您的贡献