进食后人 从100pts-40pts真实案例
查看原帖
进食后人 从100pts-40pts真实案例
1054952
zzCX_df楼主2025/7/28 14:54

以前:

#include <bits/stdc++.h>
typedef long long ll;

using namespace std;

const int N = 110000, P = 10007;
int n, m, a[N], c[N];
ll ans, s[N], s1[N], s2[N], col[N], num[N][2], sum[N][2], cnt[N][2], ss[N][2]; 

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d", &c[i]);
    for (int i = n - 2; i; i--) {
        sum[c[i + 2]][i & 1] += 0LL + a[i + 2];
        sum[c[i + 2]][i & 1] %= P;
        s1[i] = sum[c[i]][i & 1];
        cnt[c[i + 2]][i & 1] += 0LL + i + 2;
        cnt[c[i + 2]][i & 1] %= P;
        s2[i] = cnt[c[i]][i & 1];
        ss[c[i + 2]][i & 1] += 1LL * (i + 2) * a[i + 2];
        ss[c[i + 2]][i & 1] %= P;
        s[i] = ss[c[i]][i & 1];
        num[c[i + 2]][i & 1]++;
        col[i] = num[c[i]][i & 1];
    }
    for (int i = 1; i <= n; i++) if (s2[i])
        ans += 1LL * col[i] * i * a[i] + s[i] + 1LL * i * s1[i] + 1LL * a[i] * s2[i], ans %= P;
    printf("%lld\n", ans);
    return 0;
}

/* (x + z) * (a[x] + a[z])
x * a[x] + z * a[z] + z * a[x] + x * a[z]

i * ((c[i + 2] == c[i]) * a[i + 2] + a[i + 4] + ……) + a[i] * (i + 2 + i + 4 + ……)

15 4
5 108 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 "4" 3 3 2 4 4 4 4 1 1 1


5 10 9 8 10 12


(5 + 9) * (a[5] + a[9]) + (5 + 11) * (a[5] + a[11])

5 * a[5] + 5 * a[5]
*/

Now:

#include <bits/stdc++.h>
typedef long long ll;

using namespace std;

const int N = 110000, P = 10007;
int n, m, a[N], c[N];
ll ans, s[N], s1[N], s2[N], col[N], num[N][2], sum[N][2], cnt[N][2], ss[N][2]; 

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++)
        scanf("%d", &c[i]);
    for (int i = n - 2; i; i--) {
        sum[c[i + 2]][i & 1] += 0LL + a[i + 2];
        // sum[c[i + 2]][i & 1] %= P;
        s1[i] = sum[c[i]][i & 1];
        cnt[c[i + 2]][i & 1] += 0LL + i + 2;
        // cnt[c[i + 2]][i & 1] %= P;
        s2[i] = cnt[c[i]][i & 1];
        ss[c[i + 2]][i & 1] += 1LL * (i + 2) * a[i + 2];
        // ss[c[i + 2]][i & 1] %= P;
        s[i] = ss[c[i]][i & 1];
        num[c[i + 2]][i & 1]++;
        col[i] = num[c[i]][i & 1];
    }
    for (int i = 1; i <= n; i++) if (s2[i])
        ans += 1LL * col[i] * i * a[i] + s[i] + 1LL * i * s1[i] + 1LL * a[i] * s2[i];
    printf("%lld\n", ans % P);
    return 0;
}

/* (x + z) * (a[x] + a[z])
x * a[x] + z * a[z] + z * a[x] + x * a[z]

i * ((c[i + 2] == c[i]) * a[i + 2] + a[i + 4] + ……) + a[i] * (i + 2 + i + 4 + ……)

15 4
5 108 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 "4" 3 3 2 4 4 4 4 1 1 1


5 10 9 8 10 12


(5 + 9) * (a[5] + a[9]) + (5 + 11) * (a[5] + a[11])

5 * a[5] + 5 * a[5]
*/

qwq

2025/7/28 14:54
加载中...