題解 hdu4699 對頂棧

2021-08-25 11:45:07 字數 904 閱讀 4547

題目鏈結

對於i x 操作:

1.把x插入棧a;

2.更新sum[pa]=sum[pa-1]+a[pa];

3.更新f[pa]=max(f[pa-1],sum[pa])。

對於d操作,把a的棧頂出棧。

對於l操作,彈出a的棧頂,插入到b中。

對於r操作:

1.彈出b的棧頂,插入到a中。

2.更新sum[pa]=sum[pa-1]+a[pa];

3.更新f[pa]=max(f[pa-1],sum[pa])。

對於q k詢問,直接返回f[k]。

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

#define _rep(i,a,b) for(int i=(a);i<=(b);i++)

const

int n=1e6+10;

int n;

stack

a,b;

int pa,pb;

int sum[n],f[n];

char tmp[5];

int main()

else

if(tmp[0]=='d')a.pop(),pa--;

else

if(tmp[0]=='l'&&!a.empty())b.push(a.top()),a.pop(),pb++,pa--;

else

if(tmp[0]=='r'&&!b.empty())

else

if(tmp[0]=='q')}}

return

0;}

HDU4699 Editor 對頂棧,模擬

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

HDU4699 Editor(雙棧對彈)

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

hdu 4699 Editor 雙棧維護最長字首

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