首页 > 代码库 > 11.12模拟考T1(可持续优化)PS:神奇的东西
11.12模拟考T1(可持续优化)PS:神奇的东西
1.数列操作
(array.pas/c/cpp)
【问题描述】
现在有一个数列,最初包含0个数。现在要对数列操作n次,操作有3类。
1) a k,在数列的最后插入一个整数k
2) s 将最近插入的数删除。
3) t k 将数列恢复第k次操作前的状态
下面是一个例子,有12个操作
1 a 5 -> [5] => 5 加入数5
2 a 3 -> [5,3] => 3 加入数3
3 a 7 -> [5,3,7] => 7 加入数7
4 s -> [5,3] => 3 删除数7
5 t 2 -> [5] => 5 回到操作2之前
6 a 2 -> [5,2] => 2 加入数2
7 t 4 -> [5,3,7] => 7 回到操作4之前
8 a 4 -> [5,3,7,4] => 4 加入数4
9 s -> [5,3,7] => 7 删除数4
10 t 7 -> [5,2] => 2 回到操作7之前
11 s -> [5] => 5 删除数2
12 s -> [] => -1 删除数5,数列空,输出-1.
【输入】
第一行一个整数N。
接下来N行,每行一个命令,格式如题目描述。
【输出】
N行,每次输出数列最后一个数的值,如果数列为空,输出-1。
【输入输出样例1】
array.in | array.out |
12 a 5 a 3 a 7 s t 2 a 2 t 4 a 4 s t 7 s s | 5 3 7 3 5 2 7 4 7 2 5 -1 |
【数据范围】
40% N<=100
60% N<=5000
100% 1 <= N <= 80,000 ,1 <= K <= 1,000,000.
思路:
前两个询问很水,但是第三个询问就有技术含量了。
60%可以用二维数组来搞;是80000的数据二维数组是存不下的。
那么问题来了。
怎样才能保存各种版本的栈。
当!当!!当!!!
“可持续优化”闪亮登场。
什么是“可持续优化”?
就是用邻接表一样的东西。把每一次更新的状态储存,以便下一次调用。
就是酱紫:
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<string> 5 #include<cstdio> 6 #include<cstdlib> 7 #include<algorithm> 8 #include<ctime> 9 #include<queue>10 #include<iomanip>11 using namespace std;12 const int maxn=500001;13 char q;14 int n,k,top=0;15 int len=0,linkk[maxn];16 int a[maxn];17 struct node18 {19 int x,y;20 }e[maxn];21 22 23 /*void init(int xx,int yy)24 {25 e[++len].y=linkk[xx];linkk[xx]=len;26 e[len].x=yy;27 }*/28 29 int main()30 {31 freopen("array.in","r",stdin);32 freopen("array.out","w",stdout);33 ios::sync_with_stdio(false);34 cin>>n;35 for(int i=1;i<=n;i++)36 {37 cin>>q;38 if(q==‘a‘)39 {40 cin>>k;41 a[++top]=k;42 e[i].x=e[i-1].y;e[i].y=top;43 linkk[top]=e[i].x;44 }45 if(q==‘s‘)46 {47 e[i].x=e[i-1].y;e[i].y=linkk[e[i-1].y];48 }49 if(q==‘t‘)50 {51 cin>>k;52 e[i].x=e[i-1].y;53 e[i].y=e[k].x;54 }55 if(a[e[i].y]==0)56 cout<<"-1"<<endl;57 else58 cout<<a[e[i].y]<<endl;59 }60 return 0;61 }
11.12模拟考T1(可持续优化)PS:神奇的东西