QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#848651 | #9922. Mah-jong | isWFnoya | WA | 1434ms | 8436kb | C++23 | 2.8kb | 2025-01-09 00:45:23 | 2025-01-09 00:45:23 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=729;
typedef long long ll;
typedef pair<ll,ll> PII;
int n,m,k;
ll a[N],c[N],tg[N],dep[N];
array<int,8> b[1010];
// char s[N];
vector<int> e[N];
int now[10],now2[10];
array<int,8> s[N];
int p[N];
void dfs(int x){
if(x==6){
int state=0;
for(int i=5;i>=0;i--) state=state*3+c[i];
for(int i=0;i<6;i++){
for(int u=1;u<=c[i];u++)
{
b[state][i]++;
b[state][i+1]++;
b[state][i+2]++;
}
}
// tg[state]=0;
// for(int i=7;i>=0;i--){
// tg[state]=tg[state]*3+(b[state][i]%3);
// }
// cout<<state<<endl;
// able.insert(state);
}else{
for(int i=0;i<3;i++){
c[x]=i;
dfs(x+1);
}
}
}
int query(array<int,8> ar,int state){
if(s[e[state].back()]>=ar) return e[state].size()-1;
int l=0,r=e[state].size()-1;
while(l<r){
int mid=l+r+1>>1;
if(s[e[state][mid]]>=ar) l=mid;
else r=mid-1;
}
// if(l>0) cout<<"--"<<l<<endl;
return l;
}
void __(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]--;
}
array<int,8> ar;
for(int i=0;i<8;i++) ar[i]=0;
s[0]=ar;
memset(now,0,sizeof now);
for(int i=1;i<=n;i++){
ar[a[i]]++;
s[i]=ar;
// cout<<s[i]<<" ";
}
for(int i=0;i<=M*10;i++){
e[i].clear();
array<int,8> res;
for(int j=0;j<8;j++) res[j]=1e9;
s[n+1]=res;
e[i].push_back(n+1);
}
// cout<<endl;
ll ans=0;
for(int i=0;i<M;i++) p[i]=0;
for(int i=n;i>=0;i--){
for(int j=0;j<M;j++){
array<int,8> nw;
int t=j;
for(int k=0;k<8;k++){
nw[k]=(s[i][k]+b[j][k]%3)%3;
t/=3;
}
int state=0;
for(int k=7;k>=0;k--) state=state*3+nw[k];
// if(j==1){
// for(int k=0;k<8;k++) cout<<s[i][k]<<" ";
// cout<<endl;
// for(int k=0;k<8;k++) cout<<nw[k]<<" ";
// cout<<endl;
// cout<<endl;
// }
array<int,8> least;
for(int k=0;k<8;k++) least[k]=s[i][k]+b[j][k];
ll tt=query(least,state);
ans+=tt;
// if(tt>0) cout<<i<<" "<<j<<" "<<tt<<endl;
}
int state=0;
for(int j=7;j>=0;j--) state=state*3+s[i][j]%3;
e[state].push_back(i);
}
printf("%lld\n",ans);
}
//2*1 1*2
//2 2 2
int main(){
dfs(0);
// cout<<able.size()<<endl;
int _=1;
cin>>_;
while(_--){
__();
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 2ms
memory: 6240kb
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: 1434ms
memory: 8436kb
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:
53199 63610 5515 2223 245098 6693 11897 47620 439459 1227355 18280 141843 303882 967724 220810 1422 89694 143500 71577 1 80804 0 41058 17671 88385 0 102610 164722 14 516830 60353 199568 27396 63461 30143 12196 2292 4925 76565 913884 176144 25166 742 90163 1313432 1702 12516 159136 12567 24328 26351 ...
result:
wrong answer 1st numbers differ - expected: '51699', found: '53199'