SDNUOJ-1296-PPMM(模拟队列-优化)
题目
Description 假设这里有一个队列,我们可以对其进行下述操作: PUSH X:意味着将一个整数X(-2^31<X<2^31)加入到队尾。 POP:从队头删除一个数,如果队列为空则不进行操作。 MINUS:将队列中所有的数字变成其相反数。 MAX:输出队列中所有数字的最大值,如果队列为空则不进行输出。 Input 第一行包括一个整数T(T≤10),表示接下来有T组测试数据。对于每一组测试数据,第一行包括一个数N(N≤2000000),表示操作次数,接下来的N行给出具体操作。 Output 对于每一组数据,在新的一行输出MAX返回的数。每组测试数据之间输出一个空行。
样例
Sample Input 1 6 PUSH -2 MINUS PUSH -1 MAX POP MAX Sample Output 2 -1
题目分析
题意
很简单,就是自己模拟一个队列,有入队
,出队
,但是,还要求最大值
,取反
。暴力实现MAX、MINUS肯定是不行的,所以难点就在于如何优化。
思路
MINUS优化
可以用两个数组,每MINUS
一次就改变一次输入的数组,另一个数组输入相反数
。
MAX优化
用两个变量保存数组1的最大值和最小值,输出的时候判断当前操作的数组,输出MAX或-MIN。
POP
时需要判断一下,如果当前的MAX或MIN出队了,就需要重新遍历数组,找出新的MAX或MIN。
注意,此题使用了我个人的Java快速IO模板。
代码
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
AReader reader = new AReader(new BufferedInputStream(System.in));
AWriter writer = new AWriter(System.out);
int T = reader.nextInt();
int[] arr;
while (T-- > 0) {
int N = reader.nextInt();
arr = new int[N];
int sIndex = 0;
int eIndex = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
boolean negative = false;
while (N-- > 0) {
String operStr = reader.next();
char oper = operStr.charAt(1);
switch (oper) {
case 'U'://PUSH
int num = reader.nextInt();
if (!negative) {
arr[eIndex] = num;
} else {
arr[eIndex] = -num;
}
if (arr[eIndex] > max || sIndex == eIndex) {
max = arr[eIndex];
}
if (arr[eIndex] < min || sIndex == eIndex) {
min = arr[eIndex];
}
eIndex++;
break;
case 'O'://POP
if (sIndex == eIndex) {
break;
}
sIndex++;
if (arr[sIndex - 1] == max) {
max = Integer.MIN_VALUE;
for (int i = sIndex; i < eIndex; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
}
if (arr[sIndex - 1] == min) {
min = Integer.MAX_VALUE;
for (int i = sIndex; i < eIndex; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
}
break;
case 'I'://MINUS
negative = !negative;
break;
case 'A'://MAX
if (sIndex == eIndex) {
break;
}
if (!negative) {
writer.println(max);
} else {
writer.println(-min);
}
break;
}
}
writer.println("");
}
reader.close();
writer.close();
}
}
class AReader implements Closeable {
private BufferedReader reader;
private StringTokenizer tokenizer;
public AReader(InputStream inputStream) {
reader = new BufferedReader(new InputStreamReader(inputStream));
tokenizer = new StringTokenizer("");
}
private String innerNextLine() {
try {
return reader.readLine();
} catch (IOException ex) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String nextLine = innerNextLine();
if (nextLine == null) {
return false;
}
tokenizer = new StringTokenizer(nextLine);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
@Override
public void close() throws IOException {
reader.close();
}
}
class AWriter implements Closeable {
private BufferedWriter writer;
public AWriter(OutputStream outputStream) {
writer = new BufferedWriter(new OutputStreamWriter(outputStream));
}
public void println(Object object) throws IOException {
writer.write(object.toString());
writer.write("\n");
}
@Override
public void close() throws IOException {
writer.close();
}
}
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
AReader reader = new AReader(new BufferedInputStream(System.in));
AWriter writer = new AWriter(System.out);
int T = reader.nextInt();
int[] arr;
while (T-- > 0) {
int N = reader.nextInt();
arr = new int[N];
int sIndex = 0;
int eIndex = 0;
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
boolean negative = false;
while (N-- > 0) {
String operStr = reader.next();
char oper = operStr.charAt(1);
switch (oper) {
case 'U'://PUSH
int num = reader.nextInt();
if (!negative) {
arr[eIndex] = num;
} else {
arr[eIndex] = -num;
}
if (arr[eIndex] > max || sIndex == eIndex) {
max = arr[eIndex];
}
if (arr[eIndex] < min || sIndex == eIndex) {
min = arr[eIndex];
}
eIndex++;
break;
case 'O'://POP
if (sIndex == eIndex) {
break;
}
sIndex++;
if (arr[sIndex - 1] == max) {
max = Integer.MIN_VALUE;
for (int i = sIndex; i < eIndex; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
}
if (arr[sIndex - 1] == min) {
min = Integer.MAX_VALUE;
for (int i = sIndex; i < eIndex; i++) {
if (arr[i] < min) {
min = arr[i];
}
}
}
break;
case 'I'://MINUS
negative = !negative;
break;
case 'A'://MAX
if (sIndex == eIndex) {
break;
}
if (!negative) {
writer.println(max);
} else {
writer.println(-min);
}
break;
}
}
writer.println("");
}
reader.close();
writer.close();
}
}
class AReader implements Closeable {
private BufferedReader reader;
private StringTokenizer tokenizer;
public AReader(InputStream inputStream) {
reader = new BufferedReader(new InputStreamReader(inputStream));
tokenizer = new StringTokenizer("");
}
private String innerNextLine() {
try {
return reader.readLine();
} catch (IOException ex) {
return null;
}
}
public boolean hasNext() {
while (!tokenizer.hasMoreTokens()) {
String nextLine = innerNextLine();
if (nextLine == null) {
return false;
}
tokenizer = new StringTokenizer(nextLine);
}
return true;
}
public String next() {
hasNext();
return tokenizer.nextToken();
}
public int nextInt() {
return Integer.parseInt(next());
}
@Override
public void close() throws IOException {
reader.close();
}
}
class AWriter implements Closeable {
private BufferedWriter writer;
public AWriter(OutputStream outputStream) {
writer = new BufferedWriter(new OutputStreamWriter(outputStream));
}
public void println(Object object) throws IOException {
writer.write(object.toString());
writer.write("\n");
}
@Override
public void close() throws IOException {
writer.close();
}
}
import java.io.*; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { AReader reader = new AReader(new BufferedInputStream(System.in)); AWriter writer = new AWriter(System.out); int T = reader.nextInt(); int[] arr; while (T-- > 0) { int N = reader.nextInt(); arr = new int[N]; int sIndex = 0; int eIndex = 0; int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; boolean negative = false; while (N-- > 0) { String operStr = reader.next(); char oper = operStr.charAt(1); switch (oper) { case 'U'://PUSH int num = reader.nextInt(); if (!negative) { arr[eIndex] = num; } else { arr[eIndex] = -num; } if (arr[eIndex] > max || sIndex == eIndex) { max = arr[eIndex]; } if (arr[eIndex] < min || sIndex == eIndex) { min = arr[eIndex]; } eIndex++; break; case 'O'://POP if (sIndex == eIndex) { break; } sIndex++; if (arr[sIndex - 1] == max) { max = Integer.MIN_VALUE; for (int i = sIndex; i < eIndex; i++) { if (arr[i] > max) { max = arr[i]; } } } if (arr[sIndex - 1] == min) { min = Integer.MAX_VALUE; for (int i = sIndex; i < eIndex; i++) { if (arr[i] < min) { min = arr[i]; } } } break; case 'I'://MINUS negative = !negative; break; case 'A'://MAX if (sIndex == eIndex) { break; } if (!negative) { writer.println(max); } else { writer.println(-min); } break; } } writer.println(""); } reader.close(); writer.close(); } } class AReader implements Closeable { private BufferedReader reader; private StringTokenizer tokenizer; public AReader(InputStream inputStream) { reader = new BufferedReader(new InputStreamReader(inputStream)); tokenizer = new StringTokenizer(""); } private String innerNextLine() { try { return reader.readLine(); } catch (IOException ex) { return null; } } public boolean hasNext() { while (!tokenizer.hasMoreTokens()) { String nextLine = innerNextLine(); if (nextLine == null) { return false; } tokenizer = new StringTokenizer(nextLine); } return true; } public String next() { hasNext(); return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } @Override public void close() throws IOException { reader.close(); } } class AWriter implements Closeable { private BufferedWriter writer; public AWriter(OutputStream outputStream) { writer = new BufferedWriter(new OutputStreamWriter(outputStream)); } public void println(Object object) throws IOException { writer.write(object.toString()); writer.write("\n"); } @Override public void close() throws IOException { writer.close(); } }