QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#192344#6510. Best Carry Player 3flameWA 16ms3788kbC++142.8kb2023-09-30 14:18:272023-09-30 14:18:28

Judging History

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

  • [2023-09-30 14:18:28]
  • 评测
  • 测评结果:WA
  • 用时:16ms
  • 内存:3788kb
  • [2023-09-30 14:18:27]
  • 提交

answer

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int t;
LL lb(LL x){
	return x&(-x);
}
LL Get(LL x){
	LL a=-1;
	while(x){
		a=lb(x); x-=a;
	}
	return a;
}
LL Get1(LL x){
	int k=0; if(!x) return -1;
	while(x!=1){
		k++; x>>=1;
	}
	return k;
}
int main(){
	//freopen("J.in","r",stdin);
	//freopen("J.out","w",stdout);
	scanf("%d",&t);
	while(t){
		
		LL X,Y,K;
		t--; scanf("%lld%lld%lld",&X,&Y,&K);
	//	if(t==99191) printf("%lld",K);
		if(Y<X) swap(X,Y);
		if(!K){
			printf("%lld\n",Y-X);
			continue;
		} 
		if(Y==X){
			printf("0\n"); continue;
		}
		LL x,y,a,b,k,w;  
		x=Get(X); y=Get(Y); k=Get(K);
		if(Y<=K){
			if(y!=k){
				printf("1\n"); continue;
			}
			else{ //最高位相等 
				if(x==y){  //有最高位 
					printf("1\n"); continue;	
				}
				else{
					printf(((Y^X)<=K)?"1\n":"2\n");	continue;
				}
			}
		}
		LL ans=0; LL w1,xx,Y1,w2,ww,X1,Y2,X2;
		if(K<=X){
			if(x<y){ //x的最高位低 
				w1=2ll*k-1; 
				if((w1^(X&w1))<=K) {
					ans+=((w1^(X&w1))!=0);
				}
				else{
					ans=2;  //凑出1111 
				} //这个地方有锅 
				//cout<<ans<<endl;
				Y1=(Y>>Get1(k)+1<<Get1(k)+1); //后面都是0
				//cout<<X<<' '<<Y<<' '<<k<<' '<<Get1(k)+1<<endl;
				X|=w1;
				Y2=(Y>>Get1(k)+1);
				X2=(X>>Get1(k)+1);
				ans++; X2++;
				//cout<<X2<<' '<<Y2<<endl;
				ans+=(Y2-X2)*(K==w1?2ll:3ll);
				//cout<<ans<<' '<<Y<<' '<<Y1<<endl;
				if(Y==Y1) {}
				else{
					if(((Y^Y1)<=K)) ans++;
					else {
						ans+=2; //?
					}
				}
				printf("%lld\n",ans);
				continue;
			}
			else{ //x==y
				w2=Y^X; 
				if(w2<=K){
					if(t==99191) cout<<w2<<endl;
					ans=1;
					printf("%lld\n",ans);
				continue;
				}
				ww=Get(w2);
				if(ww==k){ //最高位相等 
					ans+=2; 
					printf("%lld\n",ans);
					continue;
				}
				else{ //最高位低 
					w1=(2ll*k)-1;
					X1=X|w1;
					if(X1!=X){  //?
						ans++;
						if((X1^X)>K) ans++;
					} 
					X=X1;
					Y1=(Y>>Get1(k)+1<<Get1(k)+1);
					Y2=(Y>>Get1(k)+1);
					X2=(X>>Get1(k)+1);
					ans++; X2++;
					ans+=(Y2-X2)*(K==w1?2ll:3ll);
					X=Y1;
					if((X^Y)<=K){
						ans+=(X!=Y);
					}
					else{
						ans+=2;
					}
				}
			}
			printf("%lld\n",ans);
			continue;
		}
		if(X<K){
			if(k==y){  //最高位相等 
				ans+=((X^Y)<=K?1:2);
			}
			else{ //k<y x<=k 
				w1=(2ll*k)-1; 
				xx=w1^X;  //K>X
				if(xx){
					if(xx<=K) ans=1;
					else{
						ans+=2;
					}
				}
				X=X|(w1);
				Y1=(Y>>Get1(k)+1<<Get1(k)+1);
				Y2=(Y>>Get1(k)+1);
				X2=(X>>Get1(k)+1);
				ans++; X2++;
				ans+=(Y2-X2)*(K==w1?2ll:3ll);
				X=Y1;
				w2=Y1^Y;
				if(w2){
					if(w2<=K) ans++;
					else ans+=2;
				}
			}
			printf("%lld\n",ans);
			continue;
		}
	}	
}

详细

Test #1:

score: 100
Accepted
time: 1ms
memory: 3788kb

input:

8
4 5 0
5 8 3
9 2 6
15 28 5
97 47 8
164 275 38
114514 1919 810
0 1152921504606846975 1

output:

1
2
3
5
11
6
331
1152921504606846975

result:

ok 8 numbers

Test #2:

score: -100
Wrong Answer
time: 16ms
memory: 3528kb

input:

100000
84 318 6
54 226 7
92 33 0
39 54 5
76 79 7
247 110 0
211 90 0
4 430 3
230 17 1
491 93 5
196 117 7
137 29 2
76 490 6
422 43 7
277 26 4
159 43 1
67 37 5
17 2 5
113 176 7
85 473 0
68 217 7
275 8 7
124 34 1
30 66 0
80 149 3
103 149 6
84 354 1
27 342 7
94 114 1
69 125 1
72 48 7
361 8 7
285 82 1
74 ...

output:

87
45
59
6
1
137
121
213
213
150
21
81
156
95
95
116
12
6
16
388
39
67
90
36
35
17
270
79
20
56
6
89
203
108
26
15
157
98
111
389
174
123
59
289
78
17
21
36
275
191
17
102
60
93
100
11
6
79
44
63
91
60
22
109
11
3
10
67
11
85
207
47
39
83
156
189
107
27
81
247
81
335
33
144
11
50
54
347
233
175
30
7...

result:

wrong answer 809th numbers differ - expected: '1', found: '2'