Ryanlyt / algorithm-learning

The firse
0 stars 0 forks source link

9.11 #3

Open Ryanlyt opened 1 year ago

Ryanlyt commented 1 year ago

位运算

求n的第k位数字(二进制表示): n >> k & 1(从个位开始看,从0开始)

先把第k位移到最后一位 n >> k 再看个位是几 x & 1

返回n的最后(最右边)一位1(二进制表示):lowbit(n) = n & -n (= n & (~n + 1))

lowbit是树状数组的一个基本操作 如:x = 1010 lowbit(x) = 10

lowbit的最基本的应用:统计x二进制表示中1的个数,每统计一次去掉一个1

#include <iostream>

using namespace std;

int lowbit(int x){
    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的最后一位

        cout << res << ' '; 
    }
    return 0;
}
Ryanlyt commented 1 year ago

离散化

使用场景:值域很大,但数的个数少,稀疏(如值域0-1e10,n=1e5) 映射

  1. a[]中可能重复元素 先去重(先排序再去重)
  2. 如何算出x离散化后的值 二分
vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(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 + 1;
    }
    return r + 1; // 映射到1, 2, ...n
}

_bdf145e93d179541654f9e4c2cbd8570_1353338722_Screenshot_2023-09-12-00-30-18-966_com alicloud databox

_4b4132c19a4930799e6d39b38a70fe9c_1557693240_Screenshot_2023-09-12-10-27-51-326_com alicloud databox

_e2a6167b8b2d67a3f04e712c7f1648b8_844668713_Screenshot_2023-09-12-10-28-15-928_com alicloud databox

_07dd56956a9e55d7ede5b17a30b230d3_1438487447_Screenshot_2023-09-12-10-28-12-158_com alicloud databox

_a1061d1b1272ff044beb804f8976bcae_-1283831555_Screenshot_2023-09-12-10-29-15-194_com alicloud databox

Ryanlyt commented 1 year ago

区间合并

// 将所有存在交集的区间合并
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;
}

_25e089b45afcc674e0c9c71340e404a2_-378991693_Screenshot_2023-09-12-10-29-33-417_com alicloud databox

_6dc4485086a498aac18a4de350ae53b3_-54428715_Screenshot_2023-09-12-10-29-50-926_com alicloud databox

_02f402c4b060ee6ed13214a38927ec75_1132723118_Screenshot_2023-09-12-10-30-00-247_com alicloud databox

_2bf42e2b079e9434bb4d514ba1fec1b7_-896709744_Screenshot_2023-09-12-10-30-04-472_com alicloud databox

_2870e8398b9a7aa082fb92642e3ca7d2_-1829937_Screenshot_2023-09-12-10-30-51-932_com alicloud databox

_2eecc4b902f0cda071e456df03761463_776654986_Screenshot_2023-09-12-10-30-56-327_com alicloud databox