博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1540 区间合并+询问某点的最大连续块
阅读量:4568 次
发布时间:2019-06-08

本文共 2044 字,大约阅读时间需要 6 分钟。

询问操作需要搞一下

今天被区间合并降智了

/*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
using namespace std;#define maxn 50005int n,m;stack
s; #define lson l,m,rt<<1#define rson m+1,r,rt<<1|1int tag[maxn<<2],mx[maxn<<2],lmx[maxn<<2],rmx[maxn<<2];void pushup(int l,int r,int rt){ lmx[rt]=lmx[rt<<1],rmx[rt]=rmx[rt<<1|1]; mx[rt]=max(mx[rt<<1],mx[rt<<1|1]); int m=l+r>>1; if(lmx[rt<<1]==m-l+1)lmx[rt]=lmx[rt<<1]+lmx[rt<<1|1]; if(rmx[rt<<1|1]==r-m)rmx[rt]=rmx[rt<<1]+rmx[rt<<1|1]; mx[rt]=max(mx[rt],max(lmx[rt],rmx[rt])); mx[rt]=max(mx[rt],rmx[rt<<1]+lmx[rt<<1|1]); if(mx[rt]!=r-l+1)tag[rt]=0; else tag[rt]=1;}void build(int l,int r,int rt){ tag[rt]=1; if(l==r){mx[rt]=lmx[rt]=rmx[rt]=1;return;} int m=l+r>>1; 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>>1; 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]==0)return 0; else if(tag[rt])return mx[rt]; int m=l+r>>1; if(pos<=m){ if(pos>=m-rmx[rt<<1]+1) return query(pos,lson)+lmx[rt<<1|1]; else return query(pos,lson); } else { if(pos<=m+lmx[rt<<1|1]) return query(pos,rson)+rmx[rt<<1]; else return query(pos,rson); }}int main(){ while(cin>>n>>m){ build(1,n,1); while(m--){ char opt[10];int a; cin>>opt; if(opt[0]!='R')cin>>a; if(opt[0]=='D')update(a,1,n,1,0),s.push(a); if(opt[0]=='Q')cout<
<<'\n'; if(opt[0]=='R')update(s.top(),1,n,1,1),s.pop(); }}}

 

转载于:https://www.cnblogs.com/zsben991126/p/10634017.html

你可能感兴趣的文章
自己写的文字轮播(简陋版)
查看>>
TWaver在FTTX设备网管系统中的应用
查看>>
python入门笔记1
查看>>
【转】Ext JS xtype
查看>>
Word打不开老提示进入“安全模式”怎么办
查看>>
Linux 定时运行脚本、命令
查看>>
1python基础语法_11模块
查看>>
时间管理
查看>>
document.getElementsByTagName函数
查看>>
启停无线网卡bat脚本
查看>>
需求分析的故事——如何练就需求分析的火眼金晴?
查看>>
UIGestureRecognizer手势
查看>>
模拟http或https请求,实现ssl下的bugzilla登录、新增BUG,保持会话以及处理token
查看>>
Java的慢和稳
查看>>
日志框架SLF4J
查看>>
C# 内存管理优化畅想----前言
查看>>
标准 OpenStack 多region配置
查看>>
Maven生成源码包
查看>>
理解 js的 async/await
查看>>
D3.js中对array的使用
查看>>