2021 GDUT 新生專題訓練 資料結構

2021-10-22 16:55:27 字數 3933 閱讀 5772

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

#include

#include

#include

#include

#define mod 998244353

#define pi acos(-1)

#define inf 0x7fffffff

#define ll long long

using

namespace std;

ll read()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int n,blo;

int v[

50005

],bl[

50005

],atag[

50005];

vector<

int>ve[

505]

;void

reset

(int x)

void

add(

int a,

int b,

int c)

for(

int i=bl[a]+1

;i<=bl[b]-1

;i++

) atag[i]

+=c;

}int

query

(int a,

int b,

int c)

return ans;

}int

main()

for(

int i=

1;i<=bl[n]

;i++

)sort

(ve[i]

.begin()

,ve[i]

.end()

);for(

int i=

1;i<=n;i++

)return0;

}

a - 擴號匹配問題

在某個字串(長度不超過100)中有左括號、右括號和大小寫字母;規定(與常見的算數式子一樣)任何乙個左括號都從內到外與在它右邊且距離最近的右括號匹配。寫乙個程式,找到無法匹配的左括號和右括號,輸出原來字串,並在下一行標出不能匹配的括號。不能匹配的左括號用"$「標註,不能匹配的右括號用」?"標註.

input
輸入包括多組資料,每組資料一行,包含乙個字串,只包含左右括號和大小寫字母,字串長度不超過100

注意:cin.getline(str,100)最多只能輸入99個字元!

output
對每組輸出資料,輸出兩行,第一行包含原始輸入字元,第二行由"","

?"和空

格組成,

"","?"和空格組成,"

","?"和

空格組成

,"「和」?"表示與之對應的左括號和右括號不能匹配。

樣例

input

((abcd(x)

)(rttyy())sss)(

output
((abcd(x)

$$)(rttyy())sss)(

? ?$

思路
標準棧模板題 遇到)就判斷棧內是否有(,有就彈出,沒有就標記
**
#include

#include

#include

using

namespace std;

int main (

)else

if(a[i]

==')')}

} cout << a << endl << res << endl;

}}

b - 佇列和棧

佇列和棧是兩種重要的資料結構,它們具有push k和pop操作。push k是將數字k加入到佇列或棧中,pop則是從佇列和棧取乙個數出來。佇列和棧的區別在於取數的位置是不同的。

佇列是先進先出的:把佇列看成橫向的乙個通道,則push k是將k放到佇列的最右邊,而pop則是從佇列的最左邊取出乙個數。

棧是後進先出的:把棧也看成橫向的乙個通道,則push k是將k放到棧的最右邊,而pop也是從棧的最右邊取出乙個數。

假設佇列和棧當前從左至右都含有1和2兩個數,則執行push 5和pop操作示例圖如下:

​ push 5 pop

佇列 1 2 -------> 1 2 5 ------> 2 5

​ push 5 pop

棧 1 2 -------> 1 2 5 ------> 1 2

現在,假設佇列和棧都是空的。給定一系列push k和pop操作之後,輸出佇列和棧中存的數字。若佇列或棧已經空了,仍然接收到pop操作,則輸出error。

input
第一行為m,表示有m組測試輸入,m<100。

每組第一行為n,表示下列有n行push k或pop操作。(n<150)

接下來n行,每行是push k或者pop,其中k是乙個整數。

(輸入保證同時在佇列或棧中的數不會超過100個)

output
對每組測試資料輸出兩行,正常情況下,第一行是佇列中從左到右存的數字,第二行是棧中從左到右存的數字。若操作過程中佇列或棧已空仍然收到pop,則輸出error。輸出應該共2*m行。

樣例

input

2

4push 1

push 3

poppush 5

1pop

output
3 5

1 5error

error

思路
模擬操作下就好

棧需要從頭開始遍歷,輸出而非標準的邊top邊pop

**
#include

#include

#include

using

namespace std;

int stack[

1010

], stop =0;

void spush (

int t)

void spop (

)bool sempty (

)int main (

)else

if(opt ==

"pop")}

if(qerror)

else

cout << endl;}if

(serror)

else

cout << endl;}}

return0;

}

2021 GDUT 新生專題訓練

資料結構是利器,可以靈活運用,解決各種複雜的問題。具體內容太多不必列舉,關鍵還是思維。分析一道經典的例題 維護數列 傳送門 題目大意 給出乙個序列,要求支援插入 刪除 修改 翻轉 求和 求最大子列和。輸入運算元n 0 n 5e5 運算元量m 1 m 2e4 時間限制 1s,空間限制 128m 看我四...

2021 GDUT 新生專題訓練

b 佇列和棧 佇列和棧是兩種重要的資料結構,它們具有push k和pop操作。push k是將數字k加入到佇列或棧中,pop則是從佇列和棧取乙個數出來。佇列和棧的區別在於取數的位置是不同的。佇列是先進先出的 把佇列看成橫向的乙個通道,則push k是將k放到佇列的最右邊,而pop則是從佇列的最左邊取...

2019 GDUT 新生專題 I A

給定n個數字,計算出最短的連續子串行,使這個子串行的全部數字之和大於或等於給定數字s。如果不存在可以滿足題意的子串行則輸出0。這是經典的,相對比較容易的尺取問題,通過遍歷每乙個連續子串行即可得出答案。但是,由於時間的限制,要注意一些已經沒有意義的連續子串行和被重複計算的過程。include incl...