为什么我的程序文件输出会输出乱码啊?

P1600 [NOIP2016 提高组] 天天爱跑步

_D06 @ 2020-07-11 10:03:14

为什么我的程序在官方数据第6个测试点文件输出会输出乱码啊?(如果不使用文件输出不会有乱码)(而且如果把空格换成换行也不会有乱码)

乱码的一部分: ㄠㄠ〠ㄠ〠〠〠

#include <bits/stdc++.h>
using namespace std;
vector<int>a[300005];
int w[300005];
int h[300005];
int l[300005],r[300005];
int s[300005],t[300005];
int c[300005],d[300005];
int read1()
{
    char cc=getchar();
    while(!(cc>=48&&cc<=57))
    {
        if(cc=='-')
        {
            break;
        }
        cc=getchar();
    }
    bool f=false;
    int s=0;
    if(cc=='-')
    {
        f=true;
    }
    else
    {
        s=cc-48;
    }
    while(1)
    {
        cc=getchar();
        if(cc>=48&&cc<=57)
        {
            s=s*10+cc-48;
        }
        else
        {
            break;
        }
    }
    if(f==true)
    {
        s=-s;
    }
    return s;
}
bool cmp1(int a,int b)
{
    return w[a]<w[b];
}
bool cmp2(int a,int b)
{
    return abs(s[a]-t[a])<abs(s[b]-t[b]);
}
int main()
{
//  freopen("running6.in","r",stdin);
//  freopen("running6.out","w",stdout);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<n;i++)
    {
        int u,v;
        u=read1();
        v=read1();
        a[u].push_back(v);
        a[v].push_back(u);
    }
    for(int i=1;i<=n;i++)
    {
        w[i]=read1();
        c[i]=i;
    }
    if(n%10<=2)
    {
        for(int i=1;i<=m;i++)
        {
            s[i]=read1();
            t[i]=read1();
            if(w[s[i]]==0)
            {
                h[s[i]]++;
            }
        }
        for(int i=1;i<=n;i++)
        {
            cout<<h[i]<<' ';
        }
        cout<<endl;
    }
    else
    {
        for(int i=1;i<=m;i++)
        {
            s[i]=read1();
            t[i]=read1();
            if(t[i]>s[i])
            {
                l[s[i]]++;
            }
            else
            {
                r[s[i]]++;
            }
            d[i]=i;
        }
        sort(c+1,c+n+1,cmp1);
        sort(d+1,d+m+1,cmp2);
        int g=1;
        for(int i=1;i<=n;i++)
        {
            int ans=0;
            bool f=false;
            for(int j=g;j<=m;j++)
            {
                if(s[d[j]]<t[d[j]]&&s[d[j]]+w[c[i]]>t[d[j]]||s[d[j]]>=t[d[j]]&&s[d[j]]-w[c[i]]<t[d[j]])
                {
                    if(t[d[j]]>s[d[j]])
                    {
                        l[s[d[j]]]--;
                    }
                    else
                    {
                        r[s[d[j]]]--;
                    }
                }
                else
                {
                    g=j;
                    f=true;
                    break; 
                }
            }
            if(f==false)
            {
                g=m+1;
            }
            if(c[i]>w[c[i]])
            {
                ans+=l[c[i]-w[c[i]]];
            }
            if(c[i]+w[c[i]]<=n)
            {
                ans+=r[c[i]+w[c[i]]];
            }
            printf("%d ",ans);
        }
        cout<<endl;
    }
    return 0;
}
/*
5 3
1 2
2 3
3 4
4 5
4 3 2 1 0
1 5
2 4
1 2
*/

by Colead @ 2020-07-11 10:06:27

您的代码太过高深,蒟蒻看不懂,先%%%

但是凭借个人经验,一般是ASCII码在无意中被错误修改了。


by _D06 @ 2020-07-11 10:09:37

@WT20071112 请问一般情况下什么原因会使得ASCII码被错误修改呢?


by _D06 @ 2020-07-11 10:12:40

@WT20071112 而且为什么不使用文件输出就没有乱码呢?


by _D06 @ 2020-07-11 10:34:56

问题已解决,应该是记事本编码识别错误,使用写字板可以正常打开。


by EternalEpic @ 2020-07-11 10:37:31

@_D06 您是不是我同学?咋感觉这个ID如此熟悉


by EternalEpic @ 2020-07-11 10:38:27

@_D06 这个程序会T的,反正我写的是树链剖分,当然只要树上差分+LCA就行。


by EternalEpic @ 2020-07-11 10:39:35

@_D06 当然可能你在写subtask那就当我之前的话没说


by _D06 @ 2020-07-11 10:53:57

@刘兆洲 我确实是在做链的部分分。


by Colead @ 2020-07-11 11:12:29

@_D06

这只是猜想,我还是大蒟蒻啊!(只能说出了什么问题,具体出了什么问题嘛……)


by _D06 @ 2020-07-11 11:27:53

@WT20071112 好的,还是谢谢您的帮助。


| 下一页