目录
知识点讲解
位运算
按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移1位 << ——乘二
右移1位 >> ——除二
左移后或1 ——乘二加一
vector
vector 出是pop_back()
map
底层是红黑树
map映射/键值对 (以键排序)
typea->typeb,typea唯一,后面覆盖前面
count返回指定元素出现的次数
auto快速迭代器:auto temp=m.find(“aa”);
set
底层是红黑树
set集合(自动去重,自动排成字典序)
set为空时,s.empty()=1
stack
stack栈
while(!s.empty()) s.pop() 清栈
queue
queue队列(有头有尾,先进先出,插队尾,删队头)
front/back 返回第一个/最后一个
相关算法:spfa,djistra
deque
deque双向队列
priority_queue大根堆/小根堆(涉及到> >一定加空格)
实战
A-明明的随机数(传送门)
set的好处:自动去重自动排序
#include<bits/stdc++.h>
using namespace std;
int main(){
set<int> s;
int t,num;cin>>t;
for(int i=1;i<=t;i++){
cin>>num;
s.insert(num);//set对应insert喔
}
cout<<s.size()<<endl;
for(auto x:s){//比较新,用起来很舒服
cout<<x<<" ";
}
}
B-保龄球(传送门)
map中的find找的是键而不是值
#include<iostream>
#include<map>
using namespace std;
int main() {
int n,num,t,s;
cin>>n;
map<int,int> v;
for(int i=1; i<=n; i++) {
cin>>num;
v[num]=i;
}
cin>>s;
while(s--) {
cin>>t;
auto temp=v.find(t);
if(t==(temp->first)) {
cout<<(temp->second)<<endl;
} else {
cout<<0<<endl;
}
}
}
C-区间内的最小值(传送门)
v咋不用vector用数组呢?用了超时
D-Bad Hair Day(传送门)
单调队列,一直维护就完事了
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
#define int long long int
int solve(vector<int> &v ) {
v.push_back(INT_MAX);
stack <int> st;
int sum=0;
for(int i=0; i<(int)v.size(); i++) {
if(st.empty()||v[st.top()]>v[i]) {
st.push(i);
} else {
while(!st.empty()&&v[st.top()]<=v[i]) {
int top=st.top();
st.pop();
sum+=(i-top-1);
}
st.push(i);
}
}
return sum;
}
vector<int> v;
signed main() {
int n,num;
cin>>n;
while(n--) {
cin>>num;
v.push_back(num);
}
cout<<solve(v)<<endl;
}