QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#863213#9745. 递增序列tsaiWA 51ms8008kbC++143.6kb2025-01-19 14:33:582025-01-19 14:33:59

Judging History

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

  • [2025-01-19 14:33:59]
  • 评测
  • 测评结果:WA
  • 用时:51ms
  • 内存:8008kb
  • [2025-01-19 14:33:58]
  • 提交

answer

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

ll a[N];
ll b[N][65];//1---62位
int jd[N];//equal=1,smaller==2,2会往下传
/*
1--->规则
2--->任意
*/
ll ans[65]={0};//几种情况
ll num[65]={0};//数字是几
ll kk[65];//数字是几
ll dp[65][3]={0};//必须0,必须1,可任意
void solve(int tt){
	int n;
	ll k;
	scanf("%d %lld",&n,&k);
	for(int i=1;i<=64;i++){
		ans[i]=0;
		num[i]=-1;
		kk[i]=0;
	}
	ll ktmp=k;
	int kp=1;
	while(k){
		kk[63-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][63-j]=x%2;
			x/=2;
			j++;
		}
	}	
	if(tt==8){
		cout<<"#"<<n<<"#"<<k<<"#";
		for(int i=1;i<=n;i++){
			cout<<"&"<<a[i]<<"&";
		}
	}
	if(n==1){
		printf("%lld",ktmp+1ll);
		return ;
	}
	//j==1是equal
	for(int j=2;j<=62;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<=62;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[62][0]+dp[62][1]+dp[62][2]);
	return ;
}
int main(){
	int t;
	scanf("%d",&t);
	int  tt=1;
	while(t--){
		solve(tt);
		tt++;
		printf("\n");
	}
	
	return 0;
}
/*
1
4 10
3 2 5 16
*/

详细

Test #1:

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

input:

1
4 17
3 2 5 16

output:

4

result:

ok single line: '4'

Test #2:

score: -100
Wrong Answer
time: 51ms
memory: 3840kb

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
#10#0#&875439337127111837&&915410680618070406&&902383077856448367&&429672369988611652&&464260354103640857&&645644829517442561&&676851664028947387&&341018344971465954&&341986276568351378&&4671440256494764...

result:

wrong answer 8th lines differ - expected: '0', found: '#10#0#&875439337127111837&&915...44025649476467&9007199254740992'