QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#835522 | #9922. Mah-jong | ucup-team5318# | WA | 2939ms | 7924kb | C++14 | 2.2kb | 2024-12-28 12:32:38 | 2024-12-28 12:32:39 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e5+5,M=15,K=1e4+5,S=(1<<8)+5;
int T,n,a[N];
int st[K][9],iscor[K][S],tot,b[10],d[10];
map<vector<int>,int>mp;
void dfs1(int step) {
if(step==9) {
for(int i=0;i<(1<<8);i++) {
for(int j=1;j<=8;j++)b[j]=((i>>j-1)&1)*3+a[j];
for(int i=1;i<=9;i++)d[i]=b[i]-b[i-1];
if((d[1]+d[4]+d[7])!=0)continue;
if((d[2]+d[5]+d[8])!=0)continue;
if((d[3]+d[6]+d[9])!=0)continue;
if(d[1]<0 || d[2]<0 || d[3]<0 || d[7]>0 || d[8]>0 || d[9]>0)continue;
vector<int>now(8);
for(int i=1;i<=8;i++)now[i-1]=a[i];
if(!mp.count(now)) {
tot++,mp[now]=tot;
for(int j=1;j<=8;j++)st[tot][j]=a[j];
}
int ns=mp[now];
iscor[ns][i]=1;
}
return ;
}
for(int i=0;i<3;i++)a[step]=i,dfs1(step+1);
}
void init() {
dfs1(1);
//for(int i=1;i<=tot;i++)
//{
// for(int j=0;j<8;j++)cout<<st[i][j+1]<<" ";cout<<endl;
//}
for(int i=1;i<=tot;i++)
for(int j=0;j<8;j++)for(int k=0;k<(1<<8);k++)if((k>>j)&1)iscor[i][k]|=iscor[i][k^(1<<j)];
}
vector<int>pos[K];
int sum[N][9],L[K];
void solve() {
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=0;i<=1e4;i++)pos[i].clear(),L[i]=n+1;
for(int i=0;i<=n;i++) {
if(i>0) {
for(int j=1;j<=8;j++)sum[i][j]=sum[i-1][j];
sum[i][a[i]]++;
}
vector<int>now(8);int st=0;
for(int j=1;j<=8;j++)now[j-1]=sum[i][j]%3,st=st*3+now[j-1];
pos[st].push_back(i);
}
ll ans=0;
for(int i=n;i;i--) {
for(int j=1;j<=tot;j++) {
while(L[j]>i+1) {
int S=0;
for(int k=1;k<=8;k++)S|=(sum[L[j]-1][k]-sum[i-1][k]>=3+st[j][k])<<k-1;
//if(i==1 && j==389)cerr<<S<<endl;
if(iscor[j][S])L[j]--;else break;
}
vector<int>now(8);
int vv=0;
for(int k=1;k<=8;k++)now[k-1]=(st[j][k]+sum[i-1][k]+3)%3;
for(int k=0;k<8;k++)vv=vv*3+now[k];
auto&c=pos[vv];
//if(i==1 && j==389)
//{
// cerr<<L[j]<<" "<<c.size()<<"\n";
//}
//cerr<<i<<' '<<j<<' '<<L[j]<<' '<<c.size()<<'\n';
ans+=c.end()-lower_bound(c.begin(),c.end(),L[j]);
//cerr<<ans<<'\n';
}
}cout<<ans<<'\n';
}
int main() {
#ifndef ONLINE_JUDGE
freopen(".in","r",stdin);
freopen(".out","w",stdout);
#endif
init();
scanf("%d",&T);
while(T--)solve();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 23ms
memory: 7924kb
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: 2939ms
memory: 6312kb
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:
46314 54898 4659 1758 215633 5614 10027 41243 386994 1085808 15322 124683 266584 854105 193880 1066 77860 125686 62124 1 70492 0 35237 15042 77163 0 89573 144900 3 455759 52337 175353 23328 54988 26015 10319 1853 4002 66562 807866 153689 21353 487 78172 1161220 1277 10594 139447 10572 20814 22488 87...
result:
wrong answer 1st numbers differ - expected: '51699', found: '46314'