stl是一種重要技巧,可以極大地簡化程式設計過程
在總結stl之前,我們先簡單介紹一下迭代器。
迭代器可以簡單理解為位址的等價物。
在不同資料型別中迭代器支援的操作略有不同
其中vector使用的是隨機訪問迭代器,其支援的操作可以參考上述**
雖然本文用不上預備知識,但是還是先說一下吧
接下來介紹常用stl——優先佇列
優先佇列(英文priority_queue)是一種維護集合最大最小值的資料結構(堆)
它能夠在o(1)時間得到乙個集合的最大(小)值,在o(logn)時間加入新的元素或者刪除最大(小)的元素
常見操作如下:
優先佇列預設為大根堆,即維護最大值
#include
#include
#include
#include
using namespace std;
priority_queue<
int> q1;
//預設大根堆
priority_queue<
int,vector<
int>
,less<
int>
> q2;
//等價的大根堆
priority_queue<
int,vector<
int>
,greater<
int>
> q3;
//小根堆
intmain()
while
(!q1.
empty()
)//檢查是否非空
while
(q3.
size()
>0)
//返回元素個數
}
優先佇列的優化十分優秀,很多情況下甚至比手寫heap還要快
洛谷p3871 中位數
題目描述
給定乙個由n個元素組成的整數序列,現在有兩種操作:
1 add a
在該序列的最後新增乙個整數a,組成長度為n + 1的整數序列
2 mid
輸出當前序列的中位數
中位數是指將乙個序列按照從小到大排序後處在中間位置的數。(若序列長度為偶數,則指處在中間位置的兩個數中較小的那個)
例1:1 2 13 14 15 16 中位數為13
例2:1 3 5 7 10 11 17 中位數為7
例3:1 1 1 2 3 中位數為1
輸入輸出格式
輸入格式:
第一行為初始序列長度n。第二行為n個整數,表示整數序列,數字之間用空格分隔。第三行為運算元m,即要進行m次操作。下面為m行,每行輸入格式如題意所述。
輸出格式:
對於每個mid操作輸出中位數的值
這道題有很多做法,在此給出簡單且時間效率高的優先佇列做法
將陣列按照從小到大排序,將較小的一半放入乙個大根堆,將較大的一半放入乙個小根堆
每次新增數的時候與兩個堆堆頂元素比較,將其放入相應的堆中
確保左堆的元素個數》=右堆的元素個數》=左堆元素個數-1
若打破了這個條件,只需將某堆中的堆頂元素換到另乙個堆即可
每一次詢問輸出左堆堆頂
#include
#include
#include
#include
#include
#include
using namespace std;
priority_queue <
int,vector<
int>
,greater<
int>> qright;
priority_queue <
int,vector<
int>
,less<
int>> qleft;
vector <
int> v;
intmain()
sort
(v.begin()
+1,v.end()
);for(
int i =
1; i <= n/
2; i ++
)qleft.
push
(v[i]);
for(
int i = n/2+
1; i <= n; i ++
)qright.
push
(v[i]);
scanf
("%d"
,&m)
;while
(m--
)else
else qright.
push
(x);
int a = qleft.
size()
,b=qright.
size()
;if(a-b>1)
else
if(b>a)}}
}
洛谷p1484 種樹
題目描述
cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由於cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力,能預知自己在某個坑種樹的獲利會是多少(可能為負),請你幫助他計算出他的最大獲利。
輸入輸出格式
輸入格式:
第一行,兩個正整數n,k。
第二行,n個正整數,第i個數表示在直線上從左往右數第i個坑種樹的獲利。
輸出格式:
輸出1個數,表示cyrcyr種樹的最大獲利。
這道題採用的思想是在一棵樹被種之後,要改種左右兩顆樹獲利等於左右兩樹之和減去這棵樹,我們把這個獲利再當成之前被種的樹的獲利放入堆中,並且標記左右兩棵樹無效。
最後k次取堆頂元素求和
#include
#include
#include
#include
using namespace std;
#define n 500004
int f[n]
,l[n]
,r[n]
,n,k,cnt,tot;
long
long ans;
bool vis[n<<2]
;struct num
}buf;
priority_queue heap;
intmain()
);vis[i]=1
; r[i]
=i+1
; l[i]
=i-1;}
for(
int i =
1; i <= k ; i ++))
; r[buf.pos]
=r[r[buf.pos]
];l[r[buf.pos]
]=buf.pos;
l[buf.pos]
=l[l[buf.pos]
];r[l[buf.pos]
]=buf.pos;
vis[buf.pos]=1
;}cout<
}
資料結構 查詢番外篇 靜態數表的查詢 次優查詢樹
二分查詢對於等概率的查詢的效能是最優的,但是如果我們對於 資料查詢的概率不相等時,顯而易見簡單再用二分查詢不一定能得到最高的效率。如果只考慮查詢成功的情況,則使查詢效能達最佳的判定樹是其帶權內路徑長度之和ph值 ph w1h1 w2h2 wnhn 取最小值的二叉樹。這種二叉樹稱為靜態最優查詢樹。找到...
資料結構 排序番外篇 堆,堆排序與其前身選擇排序
優先佇列 特殊的 佇列 取出元素的順序是依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序 堆是優先佇列的完全二叉樹表示。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任意結點的關鍵字是其子樹所有結點的最大值,叫最大堆 或最小值,叫最小堆 注意從根結點到任意結點路徑上結點序列的有序...
資料結構 STL
棧 先入後出 filo 的一種資料結構。常見操作 模擬火車調頭,進製轉換,表示式求值,單調棧 陣列形式 理解 const int num 1e6 10 定義棧的大小,可自由改變 int stac num 乙個整型棧 int top 棧頂指標 int main top 1 設定棧頂指標為 1 stac...