高階打字機 主席樹 滾動陣列 塊狀鍊錶

2022-09-03 07:03:08 字數 3552 閱讀 9030

題目大意:

乙個計算機支援一下三中操作:

t'>t

t x

'>x

x:在文章末尾打下乙個小寫字母x

'>xx。

u'>u

u x

'>x

x:撤銷最後的x

'>x

x次修改操作。

q'>qq x

'>x

x:詢問當前文章中第x

'>x

x個字母並輸出。 in

put'>inp

utinput

7

t at b

t cq 2

u 2t c

q 2

out

put'>out

putoutput

b

c

思路:

ioi題目。。。

正解是主席樹(當然啦什麼tri

e'>tri

etrie

+倍增法尋祖,可持久化跳表,可持久化塊狀陣列無敵的東西都可以做)。

但是本蒟蒻是用滾動陣列水過了這道題。

本題有三個階段:

對於50

'>50

50%的資料 n

≤100000

'>n

≤100000

n≤100000

;保證u

'>u

u操作不會撤銷u

'>u

u操作.

對於100

'>100

100%的資料 n

≤100000

'>n

≤100000

n≤100000

;u'>u

u操作可以撤銷u

'>u

u操作。io

i'>ioi

ioi階段3

'>3

3就直接放棄了 畢竟我還不會主席樹。

那麼對於階段1

'>1

1,我們只要模擬堆,就可以很簡單地得到這部分分。

var

tail,n,i,j,x:longint;

c:array[1..100000] of char; //模擬堆

ch,orz:char;

begin

readln(n);

for i:=1

to n do

begin

read(ch,orz);

if ch='t'

then

//插入

begin

inc(tail);

readln(c[tail]); //放入堆頂

end;

if ch='q'

then

//詢問

begin

readln(x);

writeln(c[x]); //輸出第i位

end;

if ch='u'

then

//刪除

begin

readln(x);

dec(tail,x) //將最後x位輸出

end;

end;

end.

對於階段二,我們也要把它分為兩部分。

我們可以開乙個長度為100000

'>100000

100000的an

sist

ring

'>ans

istr

ingansistring

陣列s'>ss,s

[i]'>s[i

]s[i]

表示第i

'>i

i種情況。再開乙個sum

'>sum

sum,表示第幾種情況。這樣,當我們遇到u

'>u

u操作時,把前面x

'>x

x個操作還原,其實就是不做前x

'>x

x個操作,直接賦值為s[sum-x-1]。這樣可以得到90分。

s[sum]:=s[sum-1]+ch; //儲存情況

end;

if ch='q'

then

begin

readln(x);

writeln(s[sum][x]); //輸出現在的情況的第x位

end;

if ch='u'

then

begin

readln(x);

inc(sum); //也算一種情況

s[sum]:=s[sum-1-x]; //直接取第sum-1-x位

end;

end;

end.

但是這樣會mle,s

'>s

s陣列開的太大了。所以我們要用滾動陣列來優化。每次將sum

'>sum

sum%20000

'>20000

20000

就可以了。

**:

const 

k=20000; //滾動陣列,其他與90分**一樣。

var sum,n,i,j,x:longint;

s:array[1..k] of ansistring;

ch,orz:char;

begin

readln(n);

for i:=1

to n do

begin

read(ch,orz);

if ch='t'

then

begin

readln(ch);

inc(sum);

s[sum mod k]:=s[(sum-1)mod k]+ch;

end;

if ch='q'

then

begin

readln(x);

writeln(s[sum mod k][x]);

end;

if ch='u'

then

begin

readln(x);

inc(sum);

s[sum mod k]:=s[(sum-1-x) mod k];

end;

end;

end.

高階打字機

早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 t x 在文章末尾打下乙個小寫字母x。type操作 u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 q x 詢問當前文章中第x個字...

高階打字機

題目描述 請為一種高階打字機設計乙個程式,支援如下3種操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 文章一開始可以視為空串。輸入描述 第1行 乙個整數n,表示運算元量。以下n行,每行乙個命令。保證輸入的命令合法。輸出描述 每行輸出乙個字母,表示query操...

高階打字機

題目描述 早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 1.t x 在文章末尾打下乙個小寫字母x。type操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 3.q x ...