妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力。
题目描述

有一天,妖梦正在练习剑术。地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段。现在这个木棒可以看做由三种小段构成,中间的n-2段都是左右都被切断的断头,我们记做’X’,最左边的一段和最右边的一段各有一个圆头,记做’(‘和’)’。幽幽子吃饱后闲来无事,决定戏弄一下妖梦。她拿来了许多这样的三种小段木棒,来替换掉妖梦切下来的n段中的一部分,然后问妖梦一些问题。这些操作可以这样描述:

1 x C 将第x个小段的木棒替换成C型,C只会是’X’,’(‘,’)’中的一种

2 l r 询问妖梦从第l段到第r段之间(含l,r),有多少个完整的木棒

完整的木棒左右两端必须分别为’(‘和’)’,并且中间要么什么都没有,要么只能有’X’。

虽然妖梦能够数清楚这些问题,但幽幽子觉得她回答得太慢了,你能教给妖梦一个更快的办法吗?
输入格式

第一行两个整数n,m,n表示共有n段木棒,m表示有m次操作。

木棒的初始形状为(XXXXXX…XXXXXX)。

接下来m行,每行三个整数/字符,用空格隔开。第一个整数为1或2,表示操作的类型,若类型为1,则接下来一个整数x,一个字符C。若类型为2,接下来两个整数l,r。含义见题目描述。
输出格式

对于每一个操作2,输出一行一个整数,表示对应询问的答案。
输入输出样例
输入 #1

4 4
2 1 4
2 2 4
1 2 (
2 2 4

输出 #1

1
0
1

说明/提示

对于30%的数据,1<=n,m<=1000

对于100%的数据,1<=n,m<=200000

by-orangebird

  • 罪恶 咕咕咕,自闭结束满血复活呀!!!()

考虑木棒变多的情况就是只对左右括号考虑的那么我们就只用维护左右括号的状态就对了

#include<bits/stdc++.h>
using namespace std;
const int N=200010;
struct node
{int l,r,sum,ll,rr;// ll表示最右边的左括号// rr表示最左边的右括号//sum表示该区间的木棒数量
}t[N<<2];int n,m;
void up(int rt)
{int ls=rt<<1,rs=rt<<1|1;if(t[ls].rr ) t[rt].rr=t[ls].rr;//如果左区间的右括号在了就是作为和上一区间的左括号相连的最优选择了 else if(!t[ls].sum&&!t[ls].ll ) t[rt].rr=t[rs].rr;//可以想象只有左区间全是X才能使得右括号和左子区间前面的区间的左括号相连 else t[rt].rr=0;if(t[rs].ll) t[rt].ll=t[rs].ll;else if(!t[rs].sum&&!t[rs].rr ) t[rt].ll=t[ls ].ll;else t[rt].ll=0;t[rt].sum=t[rs].sum+t[ls].sum +(t[ls].ll&&t[rs].rr );//看看可以不可以内部消化 两子区间产生一个木棒当然是左子区间左括号右子区间右括号啦
}
void build(int rt,int l,int r)
{t[rt].l=l,t[rt].r=r;t[rt].sum=0;if(rt==1) t[rt].sum=1;else {if(l==1) t[rt].ll=1;if(r==n) t[rt].rr=n;}if(l==r){return ;}int mid=(l+r)>>1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);
}
void update(int rt,int mb,int v)
{if(t[rt].l==t[rt].r&&t[rt].l==mb){if(v==1) t[rt].ll=mb,t[rt].rr=0;if(v==2) t[rt].ll=0,t[rt].rr=mb;if(v==3) t[rt].ll=0,t[rt].rr=0;return;}int mid=(t[rt].l+t[rt].r)>>1;if(mid>=mb){update(rt<<1,mb,v);}if(mid<mb){update(rt<<1|1,mb,v);}up(rt);
}
int query(int rt,int l,int r)
{if(t[rt].l>=l&&t[rt].r<=r){return t[rt].sum;}int mid=(t[rt].l+t[rt].r )>>1;int s=0;if(l<=mid) s+=query(rt<<1,l,r);if(r>mid) s+=query(rt<<1|1,l,r);s+=((t[rt<<1].ll>=l&&t[rt<<1].ll<=r)&&(t[rt<<1|1].rr<=r&&t[rt<<1|1].rr>=l ));return s;
}
int main()
{scanf("%d%d",&n,&m);build(1,1,n);while(m--){int op,l,r,k;scanf("%d",&op);if(op==1) {char s;scanf("%d%c",&k,&s);while(s!='('&&s!=')'&&s!='X') s=getchar();if(s=='(') update(1,k,1);if(s==')') update(1,k,2);if(s=='X') update(1,k,3);}else {scanf("%d%d",&l,&r);printf("%d\n",query(1,l,r));}}}

