题意:有三种操作,1,代表加入数字,2,代表拿出数字,3,代表撤销第i个操作
思路:正着模拟会超时,因为有无限的撤销操作需要递归到上方,所以我们先倒着把撤销的操作都标记下,然后正着模拟(不需要撤销)就好了。
初想3要递归到上面,后来才明白:一旦撤销了某操作,那么那个操作就失去了作用,不用再执行,也就没有了递归的操作,直接判断每一个撤销,然后他撤销的操作无效不需要执行就好。
关于1,2要正着模拟,不然先拿出来再放进去什么的还要判断
代码:
#include<cstdio>
#include<cstring>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[51005],b[51000],biao[51000];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
memset(biao,0,sizeof(biao));
scanf("%d %d",&n,&m);
for(int i=1; i<=m; i++)