询问操作需要搞一下

今天被区间合并降智了

/*
D a: 摧毁第a个点
Q a:询问a所在的点的块大小
R :修复最后被破坏的点
对于所有的点需要进行一次更新
更新比较容易,tag用来表示区间是否是完整的
查询时如果pos所在的大块有tag标记,那么直接返回块的大小即可
反之,如果pos在左区间,那就到左区间里去找:
如果pos的位置和rmx[rt<<1]相连,那么答案就是rmx[rt<<1]+lmx[rt<<1|1]
如果不相连,那么递归到左区间里找
如果pos在右区间,
如果pos的位置和lmx[rt<<1|1]相连,那么答案就是rmx[rt<<1]+lmx[rt<<1|1]
如果不相连,那么递归到右区间里找
如果 l==r并且tag==0,那么就是0
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 50005
int n,m;
stack<int>s; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int tag[maxn<<],mx[maxn<<],lmx[maxn<<],rmx[maxn<<];
void pushup(int l,int r,int rt){
lmx[rt]=lmx[rt<<],rmx[rt]=rmx[rt<<|];
mx[rt]=max(mx[rt<<],mx[rt<<|]);
int m=l+r>>;
if(lmx[rt<<]==m-l+)lmx[rt]=lmx[rt<<]+lmx[rt<<|];
if(rmx[rt<<|]==r-m)rmx[rt]=rmx[rt<<]+rmx[rt<<|];
mx[rt]=max(mx[rt],max(lmx[rt],rmx[rt]));
mx[rt]=max(mx[rt],rmx[rt<<]+lmx[rt<<|]); if(mx[rt]!=r-l+)tag[rt]=;
else tag[rt]=;
}
void build(int l,int r,int rt){
tag[rt]=;
if(l==r){mx[rt]=lmx[rt]=rmx[rt]=;return;}
int m=l+r>>;
build(lson);build(rson);
pushup(l,r,rt);
}
void update(int pos,int l,int r,int rt,int val){
if(l==r){mx[rt]=lmx[rt]=rmx[rt]=tag[rt]=val;return;}
int m=l+r>>;
if(pos<=m)update(pos,lson,val);
else update(pos,rson,val);
pushup(l,r,rt);
}
int query(int pos,int l,int r,int rt){
if(mx[rt]==)return ;
else if(tag[rt])return mx[rt];
int m=l+r>>;
if(pos<=m){
if(pos>=m-rmx[rt<<]+)
return query(pos,lson)+lmx[rt<<|];
else return query(pos,lson);
}
else {
if(pos<=m+lmx[rt<<|])
return query(pos,rson)+rmx[rt<<];
else return query(pos,rson);
}
}
int main(){
while(cin>>n>>m){
build(,n,);
while(m--){
char opt[];int a;
cin>>opt;
if(opt[]!='R')cin>>a;
if(opt[]=='D')update(a,,n,,),s.push(a);
if(opt[]=='Q')cout<<query(a,,n,)<<'\n';
if(opt[]=='R')update(s.top(),,n,,),s.pop();
}
}
}

hdu1540 区间合并+询问某点的最大连续块的更多相关文章

  1. HDU1540 区间合并

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. poj3667 区间合并,找最左边的空余块

    题很简单:给两个操作1:查找最左边的a个空余块并填满 2:把从第a个开始的连续b个块置空 线段树维护左连续,右连续,最大连续,lazy-tag即可,query函数值得学习 #include<io ...

  3. HDU 3911 线段树区间合并

    北京赛区快了,准备袭击数据结构和图论.倒计时 18天,线段树区间合并.维护一个最长连续.. 题意:给一个01串,以下有一些操作,问区间最长的连续的1的个数 思路:非常裸的线段树区间合并 #includ ...

  4. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  5. ACM: Hotel 解题报告 - 线段树-区间合并

    Hotel Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description The ...

  6. HYSBZ 1858 线段树 区间合并

    //Accepted 14560 KB 1532 ms //线段树 区间合并 /* 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[ ...

  7. HDU-3308 LCIS(区间合并)

    题目大意:给一个整数序列,m次询问,每次询问某个区间中最长连续上升子序列的长度. 题目分析:线段树区间合并.维护以区间左端开头的.以区间右端点结尾的和区间最长的上升连续序列. 代码如下: # incl ...

  8. 线段树(区间合并) POJ 3667 Hotel

    题目传送门 /* 题意:输入 1 a:询问是不是有连续长度为a的空房间,有的话住进最左边 输入 2 a b:将[a,a+b-1]的房间清空 线段树(区间合并):lsum[]统计从左端点起最长连续空房间 ...

  9. HDU5107---K-short Problem (线段树区间 合并、第k大)

    题意:二维平面上 N 个高度为 Hi 建筑物,M次询问,每次询问输出 位于坐标(x ,y)左下角(也就是xi <= x && yi <= y)的建筑物中的第k高的建筑物的高 ...

随机推荐

  1. window 安装gcc交叉编译器

    参考网址:  https://blog.csdn.net/zsy19881226/article/details/46952535

  2. linux 根据Pid获取 进程内容

    ps -ef | grep 753 | grep -v 'grep' | awk '{print $NF}'

  3. linux 统计某目录文件的行数

    通过find 正则搜索文件 find . -regex '.*\.c\|.*\.h' 每个文件的行数 find . -regex '.*\.c\|.*\.h' | xargs wc -l 显示文件的总 ...

  4. 7-10 多项式A除以B (25 分)

    题目链接:https://pintia.cn/problem-sets/1108548596745592832/problems/1108548661014913033 题目大意: 这仍然是一道关于A ...

  5. pythonの信号量

    #!/usr/bin/env python import threading,time def run(n): # 申请锁 semaphore.acquire() time.sleep(1) prin ...

  6. python第一天,简单输出及基本运算符

    1.安装步骤网上很多详细的图文资料,这里就不一一赘述. 我的环境:win7 64bit +python-3.7.0b2 2.简单的输出(3.0之后和之前的版本略有不同) 1)打开控制台输入python ...

  7. Java线程实现的第三种方式Callable方式与结合Future获取返回值

    多线程的实现方式有实现Runnable接口和继承Thread类(实际上Thread类也实现了Runnable接口),但是Runnable接口的方式有两个弊端,第一个是不能获取返回结果,第二个是不能抛出 ...

  8. Error "Client wants topic A to have B, but our version has C. Dropping connection."

    ROS problem 出现这个问题的原因是话题上的消息类型和订阅节点指定的消息类型不匹配.

  9. SpringBoot单元测试示例2

    package cn.coreqi.security.controller; import org.junit.Before; import org.junit.Test; import org.ju ...

  10. 用css解决table文字溢出控制td显示字数

    场景: 最左边这栏我不行让他换行,怎么办呢? 下面是解决办法: table{ width:100px; table-layout:fixed;/* 只有定义了表格的布局算法为fixed,下面td的定义 ...