操作数,一般用来做那些对数列进行添加、撤销操作的题。

假设一开始有一个空数列,有三个操作

(1)在数列后加一个数

(2)求数列中某位置的值

(3)撤销掉最后进行的若干次操作(1和3)

考虑建一棵树,1操作则为在当前节点下新加一个节点,2操作求数列k位置值,则为从根节点到当前节点k个节点的位置的节点

3操作撤销掉最后进行的k次操作则为回溯k个节点,同时记录回溯前的当前节点和回溯后的当前节点。

所以每次进行查询的时候,先从当前节点找父亲,一直找到根节点,记录节点个数,然后节点个数-k得到当前节点到要查询的节点的距离。

撤销操作的时候,父亲是1操作的节点就往上找父亲,父亲是3操作节点就跳到那个3操作回溯之前的那个“当前节点”

例如这道题:

总时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
262144kB
描述

给一个空数列,有M次操作,每次操作是以下三种之一:

(1)在数列后加一个数

(2)求数列中某位置的值

(3)撤销掉最后进行的若干次操作(1和3)

输入
第一行一个正整数M。
接下来M行,每行开头是一个字符,若该字符为'A',则表示一个加数操作,接下来一个整数x,表示在数列后加一个整数x;若该字符为'Q',则表示一个询问操作,接下来一个整数x,表示求x位置的值;若该字符为'U',则表示一个撤销操作,接下来一个整数x,表示撤销掉最后进行的若干次操作。
输出
对每一个询问操作单独输出一行,表示答案。
样例输入
9
A 1
A 2
A 3
Q 3
U 1
A 4
Q 3
U 2
Q 3
样例输出
3
4
3
提示
1<=M<=10^5,输入保证合法,且所有整数可用带符号32位整型存储。
#include <cstdio>
#include <iostream> const int MaxN = ;
int fa[MaxN];
//bool edge[MaxN][MaxN];
int n;
int V[MaxN];
int back[MaxN]; int main()
{
scanf("%d",&n); int now_node; char XX;
std::cin>>XX;
int xx;
scanf("%d",&xx);
now_node = ; int node_cnt = ;
V[node_cnt] = xx; for(int l = ; l <= n; l++){
char X;
std::cin>>X;
if(X == 'A'){
int nx;
scanf("%d",&nx);
V[++node_cnt] = nx;
fa[node_cnt] = now_node;
//edge[now_node][node_cnt] = 1;
now_node = node_cnt; }
else if(X == 'U'){
int nx;
scanf("%d",&nx);
int last_node = now_node;
for(int i = ; i <= nx; i++){
if(!back[now_node])
now_node = fa[now_node];
else
now_node = back[now_node]; }
back[now_node] = last_node; }
else if(X == 'Q'){
int nx;
scanf("%d",&nx); int count = ;
int tmp = now_node;
while(){
if(!fa[tmp]){
break;
}
tmp = fa[tmp];
count++;
}
count = count - nx;
tmp = now_node;
for(int i = ; i <= count; i++){
tmp = fa[tmp];
}
printf("%d\n",V[tmp]);
}
}
return ;
}

最新文章

  1. RBAC权限模型
  2. 三星首次更新Gear VR虚拟现实浏览器Samsung Internet
  3. impdp导入报错ORA-14460: only one COMPRESS or NOCOMPRESS clause may be specified
  4. 函数也是对象,本片介绍函数的属性、方法、Function()狗仔函数。
  5. 理解JavaScript中的arguments,callee,caller,apply
  6. spring的组成
  7. Python图
  8. vs查看虚函数表和类内存布局
  9. QTP插入Output Value和插入CheckPoint,注意点
  10. MS Sql 查询数据库连接数
  11. SOUI入门
  12. centos7设置httpd
  13. JVM远程调试功能
  14. springboot vue简单整合
  15. 修改 sql 提示符信息:
  16. Python类和实例方法和属性的动态绑定
  17. nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
  18. Medline Plus
  19. 腾讯云主机安装登录mysql失败--解决方案[重置root密码并实现远程连接]
  20. Python日记——nginx+Gunicorn部署你的Flask项目

热门文章

  1. 在ubuntu中安装phpstorm
  2. 深入浅出 Java Concurrency (15): 锁机制 part 10 锁的一些其它问题[转]
  3. 获取请求header的各种方法
  4. Object上的静态方法
  5. 【html、CSS、javascript-3】几个基本元素
  6. Color the ball HDU - 1556 (线段树)
  7. windows服务器nginx日志分割
  8. jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found
  9. free内存监控
  10. Struts_客户列表练习