棧_應用_HDOJ4699_Editor
阿新 • • 發佈:2018-12-19
思路分析:
考慮引入四個儲存整數的棧, 游標左側和游標右側的整數序列分別對應棧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; } } }