博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu1540 线段树点修改(较难)
阅读量:6480 次
发布时间:2019-06-23

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

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 int ql,qr,x,n,ll[150005],rl[150005],a[150005]; 7 stack
s; 8 void build(int o,int l,int r) 9 { 10 int mid=l+(r-l)/2; 11 ll[o]=rl[o]=r-l+1; 12 if (l!=r) 13 { 14 build(o*2,l,mid); 15 build(o*2+1,mid+1,r); 16 } 17 } 18 int lquery(int o,int l,int r) 19 { 20 int mid=l+(r-l)/2; 21 if (ql==l) return ll[o]; 22 else if (qr<=mid) return lquery(o*2,l,mid); 23 else if (ql>mid) return lquery(o*2+1,mid+1,r); 24 else{ 25 int temp=lquery(o*2,l,mid); 26 if (temp==mid-ql+1) temp+=ll[o*2+1]; 27 return temp; 28 } 29 } 30 int rquery(int o,int l,int r) 31 { 32 int mid=l+(r-l)/2; 33 if (qr==r) return rl[o]; 34 else if (qr<=mid) return rquery(o*2,l,mid); 35 else if (ql>mid) return rquery(o*2+1,mid+1,r); 36 else{ 37 int temp=rquery(o*2+1,mid+1,r); 38 if (temp==qr-mid) temp+=rl[o*2]; 39 return temp; 40 } 41 } 42 void rupdate(int o,int l,int r) 43 { 44 int mid=l+(r-l)/2; 45 if (l==r) rl[o]=ll[o]=1; 46 else{ 47 if (x<=mid) rupdate(o*2,l,mid); 48 else rupdate(o*2+1,mid+1,r); 49 if (ll[o]==x-l) 50 { 51 ql=x+1; qr=r; ll[o]+=1; 52 if (ql<=qr) ll[o]+=lquery(1,1,n); 53 } 54 if (rl[o]==r-x) 55 { 56 ql=l; qr=x-1; rl[o]+=1; 57 if (ql<=qr) rl[o]+=rquery(1,1,n); 58 } 59 } 60 } 61 void dupdate(int o,int l,int r) 62 { 63 int mid=l+(r-l)/2; 64 if (l==r) rl[o]=ll[o]=0; 65 else{ 66 if (x<=mid) dupdate(o*2,l,mid); 67 else dupdate(o*2+1,mid+1,r); 68 if (ll[o]>x-l) ll[o]=x-l; 69 if (rl[o]>r-x) rl[o]=r-x; 70 } 71 } 72 int main() 73 { 74 int m,i,flong,temp; 75 char c; 76 while (~scanf("%d%d",&n,&m)) 77 { 78 while (!s.empty()) s.pop(); 79 build(1,1,n); 80 for (i=1;i<=n;i++) a[i]=1; 81 for (i=1;i<=m;i++) 82 { 83 getchar(); scanf("%c",&c); 84 if (c=='Q') 85 { 86 scanf("%d",&x); 87 if (a[x]==0) printf("0\n"); 88 else{ 89 flong=0; ql=1; qr=x-1; 90 if (qr>=ql) flong=rquery(1,1,n); 91 temp=1+flong; 92 flong=0; ql=x+1; qr=n; 93 if (qr>=ql) flong=lquery(1,1,n); 94 printf("%d\n",temp+flong); 95 } 96 } 97 else if (c=='R') 98 { 99 x=s.top(); s.pop();100 a[x]=1; rupdate(1,1,n);101 }102 else if (c=='D')103 {104 scanf("%d",&x);105 a[x]=0; s.push(x); dupdate(1,1,n);106 }107 }108 }109 }

转载于:https://www.cnblogs.com/xiao-xin/articles/3864436.html

你可能感兴趣的文章
CentOS7 编译安装PHP7
查看>>
MySQL常见错误代码及代码说明
查看>>
Cglib动态代理基础使用
查看>>
技术人员,为什么会苦逼
查看>>
使用126邮箱发送邮件的python脚本
查看>>
Maven
查看>>
缓存系统在游戏业务中的特异性
查看>>
Ngrok搭建自己的内网穿透
查看>>
redis的基本数据类型
查看>>
.NET 同步与异步之锁(Lock、Monitor)(七)
查看>>
前端大牛们都学过哪些?
查看>>
在iOS当中发送电子邮件和短信
查看>>
python的单例模式
查看>>
13~1003的和
查看>>
pycharm如何新项目如何不默认创建虚拟环境(吐槽)
查看>>
Loadrunner检查点小结(很经典)
查看>>
MySQL字段类型详解
查看>>
ORACLE 的游标
查看>>
虚拟机安装的UBUNTU全屏的方法:
查看>>
java虚拟机类加载器
查看>>