QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#836031#9922. Mah-jongucup-team5243#AC ✓2483ms13596kbC++174.3kb2024-12-28 16:09:362024-12-28 16:09:50

Judging History

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

  • [2024-12-28 16:09:50]
  • 评测
  • 测评结果:AC
  • 用时:2483ms
  • 内存:13596kb
  • [2024-12-28 16:09:36]
  • 提交

answer

#ifdef NACHIA
#define _GLIBCXX_DEBUG
#else
#define NDEBUG
#endif
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using i64 = long long;
using u64 = unsigned long long;
#define rep(i,n) for(int i=0; i<int(n); i++)
const i64 INF = 1001001001001001001;
template<typename A> void chmin(A& l, const A& r){ if(r < l) l = r; }
template<typename A> void chmax(A& l, const A& r){ if(l < r) l = r; }
using namespace std;

int typeDiff[729][729] = {};
int typeTh[729][8] = {};
vector<int> typeQue[729];
int typePtr[729] = {};

long long solve(vector<vector<int>> block){
    if(block.empty()) return 0;
    //cout << " ----- " << endl;
    //for(auto& b : block){
    //    for(auto a : b) cout << a << " ";
    //    cout << endl;
    //}
    //cout << " ----- " << endl;

    int N = block.size();
    vector<int> typeEx;
    for(auto& a : block) typeEx.push_back(a[8]);
    sort(typeEx.begin(), typeEx.end());
    typeEx.erase(unique(typeEx.begin(), typeEx.end()), typeEx.end());
    //for(int i=N-1; i>=0; i--) typeQue[block[i][8]].push_back(i);
    rep(i,N) typeQue[block[i][8]].push_back(i);
    //for(int t : typeEx) typePtr[t] = typeQue[t].size();
    rep(t,729) typePtr[t] = 0;

    i64 ans = 0;

    for(int l=0; l<N; l++){
        //cout << " l = " << l << endl;
        for(int t : typeEx){
            int v = typeDiff[block[l][8]][t];
            while(typePtr[v] < N){
                //int r = typeQue[t][typePtr[t]-1];
                int r = typePtr[v];
                if(r <= l){ typePtr[v]++; continue; }
                //cout << " th = "; rep(a,8){ cout << typeTh[v][a] << " "; } cout << endl;
                bool ok = true;
                rep(a,8) if(typeTh[v][a] > block[r][a] - block[l][a]) ok = false;
                if(ok) break;
                //typePtr[t]--;
                typePtr[v]++;
            }
            //cout << "s = " << block[l][8] <<  " , t = " << t << " , v = " << v << " , #r = " << typePtr[v] << endl;
            //ans += typePtr[t];
            //cout << "   #r = " << (typeQue[t].end() - lower_bound(typeQue[t].begin(), typeQue[t].end(), typePtr[v])) << endl;
            ans += typeQue[t].end() - lower_bound(typeQue[t].begin(), typeQue[t].end(), typePtr[v]);
        }
    }

    for(int x : typeEx){ typeQue[x].clear(); }
    return ans;
}

i64 fast(vector<int> A){
    int N = A.size();
    vector<vector<vector<int>>> blocks(27); {
        vector<int> C(9);
        vector<int> D(9);
        int a = 0, b = 0, c = 0;
        blocks[0].push_back(D);
        rep(i,N){
            int x = A[i];
            if(x%3 == 1){ a += 1; b += 2; }
            if(x%3 == 2){ b += 1; c += 2; }
            if(x%3 == 0){ c += 1; a += 2; }
            a %= 3; b %= 3; c %= 3;
            C[x] += 2; C[x] %= 3;
            C[x-1] += 1; C[x-1] %= 3;
            D[x-1] += 1;
            int ty = 0;
            for(int k=5; k>=0; k--) ty = ty * 3 + C[k];
            D[8] = ty;
            blocks[a*9+b*3+c].push_back(D);
        }
    }
    i64 ans = 0;
    for(auto& block : blocks) ans += solve(move(block));
    return ans;
}

void testcase(){
    int N; cin >> N;
    vector<int> A(N); rep(i,N) cin >> A[i];
    cout << fast(move(A)) << "\n";
}

