set查詢前驅後繼
multiset::iterator iter;
s.insert(x);
iter=s.find(x);//返回迭代器
iter--;//前驅
int ans=*iter;
s.erase(find(x));
return ans;
或者可以使用\(lower\_bound\)(大於等於)、\(upper\_bound\)(嚴格大於)函式
multiset::iterator iter;
iter=s.upper_bound(x);
需要注意的是,\(iter\)是乙個類似指標的東西,當\(set\)的結構發生改變時,\(iter\)所指向的值也會變!
刪除元素
s.erase(iter);//刪除迭代器所指的元素(multiset只刪乙個元素)
s.erase(x);//刪除所有的x元素(multiset就能把所有x刪掉)
s.erase(find(x));//只刪乙個x
map的遍歷
\(c++\)寫法
map::iterator iter;
for(iter=map.begin();iter!=map.end();iter++)
int a=iter->first,b=iter.second;
\(c++11\)寫法
for(auto x:map) cout查\(x\)是否在\(map\)中
1. if(map[x]!=0) ...
2. if(map.find(x)!=map.end()) ...
一定要使用第二種方法,因為若\(x\)不在\(map\)中,而呼叫\(map[x]\)的話會自動新增乙個結點\((x,0)\),使得常數變大或者發生錯誤
雙端佇列
#includedequeq;
q.push_front(x);
q.push_back(x);
q.pop_front(x);
q.pop_back(x);
q.size();
!q.empty();
值域在\(10^9\)左右的時候用它比map快得多!!!(10.16被卡常教訓)
空間計算:除以8(嚴格來說\(\lceil\frac\rceil×8\))
struct food
//表示按tim從小到大排序(因為預設是大根堆,不清楚可以試試,注意兩個const)
};
struct bignum
//表示一呼叫就會執行這個函式
int &operator (int x) //可以使用a[i]代替a.a[i]
void operator = (int x)
if(!w) a[++w]=0;
}bignum operator + (bignum b)
}a;
struct matrix
//可以用a[i][j]代替a.a[i][j]
matrix ()
matrix operator * (matrix b)
}base,ans;
ll mul(ll x,ll y,ll p)
sqrt返回的是double!!要強制轉成int才行
在呼叫之前一定要判是否在長度範圍內,否則會出現神奇的錯誤
否則就會出現不開o2訪問陣列負下標還拍上了的情況
奇技淫巧 NOIP的讀入優化
最近看到洛谷上面有乙個讀入優化的 inline char get char inline short read 說實話第乙個函式get char的第二行,這麼長一六三目運算子真心看不懂 下面的read函式裡面那個isspace 和isdigit 就是判斷這個字元是不是空格,是不是數字,是的就返回tr...
c 的奇技淫巧
關於陣列 數論演算法技巧 stl其他 while scanf d d n,m eof 等價於 while scanf d d n,m 2 前者eof為檔案結束符,較保險 後者 後的數字為輸入的變數的個數 不能只寫while scanf d d n,m 這樣無法結束讀入 wwq大佬教的,希望我不要和他...
Git的奇技淫巧
git常用命令集合,fork於tips專案 git是乙個 分布式版本管理工具 簡單的理解版本管理工具 大家在寫東西的時候都用過 回撤 這個功能,但是回撤只能回撤幾步,假如想要找回我三天之前的修改,光用 回撤 是找不回來的。而 版本管理工具 能記錄每次的修改,只要提交到版本倉庫,你就可以找到之前任何時...