您的位置:首页 > 其它

二进制 模拟 codeforces 485C

2014-11-07 19:42 232 查看
//求最多的一的个数,在二进制表示中

//判断[l,r]中,二进制表示有没有全是1的,如果有则结束

//否则,l,r均更新,减去小于l的最高的(100000...)<l,更新ans,不断进行询问

/*************************************************************************
> File Name: 485C.cpp
> Author: flyasdfvcxz
> Mail: 1099431883@qq.com
> Created Time: Fri 07 Nov 2014 05:06:52 PM CST
************************************************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
#include <map>
#include <ctime>
#include <cmath>
#define ll long long
using namespace std;
int n;
ll l, r;
int main()
{
cin >> n;
while (n--)
{
cin >> l >> r;
if (l == r)
{
cout << l << endl;
continue;
}
ll res = 0;
while (1)
{
int pos = -1;
ll ans = -1;
for (int i = 1; ; ++i)
{
ll cur = (1LL << i) - 1;
if (cur < l)
{
pos = i;
}
else if (cur >= l && cur <= r)
{
ans = cur;
}
else if (cur > r)
{
break;
}
}
if (ans != -1)
{
res |= ans;
cout << res << endl;
break;
}
else
{
ll tmp = (1LL << pos);
res |= tmp;
l -= tmp;
r -= tmp;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: