HDU4699 Editor(雙棧對彈)

2021-10-04 02:48:56 字數 1432 閱讀 1976

題目鏈結

1.題目大意:文字編譯游標。有如下操作:(1)每次在游標後插入乙個元素,游標隨即移動到序列尾部(2)在游標前面有元素的情況下刪除游標的前乙個元素(三)如果游標不在序列頭部就將游標左移(四)如果游標不在序列尾部就將游標右移(五)查詢當前游標前的最大字首和

2.第一眼想到,用陣列維護所有元素的字首和和最大字首和,使用雙向鍊錶維護游標。但是頭疼的是游標並不指向元素,而是在元素中間,類似電腦滑鼠的游標。而且雙向鍊錶寫起來很麻煩。雖然鍊錶是資料結構的基礎,但是實際上能不寫鍊錶就不寫鍊錶。這裡我第一次了解到棧的強大之處:雙棧對彈

3.如下圖,兩個棧構成了整個序列,初始時如果游標沒有移動右棧永遠是空的,那麼不斷插入就不斷向左棧push即可,游標如我們所期待那樣移動:

如果我們要刪除元素,顯然直接從左棧刪除即可,游標也會如我們所料移動

如果讓游標左移,那麼將左棧棧頂彈出並push到右棧棧頂:

同理游標右移,游標的變化也如我們期望

4.至於字首和,兩個陣列維護即可,每次查詢輸出當前左棧長度最大字首和。不難發現我們只要維護左棧長度即可,插入和右棧左彈實現原理一樣,更新當前最大字首和。刪除的話sz–即可

5.其實雙向鍊錶也沒有那麼麻煩,用陣列模擬雙向鍊錶即可,就是容易把人搞暈。但是能多學乙個技能還是要多學,這個黑科技確實強大!

**:

#include 

#include

#include

using namespace std;

#define inf 0x3f3f3f3f

const

int maxn=

1e6+10;

typedef long

long ll;

struct stack

void

push

(ll x)

void

pop(

) ll top()

intsize()

intempty()

};ll sum[maxn]

,max[maxn]

;stack l,r;

intmain()

else

if(op==

'd')

}else

if(op==

'l')

}else

if(op==

'r')

}else

if(op==

'q')}}

return0;

}

hdu 4699 Editor 雙棧維護最長字首

今天上午看了解題報告,突然覺得好簡單,還是接觸的少了,思路不開闊,想不到好的思路。思路 用兩個棧分別維護游標的前後,用陣列記錄游標前的棧的最大字首和!include include include include include include include include include inc...

HDU4699 Editor 對頂棧,模擬

hdu4699 editor 大致思路 建立兩個棧a,b。a棧儲存序列開頭到當前游標位置的這一段子串行,b儲存當前游標位置到序列結尾這一段子串行。用陣列f維護棧a的字首和的最大值,sum用來記錄字首和的值。對於操作i,把x插入棧a,並且更新f pa sum pa 的值,對於操作d,把a的棧頂出棧,對...

HUD4699 Editor 模擬 陣列處理

這道題目的題意很明確,給你五種操作,然後針對每次查詢輸出查詢的第k個數字之前所有1 m m k m個數字之和最大的值。有插入的題目用鍊錶挺好做的,不過這裡我用的是乙個陣列,用cnt記錄游標位置,因為查詢只查詢游標左邊邊的值 所以後面如果查詢大於cnt,則置為cnt 所以我們想到每次插入乙個值就更新一...