本人的基础知识并不是很牢固,在学习归并排序的时候遇到了些小问题,已解决!来这里分享一下我从中学到的基础知识。
我一直不习惯使用cin或者cout,换句话说就是学了c之后就一直在用printf和scanf。
大家在看闫老师的逆序对数量这道题的代码答案会发现,他最后输出用的是cout而不是printf。
我当时没多想觉得差不多,就继续用printf。
先看看我过了的代码吧
#include<iostream>
using namespace std;
const int N = 100010;
typedef long long LL;
int q[N],tmp[N];
LL merge_sort(int q[],int l, int r)
{
if(l>=r) return 0;
int mid = l+r >> 1;
LL res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r);
int k = 0,i = l,j = mid+1;
while(i<=mid&&j<=r)
{
if(q[i]<=q[j]) tmp[k++] = q[i++];
else
{
res += mid-i+1;
tmp[k++] = q[j++];
}
}
while(i<=mid) tmp[k++] = q[i++];
while(j<=r) tmp[k++] = q[j++];
for(i = l,j= 0;i<=r;i++,j++) q[i] = tmp[j];
return res;
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i<n;i++) scanf("%d",&q[i]);
printf("%lld",merge_sort(q,0,n-1));
return 0;
}
这里可以看到在main函数中我的printf用的是”%lld”。为什么呢?我当时也研究了很久,因为我一直觉得是我在merge_sort中有些敲错了或者判断条件有问题。我检查了一遍又一遍,就是ac不了。很急躁hh。然后细细一看,哦~错误的那组数据非常大,而且我输出的是一个负数,我就意识到可能是数太大了。于是就百度了一下hh,
“%d”是long
“%lld”才是long long
第一次写分享,希望跟我遇到相同问题的小伙伴可以就此增长经验hh(我感觉应该没什么人跟我遇到同样的问题哈哈哈,毕竟我的基础实在是有点差)
ovo! 可以顺便去看下输入输出,小数咋输出。还有输入这种时:秒:分qwq还有含前导零的输入
wow!感谢提醒hh,输入时:秒:分确实不太懂