hdu1540Tunnel Warfare 线段树
2015-07-26 17:19
183 查看
//Q pos 问包含pos的连续区间的长度 //D pos 删除pos位置的元素 //R 恢复上一个被删除的元素 //用栈维护被删除的元素位置 //用线段树维护左边连续区间,右边连续区间的长度 #include<cstdio> #include<cstring> #include<iostream> #include<vector> using namespace std ; const int maxn = 500010 ; #define left v<<1 #define right v<<1|1 struct node { int l , r ; int ma_l , ma_r; }tree[maxn<<2] ; int stack[maxn] ; void build(int l , int r , int v) { tree[v].l = l ; tree[v].r = r; tree[v].ma_l = tree[v].ma_r = r - l + 1 ; if(l == r)return ; int mid = (l + r) >> 1 ; build(l , mid , left) ; build(mid + 1 , r , right) ; } void push_up(int v) { tree[v].ma_l = tree[left].ma_l ; tree[v].ma_r = tree[right].ma_r ; if(tree[v].ma_l == tree[left].r - tree[left].l + 1) tree[v].ma_l += tree[right].ma_l ; if(tree[v].ma_r == tree[right].r - tree[right].l + 1) tree[v].ma_r += tree[left].ma_r ; } int query(int v , int num) { if(tree[v].l == tree[v].r) return tree[v].ma_l ; int mid = (tree[v].l + tree[v].r) >> 1 ; if(num <= mid) { if(tree[left].r - tree[left].ma_r + 1 <= num) return tree[left].ma_r + tree[right].ma_l; else return query(left , num) ; } else { if(tree[right].l + tree[right].ma_l - 1 >= num) return tree[left].ma_r + tree[right].ma_l; else return query(right ,num) ; } } void update(int pos , int op , int v) { if(tree[v].l == tree[v].r) { tree[v].ma_l = tree[v].ma_r = op ; return ; } int mid = (tree[v].l + tree[v].r) >> 1 ; if(pos <= mid) update(pos , op , left); else update(pos , op , right) ; push_up(v) ; } int main() { // freopen("in.txt" ,"r" , stdin) ; int n , m ; while(~scanf("%d%d" , &n , &m)) { build(1 , n , 1) ; int pos ; int top = 0 ; char ch[10] ; while(m--) { scanf("%s" , ch) ; if(ch[0] == 'D') { scanf("%d" , &pos) ; stack[++top] = pos ; update(pos , 0 , 1) ; } else if(ch[0] == 'R') { if(!top)continue ; pos = stack[top--] ; update(pos , 1 , 1) ; } else { scanf("%d" , &pos) ; printf("%d\n" , query(1 , pos)) ; } } } return 0 ; }
相关文章推荐
- 莱杰:期刊进口流程(文件 ID 1591640.1)
- 查找单链表的中间节点
- Volley 简介
- 技术向:一文读懂卷积神经网络
- 使用JQuery Deferred对象的then() 解决多个AJAX操作顺序依赖的问题
- js数组转换成json数组(包含extjs的checkbox勾选项获取办法)
- [FOJ 1891] 升降序列
- WTL中CListViewCtrlT的GetItemText的实现分析
- 用Fluentd实现收集日志到HDFS(上)
- redis事务及事务乐观锁
- BFS
- 剑指offer_面试题6_重建二叉树(分解步骤,逐个击破)
- Poj 1655 Balancing Act (树的重心)
- php检测文本的编码
- Rectangle Area
- Volley 实现原理解析
- [未完]散列_散列函数
- ACdream DP专题训练
- Matrix理论与应用详解
- 人性漫画:一个人成功前和成功后赤裸裸的区别 人成功前后对比 成功人发展由来前后结果