【JZOJ】【對頂棧】數列編輯器

LinkLink

JZOJJZOJ 39223922

DescriptionDescription

在這裏插入圖片描述

InputInput

第一行包含一個數字N,表示操作的個數。
接下來包含N 行,每行包含一條命令。

OutputOutput

對於每個Q k 命令,輸出一個整數表示這個操作的答案。

SampleSample InputInput

8
I 2
I -1
I 1
Q 3
L
D
R
Q 2

SampleSample OutputOutput

2
3

HintHint

• 對於50% 的數據,N <= 1000。
• 對於80% 的數據,N <= 100000。
• 對於100% 的數據,N <= 1000000,插入的數字絕對值大小不會超過1000。

TrainTrain ofof ThoughtThought

對頂棧,前一個棧記錄數列光標前的數, 後一個棧記錄數列光標後的數,棧頂都是光標方向,這樣一來,操作就很容易了:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
f[i]iatopabtopbf[i]表示前i個最大前綴和, atop表示棧a的棧頂, btop表示棧b的棧頂

CodeCode

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;

char c;
int atop, btop;
int n, a[1000005], b[1000005];
int f[1000005], sum[1000005];

int read() 
{
	int x = 0, flag = 1; char ch = getchar();
	while (ch < '0' || ch > '9') { if (ch == '-') flag = -1;ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
	return x * flag;
}//快讀

char readx() 
{
	char ch = getchar();
	while (ch != 'I' && ch != 'D' && ch != 'L' && ch != 'R' && ch != 'Q') ch = getchar(); 
	return ch;
}

int main()
{
	f[0] = -1e9;
	n = read(); 
	for (int i = 1; i <= n; ++i)
	{
		int x;
		c = readx(); 
		if (c == 'I')
		{
			x = read();
			a[++atop] = x;
			sum[atop] =sum[atop - 1] + x;
			f[atop] = max(f[atop - 1], sum[atop]);
		}
		if (c == 'D') atop--;
		if (c == 'L') {
			b[++btop] = a[atop];
			atop--;
		}
		if (c == 'R') {
			a[++atop] = b[btop];
			btop--;
			sum[atop] = sum[atop - 1] + a[atop];
			f[atop] = max(f[atop - 1], sum[atop]);
		}
		if (c == 'Q') {
			int k;
			k = read();
			printf("%d\n", f[k]);
		}
	}
} 
發佈了224 篇原創文章 · 獲贊 35 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章