QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876126#9922. Mah-jongCirnoNineWA 1328ms3968kbC++232.3kb2025-01-30 17:29:482025-01-30 17:29:48

Judging History

你现在查看的是最新测评结果

  • [2025-01-30 17:29:48]
  • 评测
  • 测评结果:WA
  • 用时:1328ms
  • 内存:3968kb
  • [2025-01-30 17:29:48]
  • 提交

answer

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

#define ull unsigned long long
#define int long long
#define pii pair<int,int>

struct P {
    array<int,8> c;

    P() {
        for (auto &x : c) {
            x = 0;
        }
    }

    int val() {
        int ans = 0;
        int k = 1;
        for (int i = 0; i < 8; i++) {
            ans += k*c[i];
            k*=3;
        }
        return ans;
    }

    void clear() {
        fill(c.begin(), c.end(), 0);
    }

    bool exist() {
        for (auto x : c) {
            if (x < 0) return 0;
        }
        return 1;
    }

    P change() {
        P tmp;
        for (int i = 0; i < 8; i++) {
            tmp.c[i] = c[i]%3;
        }
        return tmp;
    }

    P operator-(P &t) {
        P tmp;
        for (int i = 0; i < 8; i++) {
            tmp.c[i] = c[i]-t.c[i];
        }
        return tmp;
    }

    const bool operator<(P &t) {
        return c < t.c;
    }
};

vector<P> vt;

void init() {
    P p;
    for (int i = 0; i < 729; i++) {
        int tmp = i;
        p.clear();
        for (int j = 0; j < 6; j++) {
            int q = tmp%3;
            for (int k = j; k < j+3; k++) {
                p.c[k]+=q;
            }
            tmp/=3;
        }
        // for (auto x : p.c) {
        //     cout << x << " ";
        // }
        // cout << endl;
        vt.push_back(p);
    }
}

void solve() {
    int n;
    cin >> n;
    vector<int> a(n+9);
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        a[i]--;
    }
    int ans = 0;
    vector<int> mp(6561,0);
    P p;
    mp[p.val()]++;
    for (int i = 1; i <= n; i++) {
        p.c[a[i]]++;
        //cout << i << endl;
        for (auto p2 : vt) {
            auto t = p-p2;
            if (!t.exist()) continue;
            t = t.change();
            // for (auto x : t.c) {
            //     cout << x << " ";
            // }
            // cout << endl;
            // cout << "mp:" << mp[t.c] << endl;
            ans += mp[t.val()];
        }
        mp[p.change().val()]++;
    }
    cout << ans << endl;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    init();
    int t = 1;
    cin >> t;
    for (int i = 0; i < t; i++) {
        solve();
    }
    return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 3712kb

input:

5
4
1 1 1 1
6
1 2 3 1 2 3
7
6 5 8 7 6 3 2
8
1 2 1 2 1 2 1 3
9
2 2 4 4 1 1 1 3 3

output:

2
5
1
3
2

result:

ok 5 number(s): "2 5 1 3 2"

Test #2:

score: -100
Wrong Answer
time: 1328ms
memory: 3968kb

input:

100
992
8 1 8 1 2 3 6 6 1 3 1 8 7 7 4 7 7 1 6 6 4 8 3 7 3 5 1 4 4 7 5 7 5 7 4 3 7 5 2 8 7 1 6 3 6 2 4 3 2 3 1 6 3 1 3 2 6 6 7 4 6 1 1 4 6 4 7 7 8 5 6 4 1 5 4 8 2 4 4 2 1 3 5 7 6 8 3 7 6 6 5 6 4 2 5 4 3 7 3 5 5 3 3 2 7 8 2 7 2 4 4 3 4 1 1 3 5 5 4 6 3 3 3 2 6 1 2 6 4 8 8 6 6 8 7 3 1 1 8 8 7 2 5 6 3 5 ...

output:

54611
65045
5863
2450
248073
7119
12431
48687
443481
1233932
19142
143983
306768
973691
223671
1693
91315
145847
73072
1
82628
0
42058
18421
90267
0
104563
167091
3
521177
61750
202416
28257
64928
31123
12820
2493
5247
78104
919402
178810
26044
870
91985
1320319
1840
13119
161273
12933
25118
27138
1...

result:

wrong answer 1st numbers differ - expected: '51699', found: '54611'