題目鏈結
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 所以我們想到每次插入乙個值就更新一...