- vector:
用法:
sort(ve.begin(),ve.end());//排序
ve.push_back();//末尾插入
ve.pop_back();//末尾刪除
ve.insert(v.begin(),x);//在最頭插入x
ve.insert(v.begin()+2,x);//在第二個元素前插入x
ve.erase(ve.begin());//裡面是迭代器,刪除相應的
- string
getline(cin,s);//整行讀入
s.insert(pos,s1);
s.erase(pos,num);
s.substr(pos,num);
s1.find(s2,pos);
- pair
pair<>//C艹內建的二元組 用make_pair函式建立
- queue
priority_queue<int>qu;//優先佇列
priority_queue<pair< , >>qu;
priority_queue<int,vector<int>,greater<int> >qu;
qu.back();//取隊尾元素
- 雙端佇列deque
#include<dequeue>//標頭檔案
deque<int>qu;
qu.front();
qu.back();
qu.push_back();
qu.push_front();
qu.pop_front();
qu.pop_back();
- set
s.find(x);//找到一樣的數字,並返回地址
s.lower_bound(x);//<x的元素
s.upper_bound(x);//>=x的元素
s.erase(it);//刪除迭代器指向的元素
s.erase(x);//刪除等於x的元素
s.count(x);//返回等於x的個數
s.erase(s.find(2),s.find(4));//刪除區間
- map
mp.find(x);//查詢key為x的元素
mp.insert(make_pair(2,3))
map<char,int>::iterator it;//迭代器
不去重
宣告時使用multi+set/map宣告不去重set/map,使用方法與set/map類似
multiset<int>s;
multiset<int>::iterator it;
- bitset
#include<bitset>
bitset<10000>s;//10000位的二進位制數
s[k]取第k位
s.count();//數有幾位
s.any();//只要有一個1就返回true
s.none();//必須全為0才返回true
s.set();//所有位都變為1
s.flip();//所有位置取反
//前幾個函式如果裡面加上x,就是表示只作用於第幾位
- sort
struct node
{
int x,y;
};
vector<node>ve;
bool operator<(const node &a,const node &b)
{
return a.x<b.x;
}
sort(ve.begin(),ve.end());
- 二分
upper_bound();//>=x
lower_bound();//<x
- 其他
#incude<algorithm>
reverse(a.begin(),a.end());//翻轉
reverse(a+1,a+1+n);
int m=unique(a.begin(),a.end())-a.begin();//返回個
next_permutation(a+1,a+1+n);
- 查詢
lower_bound(first,last,value);
upper_bound(first,last,value);
在有序陣列[first,last)中查詢第一個
不大於/不小於val的元素地址
題目:洛谷P1168
https://www.luogu.com.cn/problem/P1168
題目大意:
輸出前1,前3,前5....數的中位數
思路:
開始想著用優先佇列,但是優先佇列好像不好把中間的數輸出,然後就學到了ve的另一個用法,把數插入到中間去,用二分返回插入的位置,然後直接把需要的數輸出就行了。
AC程式碼:
#include<bits/stdc++.h>
using namespace std;
vector<int>ve;
int main()
{
int n;
scanf("%d",&n);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
ve.insert(upper_bound(ve.begin(),ve.end(),x),x);
if(i%2==1)cout<<ve[(i-1)/2]<<endl;
}
return 0;
}