QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#835522#9922. Mah-jongucup-team5318#WA 2939ms7924kbC++142.2kb2024-12-28 12:32:382024-12-28 12:32:39

Judging History

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

  • [2024-12-28 12:32:39]
  • 评测
  • 测评结果:WA
  • 用时:2939ms
  • 内存:7924kb
  • [2024-12-28 12:32:38]
  • 提交

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;
}

Details

Tip: Click on the bar to expand more detailed information

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'