很奇怪
查看原帖
很奇怪
669257
Guanine_Cyclonus楼主2022/8/15 10:04

为什么把数组a的类型改成long long才能过

35分代码:(sub1 WA, sub4和sub5除了第三个数据点以外全部WA)

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 10; // Set a right value according to your solution.
int n, a[MAXN + 10];
unsigned long long ans = 0;
namespace Generator {

unsigned long long k1, k2;
int thres;

inline unsigned long long xorShift128Plus() {
    unsigned long long k3 = k1, k4 = k2;
    k1 = k4, k3 ^= (k3 << 23), k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
    return k2 + k4;
}

inline void generate() {
    for (int i = 1; i <= n; ++i) {
        a[i] = xorShift128Plus() % thres;
    }
}

} // namespace Generator.

int main() {
    scanf("%d", &n);
    scanf("%llu %llu %d", &Generator::k1, &Generator::k2, &Generator::thres);
    Generator::generate();
    // Now array a[1..n] represents the sequence A in the statement.
    int i = 1;
    while (i <= n) {
        int tmp, p, end = i, value = a[i];
        for (p = i; p <= n; p++) {
            if (a[p] < a[i]) {
                if (a[p] <= value) value = a[p], end = p;
            }
        }
        tmp = a[i]; a[i] = value; a[end] = tmp;
        i = end + 1;
    }
    for (int j = 1; j <= n; j++) {
        ans += j * a[j];
    }
    printf("%llu\n", ans);
    return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 10; // Set a right value according to your solution.
int n; unsigned long long a[MAXN + 10];
unsigned long long ans = 0;
namespace Generator {

unsigned long long k1, k2;
int thres;

inline unsigned long long xorShift128Plus() {
    unsigned long long k3 = k1, k4 = k2;
    k1 = k4, k3 ^= (k3 << 23), k2 = k3 ^ k4 ^ (k3 >> 17) ^ (k4 >> 26);
    return k2 + k4;
}

inline void generate() {
    for (int i = 1; i <= n; ++i) {
        a[i] = xorShift128Plus() % thres;
    }
}

} // namespace Generator.

int main() {
    scanf("%d", &n);
    scanf("%llu %llu %d", &Generator::k1, &Generator::k2, &Generator::thres);
    Generator::generate();
    // Now array a[1..n] represents the sequence A in the statement.
    int i = 1;
    while (i <= n) {
        int tmp, p, end = i, value = a[i];
        for (p = i + 1; p <= n; p++) {
            if (a[p] < a[i]) {
                if (a[p] <= value) value = a[p], end = p;
            }
        }
        tmp = a[i]; a[i] = value; a[end] = tmp;
        i = end + 1;
    }
    for (int j = 1; j <= n; j++) 
        ans += j * a[j];
    printf("%llu\n", ans);
    return 0;
}

明明数据范围不会爆int的

2022/8/15 10:04
加载中...