位运算、差分、双指针模板

位运算模板

求n的二进制的第k位数字: n >> k & 1
返回n的二进制最后一位1所代表的十进制数:lowbit(n) = n & -n
###
当枚举状态时假设有n个点,每个点有两种状态,那么一共就有2^n个状态,所以可以用位运算来枚举每种方案里面的状态;1~2^n-1里面的所有的数都可以作为一种方案,比如n=5,那么枚举1~31,假设枚举到12,它的二进制为
01100 ,利用位运算判断12的哪一位是1,就证明对第几个点进行了相应的操作;

子矩阵的和

S[i, j] = 第i行j列格子左上部分所有元素的和(也就是矩阵前缀和)
矩阵前缀和的求法:S[i, j] = S[i-1, j] + s[i, j-1] -s[i-1, j-1]
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]

差分

一维

void insert(int l,int r,int x)
{
    b[l]+=x,b[r+1]-=x;
}

二维

给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

双指针算法

int l=0,r=0,len=0;
for(;r<n;r++){
    mp[s[r]]--;
    if(mp[s[r]]>=0) len++;
    while(len==t.size()){
        if(r-l+1<=minlen){
            minlen=r-l+1;
            ml=l;
            mr=r;
        }
        mp[s[l]]++;
        if(mp[s[l]]>0) len--;
        l++;
    }
}
posted @ 2023-12-17 21:26  lipu123  阅读(8)  评论(0)    收藏  举报