线段树 P3797 妖梦斩木棒相关推荐

  1. 洛谷 P3797 妖梦斩木棒 解题报告

    P3797 妖梦斩木棒 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的\(n\)段.现在这个木棒可以看做 ...

  2. P3797 妖梦斩木棒 线段树区间合并

    题意: 1 x C 将第x个小段的木棒替换成C型,C只会是'X','(',')'中的一种 2 l r 询问妖梦从第l段到第r段之间(含l,r),有多少个完整的木棒 完整的木棒左右两端必须分别为'('和 ...

  3. [luogu P3797] 妖梦斩木棒 [线段树]

    题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...

  4. 洛谷P3797 妖梦斩木棒

    题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的 ...

  5. 洛谷 P3797 妖梦斩木棒

    妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的n段.现在这个木棒可以看做由三种小段构成,中间的n-2段都 ...

  6. 组合枚举——妖梦拼木棒(洛谷 P3799)

    题目选自洛谷P3799 有了这些铺垫以后,我们再来看这道题 要从nn根木棒中选出44根,使他们能组成一个正三角形. 简单的来说,就是先选出两根一样的,在选出两根使这两根的长度之和与先前选出的相同 那么 ...

  7. luoguP3799 妖梦拼木棒 [组合数学]

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有n根木棒,现在从中选4根,想要组成一个正三角形,问有几种选法? 输入输出格式 输入格式: 第一行一个整数n 第二行n个整数 ...

  8. 妖梦拼木棒(组合数)

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有 n 根木棒,现在从中选 44 根,想要组成一个正三角形,问有几种选法? 答案对 10^9+7 取模. 输入格式 第一行一 ...

  9. 洛谷 P3799 妖梦拼木棒【枚举/组合数学】

    题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有 nnn 根木棒,现在从中选 444 根,想要组成一个正三角形,问有几种选法? 答案对 109+710^9+7109+7 ...

最新文章

  1. 2021年李永乐6套卷一道无穷小定义的题目
  2. school and connections
  3. 腾讯翻译君在线翻译怎么翻译整个文件_藏语怎么翻译成中文?这两方法非常好用...
  4. oracle数据库迁移 增大空间,Oracle数据库迁移、创建表空间、创建数据表实例讲解-Oracle...
  5. GAN全套学习笔记/论文
  6. linux 2.6内核进程调度,Linux2.6内核进程调度系列--scheduler_tick()函数2.更新实时进程的时间片,...
  7. jmeter(二十二)内存溢出原因及解决方法
  8. 2018.08.22 NOIP模拟 string(模拟)
  9. Fisco Bcos如何通过合约地址找到合约代码完美解决方案
  10. loki日志收集系统部署
  11. 小麦颗粒数目matlab,求关于matlab中rice.png图像中的米粒数目的算法
  12. 大风车音乐计算机,大风车歌曲
  13. cdr2022更新24.1版CorelDRAW2022稳定版
  14. 饿了么分布式服务治理及优化经验(含PPT)
  15. 牛客网---软件开发专项练习 刷题笔记
  16. 查看检测排名各网站的网站
  17. 外卖cps 赚钱小程序源码
  18. Web端程序实现文件下载
  19. 【服务器管理】mount.nfs: Stale file handle的解决办法
  20. 设置移动光猫外置路由器(上网+iptv正常使用)

热门文章

  1. 学php数学差能学会吗,初三数学差补习来得及吗
  2. 英文论文中Assumption(假设)、Lemma(引理)、Theorem(定理)、Proof(证明)、Remark(备注、注释)之间的关系
  3. 初中八年级计算机网络基础知识,初中八年级信息技术教学计划
  4. Keystore密钥库
  5. 完美解决 ListView偶尔爆出的异常:java.lang.IllegalStateException
  6. C#和.Net Framework的学习基础
  7. 选择计算机还是医学专业排名,最好找工作的十大专业,医学仅第二
  8. centos7软件仓库资源的修改与配置
  9. DevExpress单据模板插件
  10. 〖小狼毫〗小狼毫使用教程『完善版本』