洛谷输出与本地输出不同+额外的输出?

P2801 教主的魔法

HikariVVIP @ 2022-06-21 13:33:35

input:
10 9
719 583 321 556 741 430 50 28 326 804
A 1 10 321
M 1 10 101
A 1 10 337
A 1 10 596
M 1 10 511
A 1 10 142
A 1 10 99
A 1 10 88
M 1 10 609

output:
8
8
5
10
10
10

LuoGu IDE output:
8
8
6
3
5
8
8
8
3

这组数据在我的本地输出的是正确答案,但是在洛谷IDE和提交里都显示的是下面那组数据。
蒟蒻被这题卡了一周了(WA 0),请求各位神犇的帮助!


by HikariVVIP @ 2022-06-21 13:34:06

#include<bits/stdc++.h>
#define Debug(file) freopen(file".in","r",stdin);freopen(file".res","w",stdout);
using namespace std;
char op;
int n,q,block,tot;
int st[1005],ed[1005],bel[1000050],lz[1005],val[1000050];
vector<int> vec[1005];
inline int read() 
    {
        char ch=getchar();
        int x=0,f=1;
        while(ch < '0' || ch > '9') 
            {
                if(ch == '-')
                    f = -1;
            ch = getchar();
            }
        while('0' <= ch && ch <= '9') 
            {
                x = (x<<3) + (x<<1) + (ch^48);
                ch = getchar();
            }
        return x * f;
    }
void update(int x)
    {
        vec[x].clear();
        for(int i=st[x];i<=ed[x];i++)
            {
                vec[x].push_back(val[i]);
            }
        sort(vec[x].begin(),vec[x].end());
    }
void add(int l,int r,int v)
    {
        if (bel[l]==bel[r])
            {
                for (int i=l;i<=r;i++)
                    {
                        val[i]+=v;
                    }
                update(bel[l]);
            }
        else
            {
                for (int i=l;i<=ed[bel[l]];i++)
                    {
                        val[i]+=v;
                    }
                update(bel[l]);
                for (int i=st[bel[r]];i<=r;i++)
                    {
                        val[i]+=v;
                    }
                update(bel[r]);
                for (int i=bel[l]+1;i<bel[r];i++)
                    lz[i]+=v;

            }
    }

int ask(int l,int r,int v)
    {
        int cnt=0;
        if (bel[l]==bel[r])
            {
                for (int i=l;i<=r;i++)
                    if(val[i]+lz[bel[l]]<v)
                        cnt++; 
            }
        else
            {
                for (int i=l;i<=ed[bel[l]];i++)
                    {
                        if(val[i]+lz[bel[l]]<v)
                            cnt++;
                    }
                for (int i=st[bel[r]];i<=r;i++)
                    {
                        if(val[i]+lz[bel[r]]<v)
                            cnt++;
                    }
                for (int i=bel[l]+1;i<bel[r];i++)
                    {
                        cnt+=lower_bound(vec[i].begin(),vec[i].end(),v-lz[i])-vec[i].begin();
                    }
            }
        return (r-l+1)-cnt;
    }
int main()
    {
        //Debug("P2801_2")
        n=read();q=read();
        block=sqrt(n);
        tot=n/block;
        if (n%block) tot++;
        for (int i=1;i<=n;i++)
            {
                val[i]=read();
                bel[i]=(i-1)/block+1;
                vec[bel[i]].push_back(val[i]);
            }
        for (int i=1;i<=tot;i++)
            {
                st[i]=(i-1)*block+1;
                ed[i]=i*block;
            }
        ed[tot]=n;
        for (int i=1;i<=tot;i++)
            {
                sort(vec[i].begin(),vec[i].end());
            }
        for (int i=1;i<=q;i++)
            {
                scanf("%c",&op);
                int l=read(),r=read(),v=read();
                if (op=='M')
                    add(l,r,v);
                else
                    printf("%d\n",ask(l,r,v));
            }
        return 0;
    }

丑陋的代码


by Bug_Automation @ 2022-06-21 13:37:32

ub吧


by HikariVVIP @ 2022-06-21 13:59:26

@Bug_Automation 请问是哪里ub呢qwq


by 编码落寞 @ 2022-06-21 14:32:07

@HikariVVIP

可能是换行符的问题。你读入op的时候出现了换行符。

 scanf("%c",&op);

改成

scanf("\r%c",&op);

具体原理,我也不了解


by 听取MLE声一片 @ 2022-06-21 14:54:27

@HikariVVIP 为什么字符串要加&


by HikariVVIP @ 2022-06-21 22:38:07

@编码落寞 thk!!!


|