QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#836031 | #9922. Mah-jong | ucup-team5243# | AC ✓ | 2483ms | 13596kb | C++17 | 4.3kb | 2024-12-28 16:09:36 | 2024-12-28 16:09:50 |
Judging History
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,我给组数据试试?
详细
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