一个关于快读快写的问题
  • 板块P1908 逆序对
  • 楼主X_yugg123
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/7/10 16:18
  • 上次更新2023/11/3 10:43:43
查看原帖
一个关于快读快写的问题
816571
X_yugg123楼主2023/7/10 16:18

这个题中,为什么使用快速快写代码读取输出数据会全部TLE,而使用正常的scanf、printf就正常AC了,难道是因为快读快写代码没有scanf、printf快吗? (快读快写代码是csdn某博客借鉴来的,实测可行×)

快读快写的代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
typedef long long ll;
ll a[N], b[N], ans;
ll read()
{
    ll x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9') if(ch == '-') f = -1, ch = getchar();
    while(ch > '0' && ch < '9') x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}
void write(ll x)
{
    char F[200];
    ll tmp = x > 0 ? x : -x, cnt = 0;
    if(x < 0) putchar('-');
    while(tmp) F[cnt++] = tmp % 10 + '0', tmp /= 10;
    while(cnt) putchar(F[--cnt]);
}
void Merge(ll l, ll mid, ll r)
{
    ll i = l, j = mid + 1, t = 0;
    while(i <= mid && j <= r){
        if(a[i] > a[j]){
            b[t++] = a[j++];
            ans += mid - i + 1;
        }
        else b[t++] = a[i++];
    }
    while(i <= mid) b[t++] = a[i++];
    while(j <= r) b[t++] = a[j++];
    for(int i = 0; i < t; i++) a[l + i] = b[i];
}
void Mergesort(ll l, ll r)
{
    if(l < r){
        ll mid = (l + r) >> 1;
        Mergesort(l, mid);
        Mergesort(mid + 1, r);
        Merge(l, mid, r);
    }
}
int main()
{
    ll n = read();
    for(int i = 1; i <= n; i++) a[i] = read();
    Mergesort(1, n);
    write(ans);
    return 0; 
}

正常代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
typedef long long ll;
ll a[N], b[N], ans;
void Merge(ll l, ll mid, ll r)
{
    ll i = l, j = mid + 1, t = 0;
    while(i <= mid && j <= r){
        if(a[i] > a[j]){
            b[t++] = a[j++];
            ans += mid - i + 1;
        }
        else b[t++] = a[i++];
    }
    while(i <= mid) b[t++] = a[i++];
    while(j <= r) b[t++] = a[j++];
    for(int i = 0; i < t; i++) a[l + i] = b[i];
}
void Mergesort(ll l, ll r)
{
    if(l < r){
        ll mid = (l + r) >> 1;
        Mergesort(l, mid);
        Mergesort(mid + 1, r);
        Merge(l, mid, r);
    }
}
int main()
{
    ll n; scanf("%lld", &n);
    for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    Mergesort(1, n);
    printf("%lld", ans);
    return 0; 
}
2023/7/10 16:18
加载中...