hack!

P2801 教主的魔法

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 已添加,感谢您的贡献


|