|
发表于 2022-9-21 09:45:21
|
显示全部楼层
D题写了半天过不了,我感觉我二分写的没有问题呀
有没有大佬帮我看看问题在哪[大哭]
void init() {
//枚举左半段1~111111111111111 的情况
for (long long i = 0; i <= (1 << 16) - 1; i++) {
//i必须是奇数,比如i=2 10作为左半段明显不符合
if (i & 1) {
long long p = i, cnt = 0;
//寻找左半段1的个数
while (p) {
p &= p - 1;
cnt++;
}
//添加相同个数的0
nums.push_back(i << cnt);
}
}
sort(nums.begin(), nums.end());
}
//二分
long long findVal(long long l, long long r) {
int left = 0, right = nums.size() - 1, m;
while (left <= right) {
m = (left + right) / 2;
if (nums[m] >= l && nums[m] <= r) {
return nums[m];
} else if (nums[m] < l) {
left = m + 1;
} else if (nums[m] > r) {
right = m - 1;
}
}
return -1;
}
int main() {
init();
scanf("%d", &T);
while (T--) {
scanf("%ld%ld", &l, &r);
printf("%ld\n", getVal(l, r));
}
} |
|