資料結構是利器,可以靈活運用,解決各種複雜的問題。
具體內容太多不必列舉,關鍵還是思維。
分析一道經典的例題(維護數列):
傳送門
題目大意:
給出乙個序列,要求支援插入、刪除、修改、翻轉、求和、求最大子列和。看我四步走**輸入運算元n(0 <= n <=5e5)
運算元量m (1 <= m <= 2e4)
時間限制 1s,空間限制 128m
通過資料範圍/時間選擇演算法/結構
n是5e5的範圍,m是2e4範圍,1s的時間限制。
o(mlogn)或者o(m*sqrt(n))都行,分塊**好
想做法維護一段區間的各種性質。
故考慮【分塊/塊狀資料結構、線段樹/樹狀陣列、平衡樹】等。
先只考慮插入、刪除、修改,如果直接陣列維護,顯然不行 。
然後考慮分塊,將整個序列分為sqrt(n)塊,塊狀陣列支援高效的靜態處理,但插入效率低。
為了支援高效插入,考慮通過毒瘤結構 塊狀鍊錶維護,即可將每個插入、刪除、修改操作變為o(sqrt(n))的複雜度,總複雜度為o(m×sqrt(n))
可行。加細節
然後考慮翻轉,維護翻轉標記即可。
最後考慮求最大子列和,塊中維護總和sum、字首和lmax、字尾和rmax,然後根據詢問進行計算,複雜度也是o(sqrt(n))。
碼****巨醜就不放了
最終水過此題。
a.括號匹配問題
傳送門
解題思路
棧結構模擬。
**
#pragma gcc optimize(2)
//吸氧
#pragma gcc optimize(3)
#include
#include
#include
#include
#include
#include
#define x first
#define y second
using
namespace std;
const
int n =
105, m =
10005
;typedef
long
long ll;
typedef pair<
int,
int> pii;
int n, m, k;
char s[
200]
;int len;
deque<
int>stk;
char ans[
200]
;int
main()
while
(stk.
size()
)printf
("%s\n"
, s)
;printf
("%s\n"
, ans);}
return0;
}
b.佇列和棧
傳送門
解題思路:
雙端佇列模擬
**
#include
#include
#include
#include
#include
#include
#define x first
#define y second
using
namespace std;
const
int n =
105, m =
10005
;typedef
long
long ll;
typedef pair<
int,
int> pii;
int n, m;
deque<
int> q,stk;
intmain()
else
if(s ==
"pop"
)else}}
if(flag)
cout << endl;
while
(stk.
size()
) cout << endl;
}else
cout<<
"error\nerror\n";}
return0;
}
2021 GDUT 新生專題訓練
b 佇列和棧 佇列和棧是兩種重要的資料結構,它們具有push k和pop操作。push k是將數字k加入到佇列或棧中,pop則是從佇列和棧取乙個數出來。佇列和棧的區別在於取數的位置是不同的。佇列是先進先出的 把佇列看成橫向的乙個通道,則push k是將k放到佇列的最右邊,而pop則是從佇列的最左邊取...
2021 GDUT 新生專題訓練 資料結構
int stk n void push int value void pop int top int que n head 1,tail 0 void push int value void pop int front include include include include include ...
2019 GDUT 新生專題 I A
給定n個數字,計算出最短的連續子串行,使這個子串行的全部數字之和大於或等於給定數字s。如果不存在可以滿足題意的子串行則輸出0。這是經典的,相對比較容易的尺取問題,通過遍歷每乙個連續子串行即可得出答案。但是,由於時間的限制,要注意一些已經沒有意義的連續子串行和被重複計算的過程。include incl...