一. n的二进制表示中第k位是几
先把第k位移到最后一位 n>>k
看个位是几 x&1
即n>>k&1
代码模板:求二进制中1的个数
#include <iostream>
using namespace std;
int lowbit(int x)//返回x的最后一位1
{
return x & -x;
}
int main()
{
int n;
cin >> n;
while (n--)
{
int x;
cin >> x;
int res = 0;
while (x) x -= lowbit(x), res++;//每次减去x的最后一位1
cout << res << endl;
}
return 0;
}
二.离散化
方法
vector<int> alls; //存储所有带离散化的值
sort(alls.begin(), alls.end() ); //将所有值排序
alls.erasre(unique(alls.begin(), alls.end()), alls.end()); //去掉重复元素
二分求出x对应离散化的值
int find(int x)//找打第一个大于等于x的位置
{
int l = 0, r = alls.size()-1;
while(l<r)
{
int mid = l+r>>1;
if(alls[mid] >= x) r = mid;
else l = mid;
}
return r+1;//映射到1.2 ....n
三.区间合并
将所有存在交集的区间合并
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 100010;
int n;
vector<PII> segs;
void merge(vector<PII>& segs)
{
vector<PII> res;
sort(segs.begin(), segs.end());
int st = -2e9, ed = -2e9;
for (auto seg : segs)
if (ed < seg.first)
{
if (st != -2e9) res.push_back({ st, ed });
st = seg.first, ed = seg.second;
}
else ed = max(ed, seg.second);
if (st != -2e9) res.push_back({ st, ed });
segs = res;
}
int main()
{
cin >> n;
for (int i = 0; i < n; ++i)
{
int l, r;
cin >> l >> r;
segs.push_back({ l,r });
}
merge(segs);
cout << segs.size() << endl;
}