QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#863241#9745. 递增序列xjt05WA 73ms8016kbC++234.0kb2025-01-19 15:03:492025-01-19 15:03:59

Judging History

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

  • [2025-01-19 15:03:59]
  • 评测
  • 测评结果:WA
  • 用时:73ms
  • 内存:8016kb
  • [2025-01-19 15:03:49]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200050;

ll a[N];
ll b[N][66];//1---62位
int jd[N];//equal=1,smaller==2,2会往下传
/*
1--->规则
2--->任意
*/
ll tmp[N];
int n;
bool check(ll x){
	for(int i=1;i<=n;i++){
		tmp[i]=a[i] ^ x;
	}
	for(int i=2;i<=n;i++){
		if(b[i]<b[i-1]){
			return 0;
		}
	}
	return 1;
}
ll ans[66]={0};//几种情况
ll num[66]={0};//数字是几
ll kk[66];//数字是几
ll dp[66][3]={0};//必须0,必须1,可任意
void solve(){
	ll k;
	scanf("%d %lld",&n,&k);
	for(int i=1;i<=64;i++){
		ans[i]=0;
		num[i]=-1;
		kk[i]=0;
	}
	for(ll i=1;i<=n;i++)
	{
		for(ll j=0;j<=62;j++)b[i][j]=0;
	}
	ll ktmp=k;
	int kp=1;
	while(k){
		kk[65-kp]=k%2;
		k/=2;
		kp++;
	}
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		jd[i]=1;
		ll x=a[i];
		int j=1;
		while(x){
			b[i][65-j]=x%2;
			x/=2;
			j++;
		}
	}	
	if(n==1){
		printf("%lld",ktmp+1ll);
		return ;
	}
	if(ktmp==0){
		if(check(0)){
			printf("1");
		}else{
			printf("0");
		}
		return ;
	}
	//j==1是equal
	for(int j=2;j<=64;j++){
		for(int i=2;i<=n;i++){
			if(jd[i]==2){//jd[i]传递
				if(ans[j]==0){
					ans[j]=2;//初次
				}else{
					ans[j]=min(2ll,ans[j]);//<传递
				}
			}else{//
				int need;
				if(b[i][j]==b[i-1][j]){
					jd[i]=1;
					if(ans[j]==0){
						ans[j]=2;
					}else{
						ans[j]=min(ans[j],2ll);
					}
				}else{
					jd[i]=2;
					if(b[i][j]>b[i-1][j]){
						if(ans[j]==0){
							ans[j]=1;
							num[j]=0;
						}else if(ans[j]==2){
							ans[j]=1;
							num[j]=0;
						}else{//ans[j]==1
							if(num[j]!=0){//不符
								printf("0");
								return ;
							}
						}
					}else{//b[i][j]<b[i-1][j]
						if(ans[j]==0){
							ans[j]=1;
							num[j]=1;
						}else if(ans[j]==2){
							ans[j]=1;
							num[j]=1;
						}else{//ans[j]==1
							if(num[j]!=1){//不符
								printf("0");
								return ;
							}
						}
					}
				}
			}
		}
	}
	dp[1][0]=1;
	dp[1][1]=0;
	dp[1][2]=0;
//	dp[55][0]=1;
//	dp[55][1]=0;
//	dp[55][2]=0;
	for(int i=2;i<=64;i++){
		if(ans[i]==2){
			if(kk[i]==0){
				if(dp[i-1][2]>0){
					dp[i][2]=dp[i-1][2]*2ll;
					dp[i][1]=0;
					dp[i][0]=dp[i-1][1]+dp[i-1][0];
				}else{
					dp[i][2]=0;
					dp[i][1]=0;
					dp[i][0]=(dp[i-1][1]+dp[i-1][0]);
				}
			}else{
				if(dp[i-1][2]>0){
					dp[i][2]=(dp[i-1][2])*2ll+dp[i-1][0]+dp[i-1][1];//这一位填0
					dp[i][1]=dp[i-1][1]+dp[i-1][0];
					dp[i][0]=0;
				}else{
					dp[i][2]=dp[i-1][1]+dp[i-1][0];//这一位取0变任意
					dp[i][0]=0;
					dp[i][1]=dp[i-1][1]+dp[i-1][0];
				}
			}
		}else if(ans[i]==1){
			if(num[i]==1){//必须1
				if(kk[i]==0){
					if(dp[i-1][2]>0){
						dp[i][2]=dp[i-1][2];
						dp[i][1]=0;
						dp[i][0]=0;
					}else{
						printf("0");
						return ;
					}
				}else{//kk=1,必须1
					if(dp[i-1][2]>0){
						dp[i][2]=dp[i-1][2];	
						dp[i][1]=dp[i-1][1]+dp[i-1][0];
						dp[i][0]=0;
					}else{
						dp[i][2]=0;
						dp[i][0]=0;
						dp[i][1]=dp[i-1][1]+dp[i-1][0];
					}
				}
			}else{//必须0
				if(kk[i]==0){
					if(dp[i-1][2]>0){
						dp[i][2]=dp[i-1][2];
						dp[i][1]=0;
						dp[i][0]=dp[i-1][0]+dp[i-1][1];
					}else{
						dp[i][2]=0;
						dp[i][1]=0;
						dp[i][0]=(dp[i-1][1]+dp[i-1][0]);
					}
				}else{//kk=1,必须0
					if(dp[i-1][2]>0){
						dp[i][2]=dp[i-1][2]+dp[i-1][1]+dp[i-1][0];	
						dp[i][1]=0;
						dp[i][0]=0;
					}else{
						dp[i][2]=dp[i-1][1]+dp[i-1][0];//这一位取0变任意
						dp[i][0]=0;
						dp[i][1]=0;
					}
				}
			}
		}else{
			printf("0");
			return ;
		}
	}
	printf("%lld",dp[64][0]+dp[64][1]+dp[64][2]);
	return ;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		solve();
		printf("\n");
	}
	
	return 0;
}
/*
1
10 0
875439337127111837 915410680618070406 902383077856448367 429672369988611652 464260354103640857
645644829517442561 676851664028947387 341018344971465954 341986276568351378 467144025649476467
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

1
4 17
3 2 5 16

output:

4

result:

ok single line: '4'

Test #2:

score: 0
Accepted
time: 59ms
memory: 8012kb

input:

36156
2 732025001343805266
563399128172323734 55283226774627822
7 388099190813067712
564150557919527813 457487771983557281 332055400678110195 760833651510929158 785768483273197875 690506113272551236 463276585748519124
2 798714574862593347
426890163990834364 434764725667883272
1 414708220571820990
42...

output:

288230376151711744
0
432345564227567616
414708220571820991
716398192192370638
0
1949654914769744
0
0
0
811009189367843523
0
0
0
114457959388827198
36028797018963968
0
0
91540211282631659
0
694703231769895640
144115188075855872
0
0
0
0
432345564227567616
65333152962117911
753346372609875093
180143985...

result:

ok 36156 lines

Test #3:

score: 0
Accepted
time: 73ms
memory: 8016kb

input:

66700
5 574806949
707283080 678928379 541095440 909663418 934562284
2 131740903
1072092807 29505236
1 288553982
996051310
3 327852411
555539857 562077878 310330495
5 43708614
467258834 418367471 258444521 166976259 1064316226
4 128498668
513637339 62151118 158694610 650278927
2 351983999
4118288 333...

output:

33554432
0
288553983
0
0
0
268435456
0
149009740
386781916
437566564
385875968
0
315141961
271302559
33554432
0
0
0
95224229
129359372
134217728
134217728
268435456
0
67108864
33554432
0
0
0
268435456
0
0
134217728
67108864
268435456
212106049
67108864
0
268435456
4450845
268435456
0
67108864
378512...

result:

ok 66700 lines

Test #4:

score: -100
Wrong Answer
time: 55ms
memory: 7968kb

input:

36360
1 96
43
4 13
34 87 65 66
10 19
30 15 3 46 37 35 84 82 83 74
9 4
52 54 49 62 46 31 8 85 85
5 11
47 60 16 125 73
2 82
41 86
6 53
96 106 117 88 37 54
4 88
25 85 70 116
6 77
2 7 10 15 83 79
4 93
41 35 10 121
3 54
39 49 73
8 14
10 1 18 59 62 61 66 89
9 66
58 39 26 17 122 117 107 97 98
9 95
29 23 0 ...

output:

97
0
0
0
0
64
0
16
8
16
32
2
4
4
0
0
6
15
79
31
2
0
64
4
4
0
4
6
4
3
0
8
9
8
0
8
0
4
30
0
2
4
4
24
2
4
4
0
2
48
4
2
0
4
13
0
0
32
47
8
0
2
0
21
8
0
0
0
0
4
42
0
16
0
2
64
8
22
16
4
4
32
16
0
0
0
8
0
14
42
29
0
16
8
0
1
0
8
28
71
0
33
16
8
6
4
4
28
0
0
32
4
8
32
82
0
0
0
0
85
16
0
16
19
32
1
4
32
0
1...

result:

wrong answer 96th lines differ - expected: '0', found: '1'