bool judge(vector<int> A){
    vector<int> C(8);
    for(auto a : A) C[a-1] += 1;
    rep(k,6) while(C[k] % 3) rep(f,3) C[k+f]--;
    rep(t,8) if(C[t] < 0) return false;
    for(int k=6; k<7; k++) if(C[k] % 3 != 0) return false;
    return true;
}

i64 naive(vector<int> A){
    i64 ans = 0;
    rep(i,A.size()) rep(j,A.size()+1) if(i < j && (j-i)%3 == 0){
        if(judge(vector<int>(A.begin()+i, A.begin()+j))) ans++;
    }
    return ans;
}

int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    {
        int base = 1;
        rep(k,6){
            rep(a,3) rep(b,3) if(a != 0 || b != 0){
                int c = (a+b)%3;
                rep(f,base) rep(g,base) typeDiff[f+a*base][g+c*base] = typeDiff[f][g]+b*base;
            }
            base *= 3;
        }
    }
    rep(i,729){
        vector<int> T(9);
        for(int a=i, b=0; b<6; b++){ T[b]=a%3; a/=3; }
        for(int t=5; t>=0; t--) T[t+3] = (T[t+3] + T[t]) % 3;
        rep(t,6) rep(k,3) typeTh[i][t+k] += T[t];
    }
    int T; cin >> T;
    rep(t,T) testcase();
    return 0;
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 5672kb

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: 0
Accepted
time: 768ms
memory: 6208kb

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:

51699
61486
5146
1960
241675
6274
11224
46170
435241
1219228
17198
139542
299436
960439
217729
1174
87401
141087
69813
1
78895
0
39510
16757
86551
0
100302
161956
3
512157
58619
196941
26116
61635
28879
11511
2061
4394
74620
907389
172780
23952
524
87857
1305332
1413
11784
156368
11746
23217
25189
9...

result:

ok 100 numbers

Test #3:

score: 0
Accepted
time: 2483ms
memory: 13056kb

input:

1
100000
7 6 3 7 1 2 5 2 4 5 3 2 6 2 2 2 5 6 5 8 6 2 1 8 2 2 1 1 4 8 2 6 4 1 8 6 6 7 8 4 4 5 4 7 8 6 2 3 3 7 5 7 1 1 3 5 2 8 5 6 3 6 2 3 3 8 4 5 7 8 1 5 6 1 3 4 5 7 1 5 4 4 4 6 6 4 2 3 5 2 7 3 5 8 7 1 5 4 5 4 1 5 8 7 2 2 8 2 4 3 5 7 6 6 1 6 6 3 1 1 3 1 7 8 1 7 3 7 8 3 6 3 5 7 5 1 8 7 4 7 5 4 8 1 3 4...

output:

555222305

result:

ok 1 number(s): "555222305"

Test #4:

score: 0
Accepted
time: 1245ms
memory: 6424kb

input:

20
4413
3 6 4 7 7 2 2 7 8 8 4 1 8 6 6 4 7 3 4 3 2 4 2 3 8 2 2 8 4 2 2 8 6 3 3 6 2 3 3 1 7 3 4 2 8 6 3 2 7 6 2 1 5 7 6 8 4 2 1 8 5 4 1 1 2 4 7 4 5 8 2 1 7 1 1 2 2 2 4 6 7 5 4 7 2 6 7 4 8 6 5 8 8 1 5 1 7 8 1 2 2 8 5 1 8 2 4 2 6 1 3 2 1 7 4 4 7 8 5 8 7 4 6 7 4 1 7 8 6 8 7 7 8 4 6 8 3 6 4 8 2 3 7 5 4 4 ...

output:

1069083
436006
1777187
5525353
859904
20447
1921397
11322
113761
632458
911481
140310
5527193
391225
3870234
1392311
5521780
767038
377958
251269

result:

ok 20 numbers

Test #5:

score: 0
Accepted
time: 1874ms
memory: 7272kb

input:

10
1631
1 5 6 3 1 3 3 1 7 3 2 2 1 2 3 4 6 3 7 4 4 2 5 1 3 1 8 6 8 6 6 4 3 3 3 5 1 5 4 3 2 6 5 7 4 4 3 2 6 7 3 7 6 6 1 7 4 3 2 4 5 2 3 6 8 6 7 1 4 5 4 5 1 7 6 5 2 2 3 8 1 1 6 3 3 8 5 6 8 2 3 2 4 4 6 1 1 7 2 6 3 1 4 1 2 5 7 4 4 6 3 8 8 8 1 1 3 8 8 6 7 6 3 2 8 2 1 6 5 5 4 4 5 3 2 5 7 8 7 5 8 8 1 2 1 4 ...

