QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#854183#9922. Mah-jongucup-team3691#TL 2681ms26156kbC++203.6kb2025-01-11 22:16:202025-01-11 22:16:20

Judging History

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

  • [2025-01-11 22:16:20]
  • 评测
  • 测评结果:TL
  • 用时:2681ms
  • 内存:26156kb
  • [2025-01-11 22:16:20]
  • 提交

answer

#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=50;
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;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 2681ms
memory: 26156kb

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...

output:


result: