分块全RE求调

P2801 教主的魔法

galiyuebing @ 2023-10-27 20:24:31

rt

用分块写的,本地没问题,下了一组数据也没问题,一交上全RE,点了一下O_2结果全WA,完全查不出来,求大佬指点

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#define pii pair<int,int>
using namespace std;
const int N=1e6+10;
int n,q,block,t;
int st[N],ed[N],pos[N];
long long a[N],add[N];

void ini()
{
    t=sqrt(n);
    block=n/t;
    if(n%block)++t;
    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<=t;++i)
    {
        for(int j=st[i];j<=ed[i];++j)pos[j]=i;
        sort(a+st[i],a+ed[i]+1);
    }
}

void change(int l,int r,long long k)
{
    int lp=pos[l],rq=pos[r];
    if(lp==rq)for(int i=l;i<=r;++i)a[i]+=k;
    else
    {
        for(int i=lp+1;i<rq;++i)add[i]+=k;
        change(l,ed[lp],k);change(st[rq],r,k);
    }
}

long long Sum(int l,int r,long long c)
{
    int lp=pos[l],rq=pos[r];
    if(lp==rq)
    {
        int tot=lower_bound(a+l,a+r+1,c-add[lp])-a;
        return r-tot+1;
    }
    else
    {
        long long ans=0;
        for(int i=lp+1;i<rq;++i)
        {
            int tot=lower_bound(a+st[i],a+ed[i]+1,c-add[i])-a;
            ans+=ed[i]-tot+1;
        }
        ans+=Sum(l,ed[lp],c)+Sum(st[rq],r,c);
        return ans;
    }
}

int main()
{
    cin>>n>>q;
    for(int i=1;i<=n;++i)scanf("%lld",&a[i]);ini();
    getchar();
    for(int i=1,l,r;i<=q;++i)
    {
        char ch;
        scanf("%c%d%d",&ch,&l,&r);
        if(ch=='M')
        {
            long long w;
            scanf("%lld",&w);
            change(l,r,w);
        }
        else
        {
            long long c;
            scanf("%lld",&c);
            printf("%lld\n",Sum(l,r,c));
        }
        getchar();
    }
    return 0;
}

by tang_mx @ 2023-10-27 20:27:32

https://www.luogu.com.cn/paste/4lxz30r8


by yinianxingkong @ 2023-10-27 20:28:59

……输入,改法很简单,注释掉getchar,输入字符改用scanf("%s")就过了

然而我太蒻了,不知道原因QAQ(也是以前一道题调不出来发现的)


by galiyuebing @ 2023-10-27 20:32:16

@yinianxingkong 感谢大佬!!过了

顺便挂个二贴:为什么会RE呢?%c不是读取单个字符吗?为什么换成字符串的%s就行了?


by yinianxingkong @ 2023-10-27 20:33:27

bdfs了一下……好像%c会吞字符,前面加个空格scanf(" %c")就能A

还是用%s罢……


by cmach_socket @ 2024-01-29 11:41:07

@yinianxingkong 因为scanf不会读入行末换行符,导致下一行读入会多一个行末换行符,如果用%c读入就会读入这个换行符。scanf(" %c")前面的空格意思是跳过一个空白字符(指换行符,空格,制表符等),这样输入的字符就是正确的。 至于平时%d为什么不用scanf(" %d"),因为限制了必须是数字,所以这个换行符是非法的就会跳过。而%c不会,只要是字符就会合法


by yinianxingkong @ 2024-01-29 11:45:02

@cmach_socket ok,谢谢。当然即便是这样我也不会用scanf("%c")的


|