题目大意:

就是给定一堆位置,进行删除还原,最后找到 t 位置上的最大连续位置

 #include <cstdio>
#include <cstring>
#include <iostream> using namespace std;
const int N = ; struct Node{
int l , r , ml , mr , ma; //ml左最长,mr右最长,ma总最长
}tree[N<<]; void build(int o , int l , int r)
{
tree[o].l = l;
tree[o].r = r;
tree[o].ml = r - l + ;
tree[o].mr = r - l + ;
tree[o].ma = r - l + ;
int m = (l + r) / ;
if(l == r) return ;
build(o<< , l , m);
build(o<<| , m+ , r);
} void push_up(int o)
{
int ls = o<< , rs = o<<|;
tree[o].ml = tree[ls].ml;
tree[o].mr = tree[rs].mr; if(tree[ls].ml == (tree[ls].r - tree[ls].l + ))
tree[o].ml = tree[ls].ml + tree[rs].ml; if(tree[rs].mr == (tree[rs].r - tree[rs].l + ))
tree[o].mr = tree[ls].mr + tree[rs].mr; tree[o].ma = max(tree[ls].mr + tree[rs].ml , tree[rs].ma);
tree[o].ma = max(tree[ls].ma , tree[o].ma);
} void update(int o , int t , int v)
{
if(tree[o].l == tree[o].r){
if(v == ) tree[o].ma = tree[o].ml = tree[o].mr = ;
else tree[o].ma = tree[o].ml = tree[o].mr = ;
return ;
}
int ls = o<< , rs = o<<|;
int m = (tree[o].l + tree[o].r) / ; if(t <= m) update(ls , t , v);
else update(rs , t , v);
//要等下层更新完才能递归回去更新上层
push_up(o);
} int query(int o , int t)
{
int ls = o<< , rs = o<<| , m = (tree[o].l + tree[o].r) / ;
if(tree[o].l == tree[o].r || tree[o].ma == || tree[o].ma == tree[o].r - tree[o].l + )
return tree[o].ma; if(t <= m){
/*此时t属于左子树,那么存在t只属于左子树区间,和属于左右子树合并的区间
,弱属于合并的区间,那么要保证,t到左子树右端点形成的连续的个数要小于
左子树最大右端连续和
也就是 m - t + 1 <= tree[ls].mr (这里m也等于tree[ls].r)
*/
if(t >= tree[ls].r - tree[ls].mr + )
return query(ls , t) + query(rs , m+);
else return query(ls , t);
}else{
if(t <= tree[rs].l + tree[rs].ml - )
return query(ls , m) + query(rs , t);
else query(rs , t);
}
} int que[N] , top; int main()
{
// freopen("a.in" , "r" , stdin);
int n,m;
char str[];
int x;
while(scanf("%d%d",&n,&m)!=EOF){
build(,,n);
top=;
while(m--)
{
scanf("%s",str);
if(str[]=='D'){
scanf("%d",&x);
que[top++]=x;
update(,x,);
}
else if(str[]=='Q'){
scanf("%d",&x);
printf("%d\n",query(,x));
}
else{
if(x>){
x=que[--top];
update(,x,);
}
}
}
}
return ;
}

最新文章

  1. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍
  2. Python中sorted()方法
  3. Delphi的属性Property
  4. yii2知识点理解(成员属性)
  5. hdu 3123
  6. 折腾gnome3.4
  7. HDU4712+随机算法
  8. github上一些觉得对自己工作有用的项目收集
  9. elasticsearch的5种分片查询优先级
  10. websocket简单实例
  11. Table的两种处理方法记录
  12. 详解Vue 开发模式下跨域问题
  13. 功能强大的swiper插件
  14. (转)Python3异常-AttributeError: module &#39;sys&#39; has no attribute &#39;setdefaultencoding
  15. Android Studio项目提交(或更新)到github的方法
  16. asp.net webapi http请求生命周期
  17. codevs 1462 素数和
  18. par函数usr参数-控制坐标系的范围
  19. ZOJ-3319
  20. Convert Sorted List to Binary Search Tree&amp;&amp;Convert Sorted Array to Binary Search Tree——暴力解法

热门文章

  1. sqlalchemy配置多读写库多连接后的关系设置
  2. Winform执行CMD命令
  3. 题解报告:hdu 1015 Safecracker
  4. 在 NodeJs 上搭建 React 开发环境
  5. 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups
  6. Xml学习笔记(3)利用递归解析Xml文档添加到TreeView中
  7. WCF学习笔记(1)-一个完整的例子
  8. poj2367 Genealogical tree
  9. 百度地图API在vue-cli中路径错误的问题
  10. 北大ACM(POJ1019-Number Sequence)