高级打字机【主席树】【滚动数组】【块状链表】
生活随笔
收集整理的這篇文章主要介紹了
高级打字机【主席树】【滚动数组】【块状链表】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:
一個計算機支持一下三中操作:
TT xx:在文章末尾打下一個小寫字母xx。
UU xx:撤銷最后的xx次修改操作。
QQ xx:詢問當前文章中第xx個字母并輸出。
InputInput
OutputOutput
b c思路:
IOI題目。。。
正解是主席樹(當然啦什么TrieTrie+倍增法尋祖,可持久化跳表,可持久化塊狀數組無敵的東西都可以做)。
但是本蒟蒻是用滾動數組水過了這道題。
本題有三個階段:
階段33就直接放棄了 畢竟我還不會主席樹。
那么對于階段11,我們只要模擬堆,就可以很簡單地得到這部分分。
對于階段二,我們也要把它分為兩部分。
我們可以開一個長度為100000100000的ansistringansistring數組ss,s[i]s[i]表示第ii種情況。再開一個sumsum,表示第幾種情況。這樣,當我們遇到UU操作時,把前面xx個操作還原,其實就是不做前xx個操作,直接賦值為s[sum-x-1]。這樣可以得到90分。
但是這樣會MLE,ss數組開的太大了。所以我們要用滾動數組來優化。每次將sumsum%2000020000就可以了。
代碼:
const k=20000; //滾動數組,其他與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.轉載于:https://www.cnblogs.com/hello-tomorrow/p/9313035.html
總結
以上是生活随笔為你收集整理的高级打字机【主席树】【滚动数组】【块状链表】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLSQL Developer概念学习系
- 下一篇: 使用 class-dump 扫描 app