output:

142582
130392
26184001
1706964
29530837
7819026
1889862
2047254
4622629
9958898

result:

ok 10 numbers

Test #6:

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

input:

100
699
3 5 4 4 2 2 2 4 4 5 4 4 4 2 3 5 4 3 3 4 2 4 5 1 2 2 1 3 4 2 3 5 2 4 4 4 4 4 2 2 2 3 2 4 4 3 5 1 1 1 1 1 5 3 2 2 2 4 1 2 4 5 4 3 4 4 3 1 2 1 2 2 5 2 4 2 3 2 3 1 2 3 1 3 1 4 1 1 2 3 4 4 4 5 5 1 1 1 4 2 4 5 2 4 4 2 2 1 4 3 2 4 2 1 3 3 1 1 1 2 3 2 3 3 4 5 3 1 4 3 2 3 4 1 2 3 1 5 4 1 3 1 4 1 1 4 ...

output:

26614
93607
15542
185945
9610
336083
27587
5973
15452
428708
697
64714
259
21
828
113476
31140
105458
80
23536
5525
1159
12042
40221
3480
19417
67593
2269
413557
158230
35791
252920
14694
17018
49089
181
5249
132040
80726
799827
70851
176451
195473
5082
17942
474031
966
2197
7165
361668
165329
13748...

result:

ok 100 numbers

Test #7:

score: 0
Accepted
time: 107ms
memory: 6536kb

input:

20
6438
6 4 6 2 2 3 6 3 3 6 3 5 2 3 5 3 4 4 6 6 5 4 4 4 6 5 2 3 6 6 6 2 4 2 6 3 2 6 4 4 5 5 5 5 2 3 5 6 3 5 2 3 2 3 6 2 6 4 5 6 6 3 6 2 4 6 6 2 2 5 2 5 3 2 2 5 3 5 2 5 4 4 6 5 6 5 3 2 2 6 6 4 4 6 6 5 3 5 2 3 6 4 6 2 6 2 4 2 5 2 3 2 6 4 3 6 2 2 6 5 2 2 4 6 4 2 2 6 6 2 5 5 6 3 5 4 2 4 6 5 5 2 5 2 5 2 ...

output:

2295109
129235
937429
180801
809871
174359
1198354
743354
795518
130580
84599
3763780
1614768
2235523
4161333
5544144
349912
421552
4172118
5545527

result:

ok 20 numbers

Test #8:

score: 0
Accepted
time: 112ms
memory: 7828kb

input:

10
26316
4 3 2 6 6 5 6 4 2 6 3 6 3 6 6 4 5 2 6 5 4 4 5 4 5 3 3 4 3 6 3 2 2 2 2 2 4 2 5 3 5 4 3 6 5 5 2 4 4 4 3 5 3 3 3 5 3 5 3 4 3 6 6 3 2 4 5 4 4 3 3 6 5 6 2 2 2 3 6 2 3 2 3 2 4 5 3 5 3 2 6 2 2 2 6 4 6 6 4 6 6 6 5 2 4 6 3 5 2 3 4 3 5 5 3 3 5 2 2 4 6 2 5 6 4 6 3 5 3 3 3 2 2 3 4 5 2 5 2 2 5 5 3 3 2 5...

output:

38450451
2276831
7270246
704368
5850869
468608
9764821
13710579
4255399
96369

result:

ok 10 numbers

Test #9:

score: 0
Accepted
time: 131ms
memory: 12700kb

input:

1
100000
7 8 8 5 4 7 7 4 4 7 6 8 5 8 8 6 6 4 8 8 6 8 7 8 4 4 7 4 8 7 4 6 6 5 5 6 8 5 6 4 5 6 6 4 4 7 7 5 4 5 8 4 7 5 7 7 8 8 7 8 6 4 8 5 7 8 5 4 4 4 7 7 4 5 7 4 4 6 6 7 6 6 7 7 4 4 4 6 6 4 6 8 5 6 6 5 7 8 5 7 5 7 6 4 6 6 4 7 5 8 6 7 4 6 8 7 4 7 7 6 6 8 5 4 6 7 5 4 4 4 6 6 6 5 4 6 4 6 8 6 5 5 5 5 7 5...

