日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

高级打字机【主席树】【滚动数组】【块状链表】

發(fā)布時(shí)間:2025/5/22 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高级打字机【主席树】【滚动数组】【块状链表】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:
一個(gè)計(jì)算機(jī)支持一下三中操作:
TT xx:在文章末尾打下一個(gè)小寫字母xx
UU xx:撤銷最后的xx次修改操作。
QQ xx:詢問當(dāng)前文章中第xx個(gè)字母并輸出。
InputInput

7 T a T b T c Q 2 U 2 T c Q 2

OutputOutput

b c

思路:
IOI題目。。。
正解是主席樹(當(dāng)然啦什么TrieTrie+倍增法尋祖,可持久化跳表,可持久化塊狀數(shù)組無敵的東西都可以做)。
但是本蒟蒻是用滾動(dòng)數(shù)組水過了這道題。


本題有三個(gè)階段:

  • 對(duì)于5050%的數(shù)據(jù) n100000n≤100000;保證UU操作不會(huì)撤銷UU操作.
  • 對(duì)于100100%的數(shù)據(jù) n100000n≤100000UU操作可以撤銷UU操作。
  • IOIIOI挑戰(zhàn):必須使用在線算法完成該題。
  • 階段33就直接放棄了 畢竟我還不會(huì)主席樹。
    那么對(duì)于階段11,我們只要模擬堆,就可以很簡(jiǎn)單地得到這部分分。

    vartail,n,i,j,x:longint;c:array[1..100000] of char; //模擬堆ch,orz:char; beginreadln(n);for i:=1 to n dobeginread(ch,orz);if ch='T' then //插入begininc(tail); readln(c[tail]); //放入堆頂end;if ch='Q' then //詢問beginreadln(x);writeln(c[x]); //輸出第i位end;if ch='U' then //刪除beginreadln(x);dec(tail,x) //將最后x位輸出end;end; end.

    對(duì)于階段二,我們也要把它分為兩部分。
    我們可以開一個(gè)長(zhǎng)度為100000100000ansistringansistring數(shù)組sss[i]s[i]表示第ii種情況。再開一個(gè)sumsum,表示第幾種情況。這樣,當(dāng)我們遇到UU操作時(shí),把前面xx個(gè)操作還原,其實(shí)就是不做前xx個(gè)操作,直接賦值為s[sum-x-1]。這樣可以得到90分。

    varsum,n,i,j,x:longint;s:array[1..100000] of ansistring;ch,orz:char; beginreadln(n);for i:=1 to n dobeginread(ch,orz);if ch='T' thenbeginreadln(ch);inc(sum);s[sum]:=s[sum-1]+ch; //儲(chǔ)存情況end;if ch='Q' thenbeginreadln(x);writeln(s[sum][x]); //輸出現(xiàn)在的情況的第x位end;if ch='U' thenbeginreadln(x);inc(sum); //也算一種情況s[sum]:=s[sum-1-x]; //直接取第sum-1-x位end;end; end.

    但是這樣會(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。