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 上网搜搜
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