全RE求助

P1908 逆序对

chenxi797 @ 2024-03-07 19:49:03

#include <bits/stdc++.h>
using namespace std;
long long n,cnt = 0;
int a[500005],b[500005];
void msort(int l,int r)
{
    if (l == r) return;
    int mid = l + r >> 1;
    msort(l,mid);
    msort(mid + 1,r);
    int i = l,j = mid + 1,k = l;
    while (i <= mid && j <= r)
    {
        if (a[i] < a[j]) b[k++] = a[i++];
        else b[k++] = a[j++],cnt += mid - i + 1;
    }
    while (i <= mid) b[k++] = a[i++];
    while (j <= r) b[k++] = a[j++];
    for (i = l;i <= r;i++) a[i] = b[i];
    return;
}
int main()
{
    cin >> n;
    for (int i = 1;i <= n;i++) scanf("%d",a[i]);
    msort(1,n);
    cout << cnt;
    return 0;
}

by xu15165563857 @ 2024-03-07 19:51:55

第25行你的 & 呢?


by xu15165563857 @ 2024-03-07 19:53:02

    for (int i = 1;i <= n;i++) scanf("%d",&a[i]);

by chenxi797 @ 2024-03-07 19:53:14

@xu15165563857 啊不是数组元素不用吗


by chenxi797 @ 2024-03-07 19:54:00

30分


by xu15165563857 @ 2024-03-07 19:55:18

@chenxi797 上网搜搜 scanf 的用法啊


by chenxi797 @ 2024-03-07 20:00:46

@xu15165563857 哦哦好的 能再帮我调一下吗


by __cheng827922__ @ 2024-03-07 20:08:26

@chenxi797

a[i] 它表示的是a的第i项 a 它是一个数组 在c++中数组的定义大概是这样的(我也不知道会不会报错 你就当伪代码看吧)

template<class T1>
T1 operator[](T1*pos,int sub){
return &(pos+sub);//记住这个&一会要考
}//pos是数组 sub 是下标

数组本身是什么,比方说你定义了一个数组

int a[10];

a它不仅仅是一个数组 你使用

std::cout<<a;

时你会发现它输出的不是里面的内容而是一个地址 这是数组第一项的地址 所以scanf("%d",a);是数组第一项的地址 也只输入第一项

前面提到了[]的重载记得那个取内容不? a[i]是一个具体的数,它不是一个地址 所以我们要使用scanf("%d",&a[i]);或scanf("%d",a+i);


by xu15165563857 @ 2024-03-07 20:17:07

        if (a[i] <= a[j]) b[k++] = a[i++];

少了个等号,不知道为什么的话去看一下逆序对的定义


by chenxi797 @ 2024-03-07 20:21:33

@xu15165563857 @cheng827922 thx,已AC


|