一些小技巧

枚举二进制下的子集

for(int s=S;s;s=(s-1)&S)

然后 \(s\) 就枚举了 \(S\) 二进制下的所有子集。

全排列

c++ 内置了一个比较方便的函数:
next_permutation()
我们可以通过这个直接得到下一个全排列。
具体的使用方法是开一个数组初始塞上一个排列然后调用即可

int a[10]
for(int i=0;i<10;i++)a[i]=i;
do{
  
}while(next_permutation(a,a+10));  //这里是正常的左闭右开

清空 vector

vector<int>().swap(vec);

对单个元素的排序

如果我们不需要对整个序列排序,只需要要求某一个位置是排序后正确的元素,就用
nth_element(a+l,a+mid,a+r+1,cmp)
其保证了 \(mid\) 左边的位置全部小于它,右边都大于它。

auto it=partition(a+1,a+n+1,[=](int x){return x<10;});
满足后面条件的都会在左边。注意返回的迭代器仍然是左闭右开的,也就是迭代器指向的是右半部分的开头。

posted @ 2025-07-18 08:16  all_for_god  阅读(11)  评论(0)    收藏  举报