部分记忆不深算法

set、排序、排列、二进制。

set 的几个函数

set<int> st;
st.find(k);       //返回一个迭代器,指向键值k
st.lower_bound(k);//返回一个迭代器,指向键值大于等于k的第一个元素
st.upper_bound(k);//返回一个迭代器,指向键值大于k的第一个元素

sort 的相关函数

stable_sort();//如果排序元素相等,保留原来的相对位置
partial_sort();//局部排序,可以不用排序所有元素,只排序局部
partial_sort(a.begin(),a.begin()+k,a.end());//在begin到end范围内实现前k个有序
//注意,只是前k个有顺序,不代表是全部排序后的前k个元素
//如4 3 2 1 5 当k等于2时 为1 4而不是1 2

next_permutation的相关函数

next_permutation(a,b);
// 范围为[a,b) ,不包括b
prev_permutation(a,b);//求前一个排列组合
lexicographical_compare();//字典比较

小技巧

可以检测程序运行时间。

clock_t a,b;//a和b分别为时间变量
a=clock();//a获取当前时间
solve();//运行的代码块
b=clock();//b为当前时间
cout<<b-a<<endl;//b-a即为代码块运行的时间

二进制

  • 二进制基础操作
//消除二进制数中的最后的那个1
kk = kk & (kk - 1);

//一个数对2的整数次幂取模
int modPT(int x,int mod) { return x & (mod - 1); }//x为2的整数次幂,mod为取模数

//判断一个数是否是2的幂
bool ifPT(int n) { return  n > 0 && (n & (n - 1)) == 0; }

//获取一个数二进制的某一位
int getBit(int a,int b) {return (a >> b) & 1; }//获取a的第b位,最低位编号为0

//将一个数二进制的某一位设置为0
int unsetBit(int a, int b) { return a & ~(1 << b); }//将a的第b位设置为0,最低位编号为0

//将一个数二进制的某一位设置为1
int setBit(int a, int b)  { return a | (1 << b); }//将a的第b位设置为1,最低位编号为0

//将一个数的二进制的某一位取反
int flapBit(int a,int b) { return a ^ (1 << b); }//将a的第b位取反,最低位编号为0
  • 二进制函数 —— 这些函数为内置函数,运行速度极快
//返回x的二进制末尾最后一个1的位置,最低位编号为1,当x为0时返回0
int __builtin_ffs(int x)

//返回x的二进制的前导0个数,x需不为0
int __bultin_clz(int x)
    
//返回 x 的二进制末尾连续 0 的个数,x需不为0
int __builtin_ctz(unsigned int x)
    
//返回 x 的二进制中 1 的个数
int __builtin_popcount(unsigned int x)