高级打字机【主席树】【滚动数组】【块状链表】
題目大意:
一個(gè)計(jì)算機(jī)支持一下三中操作:
TT xx:在文章末尾打下一個(gè)小寫字母xx。
UU xx:撤銷最后的xx次修改操作。
QQ xx:詢問當(dāng)前文章中第xx個(gè)字母并輸出。
InputInput
OutputOutput
b c思路:
IOI題目。。。
正解是主席樹(當(dāng)然啦什么TrieTrie+倍增法尋祖,可持久化跳表,可持久化塊狀數(shù)組無敵的東西都可以做)。
但是本蒟蒻是用滾動(dòng)數(shù)組水過了這道題。
本題有三個(gè)階段:
階段33就直接放棄了 畢竟我還不會(huì)主席樹。
那么對(duì)于階段11,我們只要模擬堆,就可以很簡(jiǎn)單地得到這部分分。
對(duì)于階段二,我們也要把它分為兩部分。
我們可以開一個(gè)長(zhǎng)度為100000100000的ansistringansistring數(shù)組ss,s[i]s[i]表示第ii種情況。再開一個(gè)sumsum,表示第幾種情況。這樣,當(dāng)我們遇到UU操作時(shí),把前面xx個(gè)操作還原,其實(shí)就是不做前xx個(gè)操作,直接賦值為s[sum-x-1]。這樣可以得到90分。
但是這樣會(huì)MLE,ss數(shù)組開的太大了。所以我們要用滾動(dòng)數(shù)組來優(yōu)化。每次將sumsum%2000020000就可以了。
代碼:
const k=20000; //滾動(dòng)數(shù)組,其他與90分代碼一樣。 varsum,n,i,j,x:longint;s:array[1..k] of ansistring;ch,orz:char; beginreadln(n);for i:=1 to n dobeginread(ch,orz);if ch='T' thenbeginreadln(ch);inc(sum);s[sum mod k]:=s[(sum-1)mod k]+ch;end;if ch='Q' thenbeginreadln(x);writeln(s[sum mod k][x]);end;if ch='U' thenbeginreadln(x);inc(sum);s[sum mod k]:=s[(sum-1-x) mod k];end;end; end.轉(zhuǎn)載于:https://www.cnblogs.com/hello-tomorrow/p/9313035.html
總結(jié)
以上是生活随笔為你收集整理的高级打字机【主席树】【滚动数组】【块状链表】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLSQL Developer概念学习系
- 下一篇: 使用 class-dump 扫描 app