output:

555459907

result:

ok 1 number(s): "555459907"

Test #10:

score: 0
Accepted
time: 25ms
memory: 6416kb

input:

100
1250
5 6 6 6 5 6 6 5 7 6 6 6 5 7 5 5 6 6 7 5 5 5 5 5 5 7 5 5 6 5 5 5 6 7 5 6 5 7 7 7 7 5 5 7 6 5 7 7 5 6 6 5 5 6 6 7 5 6 6 6 6 6 5 7 5 7 7 5 5 6 5 6 6 7 7 7 7 7 7 5 5 6 6 5 5 6 6 6 5 5 5 5 7 6 6 7 7 5 5 7 5 7 5 7 7 6 6 5 7 6 5 6 5 7 6 5 6 7 6 6 6 6 6 6 7 5 6 7 6 7 7 5 7 7 5 5 6 6 5 5 7 6 6 6 6 7...

output:

86841
34629
45
25861
17828
47611
4229
10999
3019
7915
174644
150587
1388747
931
8024
1143
15819
282708
204457
30072
5134
116143
519353
149357
40372
2405
259501
15816
5574
104552
24707
223938
415556
4003
3687
43
0
69380
19410
121396
5303
100311
811
18848
81468
2
5204
635
107048
152629
39533
13647
168...

result:

ok 100 numbers

Test #11:

score: 0
Accepted
time: 24ms
memory: 6588kb

input:

20
4135
6 8 6 7 7 7 7 8 7 6 6 8 6 7 8 7 7 8 7 8 7 8 6 6 7 8 7 8 6 8 6 6 6 7 7 6 6 8 6 6 8 7 7 8 6 7 8 7 8 6 6 6 8 8 7 7 8 6 6 6 7 7 7 7 7 8 7 6 7 6 7 6 8 8 6 7 6 8 7 6 7 6 6 7 7 6 8 7 8 7 6 7 8 7 6 8 6 6 8 6 6 6 7 6 8 8 8 6 7 7 6 8 7 6 7 8 8 6 8 6 6 8 7 6 6 7 6 8 7 8 6 8 7 6 6 8 6 6 6 8 6 6 8 7 7 8 ...

output:

950096
2194477
5554824
81254
5553178
1573274
194238
668
1982043
58228
1291767
5557012
58027
5225
1463164
4280005
609999
1655471
62184
2077822

result:

ok 20 numbers

Test #12:

score: 0
Accepted
time: 11ms
memory: 7444kb

input:

10
15064
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5...

output:

37818172
46634876
15400026
2035255
27812
69660
92555465
15265745
4010655
42669333

result:

ok 10 numbers

Test #13:

score: 0
Accepted
time: 17ms
memory: 13596kb

input:

1
100000
8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8...

output:

1666650000

result:

ok 1 number(s): "1666650000"

Test #14:

score: 0
Accepted
time: 0ms
memory: 5956kb

input:

4
1
5
2
5 6
3
7 6 5
3
7 7 7

output:

0
0
1
1

result:

ok 4 number(s): "0 0 1 1"

Test #15:

score: 0
Accepted
time: 8ms
memory: 13412kb

input:

1
100000
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5...

output:

1666650000

result:

ok 1 number(s): "1666650000"

Test #16:

score: 0
Accepted
time: 11ms
memory: 6180kb

input:

10
1686
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ...

output:

473485
16665000
16665000
2028272
16665000
16665000
16665000
1238058
9559650
11134350

result:

ok 10 numbers

Test #17:

score: 0
Accepted
time: 38ms
memory: 12860kb

input:

1
100000
2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3...

output:

885341676

result:

ok 1 number(s): "885341676"

Test #18:

score: 0
Accepted
time: 15ms
memory: 6936kb

input:

10
3465
2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 ...

output:

1038578
2938
813044
30782
8661003
8661003
5290235
8661003
5108993
6641544

result:

ok 10 numbers

Extra Test:

score: 0
Extra Test Passed