1. 程式人生 > >棧_應用_HDOJ4699_Editor

棧_應用_HDOJ4699_Editor

思路分析:

    考慮引入四個儲存整數的棧, 游標左側和游標右側的整數序列分別對應棧L和棧R,  L的棧頂為游標左側的數, R的棧頂為游標右側的數, 可將游標的左右移動和元素刪除操作轉換為對L和R的出入棧操作, 此外為在O(1)時間返回(Q, k)的值, 考慮對棧L維持兩個用於儲存整數的棧H和棧Y, 其中H[k]為L從棧底向上k的元素的字首和,  Y[k]即為(Q, k)的值, 此處Y[0]對應Y的棧底. 特別需要注意的是, 每執行一次插入操作, 游標後移一位(相當於在游標之前插入), 下面給出AC程式碼:

//HDOJ4699_Editor
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX = 1e6 + 5, NIL = 0x3f3f3f3f;
int L[MAX], ltop, R[MAX], rtop, H[MAX], htop, Y[MAX], ytop, Q; 
int main(){
	while(~scanf("%d", &Q)){
		ltop = rtop = htop = ytop = 0, H[0] = 0, Y[0] = -NIL; char ch[10]; int num;
		while(Q--){
			scanf("%s", ch + 1);
			if(ch[1] == 'I')
				scanf("%d", &num), L[++ltop] = num
				, H[++htop] = H[ltop - 1] + L[ltop]
				, Y[++ytop] = max(H[ltop], Y[ltop - 1]);
			else if(ch[1] == 'D') {
				if(ltop) --ltop, --htop, --ytop;
			} 
			else if(ch[1] == 'L') {
				if(ltop) R[++rtop] = L[ltop--], --htop, --ytop;
			}
			else if(ch[1] == 'R'){
				if(rtop) 
					L[++ltop] = R[rtop--]
					, H[++htop] = H[ltop - 1] + L[ltop]
					, Y[++ytop] = max(H[ltop], Y[ltop - 1]);
			}
			else scanf("%d", &num), cout << Y[num] << endl;
		}
	}
}