QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#854190 | #9922. Mah-jong | ucup-team3691# | TL | 2726ms | 26112kb | C++20 | 3.7kb | 2025-01-11 22:17:25 | 2025-01-11 22:17:36 |
Judging History
answer
#pragma GCC optimize("O3")
#pragma GCC optimize("avx2")
#include <bits/stdc++.h>
using namespace std;
int cnt=0;
int v[100001];
int b[9];
int stare[730][10];
int sumus[730];
//int aricifrecarici[6000000];
const int bulan=40;
void bkt(int poz)
{
if(poz==7)
{
for(int i=1;i<=8;i++)
{
b[i]=0;
}
for(int i=1;i<=6;i++)
{
b[i]+=v[i];
b[i+1]+=v[i];
b[i+2]+=v[i];
}
cnt++;
for(int i=1;i<=8;i++)
{
stare[cnt][i]=b[i];
sumus[cnt]=sumus[cnt]*7+b[i];
}
//aricifrecarici[sumus[cnt]]++;
return;
}
for(int i=0;i<=2;i++)
{
v[poz]=i;
bkt(poz+1);
}
}
int f[9];
int f2[9];
int pow7[9];
int fremask[6000000];
void bktadd(int poz,int sum,int semn)
{
if(poz==9)
{
fremask[sum]+=semn;
return;
}
bktadd(poz+1,sum*7+f[poz],semn);
if(f[poz]>=3)
{
f[poz]-=3;
bktadd(poz+1,sum*7+f[poz],semn);
f[poz]+=3;
}
if(f[poz]>=6)
{
f[poz]-=6;
bktadd(poz+1,sum*7+f[poz],semn);
f[poz]+=6;
}
}
long long divide(int st,int dr)
{
int i,j,kuk;
long long rez=0;
if(dr-st<=bulan)
{
int fre[10];
int fre2[10];
for(i=st;i<=dr;i++)
{
for(j=1;j<=8;j++)
{
fre[j]=0;
}
for(j=i;j<=dr;j++)
{
fre[v[j]]++;
if((j-i)%3==2)
{
int pos=1;
memmove(&(fre2[1]), &(fre[1]), sizeof(int) * 8);
for(int z=1;z<=6;z++)
{
if(fre2[z]<0)
{
pos=0;
break;
}
fre2[z]=fre2[z]%3;
fre2[z+1]-=fre2[z];
fre2[z+2]-=fre2[z];
}
if(fre2[7]%3==0 && fre2[8]%3==0 && fre2[7]>=0 && fre2[8]>=0)
{
rez+=pos;
}
}
}
}
return rez;
}
int mij=(st+dr)/2;
for(i=1;i<=8;i++)
{
f[i]=0;
}
bktadd(1,0,1);
for(i=mij+1;i<=dr;i++)
{
f[v[i]]++;
if(f[v[i]]>=7)
{
f[v[i]]-=3;
}
bktadd(1,0,1);
}
for(int st2=1;st2<=729;st2++)
{
for(j=1;j<=8;j++)
f2[j]=0;
int suma=sumus[st2];
for(i=mij;i>=st;i--)
{
f2[v[i]]++;
suma-=pow7[v[i]];
if(f2[v[i]]>stare[st2][v[i]])
{
suma+=3*pow7[v[i]];
f2[v[i]]-=3;
}
rez+=fremask[suma];
}
}
for(i=1;i<=8;i++)
{
f[i]=0;
}
bktadd(1,0,-1);
for(i=mij+1;i<=dr;i++)
{
f[v[i]]++;
if(f[v[i]]>=7)
{
f[v[i]]-=3;
}
bktadd(1,0,-1);
}
rez=rez+divide(st,mij-1);
rez=rez+divide(mij+1,dr);
return rez;
}
int main()
{
long long n,i,j,k,l,r,op,t,bestcase,m,mmax;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>t;
bkt(1);
pow7[8]=1;
for(i=7;i>=1;i--)
{
pow7[i]=pow7[i+1]*7;
}
for(op=1;op<=t;op++)
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>v[i];
}
cout<<divide(1,n)<<'\n';
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 1ms
memory: 3644kb
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: 2726ms
memory: 26112kb
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: -100
Time Limit Exceeded
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...