QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#192283 | #6510. Best Carry Player 3 | flame | WA | 17ms | 3620kb | C++14 | 2.7kb | 2023-09-30 14:09:26 | 2023-09-30 14:09:27 |
Judging History
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;
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 %lld",Y,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){
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: 3560kb
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: 17ms
memory: 3620kb
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: '107'