AT_abc333_e [ABC333E] Takahashi Quest 题解

发布时间 2023-12-17 13:04:24作者: 2020luke

AT_abc333_e [ABC333E] Takahashi Quest 题解

思路解析

可以发现一瓶药水无论什么时候拿被使用掉的时间都是不会变的,所以如果我们想让一瓶药水再背包里待得时间尽可能的短就要让它尽可能的被晚拿起来,于是我们就可以想到使用栈存下每一瓶同类的药水分别出现的时间,此时每遇到一只怪物那么它对应的栈顶就是最晚出现的药水,使用该瓶药水并打上标记。如果栈空则说明药水不够,高橋就寄了。最后统计每时每刻背包容量输出即可。

AC code

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n;
int t[N], x[N];
stack<int> st[N];	//stack[i] 代表 i 种类的药水分别出现的时间
int flag[N];
int main() {
	cin >> n;
	for(int i = 1; i <= n; i++) {
		cin >> t[i] >> x[i];
		if(t[i] == 1) {
			st[x[i]].push(i);	//存入每瓶药水出现的时间
		}
		else if(t[i] == 2) {
			if(st[x[i]].size() <= 0) {	//药水不够了
				cout << "-1";
				return 0;
			}
			flag[st[x[i]].top()] = 1;	//打上标记,记为使用该瓶药水
			st[x[i]].pop();	//药水被用掉了
		}
	}
	int cnt = 0, maxn = 0;
	for(int i = 1; i <= n; i++) {
		if(flag[i] > 0) {	//背包里多进一瓶药水
			cnt++;
			maxn = max(maxn, cnt);	//记录最大值
		}
		else if(t[i] == 2) {	//用掉一瓶药水
			cnt--;
		}
	}
	cout << maxn << "\n";
	for(int i = 1; i <= n; i++) {
		if(t[i] == 1) {
			cout << flag[i] << " ";
		}
	}
	return 0;
}