contents:
vector
用vector 代替邻接表保存有向图
const int MAXN = 1e5+7;
vector<int> ver[MAXN],edge[MAXN];
//保存从x到y权值为z的有向边
void add(int x,int y,int z){
ver[x].push_back(y);
edge[x].push_back(z);
}
//遍历从x出发的所有边
for(int i=0;i<ver[x].size();i++){
int y = ver[x][i],z = edge[x][i];
//有向边(x,y,z);
}
queue
q.back();//队尾元素
priority_queue
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int>> q;
懒惰删除法
并没有删除标记,可以记录一个过时标记
当到达堆顶的时候删除
deque
front/back//队头队尾元素
push_back//队尾入队
push_front
pop_front//对头出队
pop_back
clear//光
set 有序集合& multiset有序多重集
set.insert
set.find iterater or sset.end O(logn)
s.lower_bound(x) >=元素最小的一个返回指向该元素的迭代器 O(logn)
s.upper_bound(x) > 元素的最小一个返回指向该元素的迭代器
s.erase O(logn)
s.count(x) 返回集合s中等于x的元素个数 O(k+logn) k为元素x的个数
map
size
empty
clear
begin
end
insert
erase
find
[] 检出存在
map<string, int> h;
char str[25];
for(int i=1;i<=n;i++){
scanf("%s",str); h[str]++;
}
for(int i=1;i<=m;i++){
scanf("%s",str);
if(h.find(str) == h.end()) puts("0");
else printf("%d\n",h[str]);
}
unordered_map
bitset
每8位占用一个字节
采用了状态压缩的二进制数组
n位执行一次位运算的复杂度视为n/32
bitset<10000> s;
~s 按位取反
&|^ 返回对两个位数相同的bitset执行按位与或异或运算的结果
>>,<< 返回把一个bitset左移右移若干位的结果
==,!= 返回两个bitset代表的二进制数是否相等
s[k] 表示s的第k位,即可以取值,也可以赋值
s.count 返回1的个数
若s所有位都为0 则是,s.any返回false s.none 返回 true
若s所有位都为1 则是,s.any返回true s.none 返回 false
s.set() 把s所有位变成1
s.sek(k,v) 把s的第k位改成 v,即s[k] = v
s.reset() 把s所有位变成0
s.resek(k) 把s的第k位改成 0,即s[k] = 0
s.flip() 把s所有位取反 s=~s
s.flip(k) 把s k位取反 s[k]^=1
algorithm
reverse //反转
unique //去重
random_shuffle //随机打乱
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
vector<int> v;
int main()
{
int n;
cin >> n;
while (n--)
{
int now;
cin >> now;
v.push_back(now);
}
sort(v.begin(), v.end());
for (auto it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
int m;
cin >> m;
while (m--)
{
random_shuffle(v.begin(), v.end());
for (auto it = v.begin(); it != v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
}
next_permutation //下一个排列
sort //排序
lower_bound //二分>=
upper_bound //>