无题
hainoir2.位运算双指针排序二分
1.位运算
与:&
或:|
非:!
异或:^ (任何数,与0进行异或都等于0)eg:【a + b = 2(a & b)+ (a ^ b)】
移位:<< (左移),>>(右移)
取反:~
1 2
| bitset<n>(x) //将x转换为n进制 x <<= 1 //将x左移一位
|
2.排序
数组去重排序模板:
1 2 3 4 5 6 7 8 9 10
| vector<int> a; for(int i = 1;i <= n;i++) { int num;cin >> num; a.push_back(num); } sort(a.begin(),a.end()); a.erase(unique(a.begin(),a.end()),a.end()); for(auto &i : a) cout << i << '\n';
|
1
| reverse(a + 1,a + 1 + n);
|
遇见一个元素中有多个数据,且需要排列不同元素时,就需要使用cmp或struct;
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| struct book{ int a,b,c; bool operator < (const book &u)const{ if(u.a == a && u.b == b) return u.c < c; if(u.a == a) return u.b < b; else return u.a < a; } }p[N];
bool cmp(const book &u,const book &v){ if(u.a == v.a && u.b == v.b) return u.c > v.c; if(u.a == v.a) return u.b > v.b; else return u.a > v.a; }
|
3.双指针
1.只往一个方向走
2.一快一慢
3.在区间内
4.二分