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

题目描述

有一天,妖梦正在练习剑术。地面上摆放了一支非常长的木棒,妖梦把它们切成了等长的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

由于只有当两个括号之间没有其他括号时 才能构成一个完整的木棒

所以合并区间的时候只有 左区间最右端的左括号和右区间最左端的右括号 匹配才能对sum产生1的贡献

所以对于一个区间我们只需要为维护 三个域

le 区间最左端的非X木棒

ri 区间最右端的非X木棒

sum 区间合法木棒和

 1 #include <cctype>
 2 #include <cstdio>
 3
 4 const int MAXN=200010;
 5
 6 int n,m;
 7
 8 struct SegmentTree {
 9     int l,r;
10     int le,ri;
11     int sum;
12 };
13 SegmentTree t[MAXN<<2];
14
15 inline void read(int&x) {
16     int f=1;register char c=getchar();
17     for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar());
18     for(;isdigit(c);x=x*10+c-48,c=getchar());
19     x=x*f;
20 }
21
22 inline void up(int now) {
23     if(t[now<<1].le) t[now].le=t[now<<1].le;else t[now].le=t[now<<1|1].le;
24     if(t[now<<1|1].ri) t[now].ri=t[now<<1|1].ri;else t[now].ri=t[now<<1].ri;
25     t[now].sum=t[now<<1].sum+t[now<<1|1].sum;
26     if(t[now<<1].ri==1&&t[now<<1|1].le==2) ++t[now].sum;
27 }
28
29 void build_tree(int now,int l,int r) {
30     t[now].l=l;t[now].r=r;
31     if(l==r) {
32         if(l==1) t[now].le=t[now].ri=1;
33         else if(l==n) t[now].le=t[now].ri=2;
34         return;
35     }
36     int mid=(l+r)>>1;
37     build_tree(now<<1,l,mid);
38     build_tree(now<<1|1,mid+1,r);
39     up(now);
40 }
41
42 void modify(int now,int pos,char s) {
43     if(t[now].l==t[now].r) {
44         if(s=='(') t[now].le=t[now].ri=1;
45         else if(s==')') t[now].le=t[now].ri=2;
46         else t[now].le=t[now].ri=0;
47         t[now].sum=0;
48         return;
49     }
50     int mid=(t[now].l+t[now].r)>>1;
51     if(pos<=mid) modify(now<<1,pos,s);
52     else modify(now<<1|1,pos,s);
53     up(now);
54 }
55
56 SegmentTree query(int now,int l,int r) {
57     if(l<=t[now].l&&r>=t[now].r) return t[now];
58     int mid=(t[now].l+t[now].r)>>1;
59     if(r<=mid) return query(now<<1,l,r);
60     if(l>mid) return query(now<<1|1,l,r);
61     else {
62         SegmentTree a,b,c;
63         a=query(now<<1,l,mid);b=query(now<<1|1,mid+1,r);
64         if(a.le) c.le=a.le;else c.le=b.le;
65         if(b.ri) c.ri=b.ri;else c.ri=a.ri;
66         c.sum=a.sum+b.sum;
67         if(a.ri==1&&b.le==2) ++c.sum;
68         return c;
69     }
70 }
71
72 int hh() {
73     int type,x,y;
74     char c[5];
75     read(n);read(m);
76     build_tree(1,1,n);
77     for(int i=1;i<=m;++i) {
78         read(type);read(x);
79         if(type==1) {
80             scanf("%s",c);
81             modify(1,x,c[0]);
82         }
83         else {
84             read(y);
85             SegmentTree ans=query(1,x,y);
86             printf("%d\n",ans.sum);
87         }
88     }
89     return 0;
90 }
91
92 int sb=hh();
93 int main(int argc,char**argv) {;}

代码

洛谷 P3797 妖梦斩木棒相关推荐

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

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

  2. 洛谷P3797 妖梦斩木棒

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

  3. 洛谷[P3799 妖梦拼木棒] {暴力枚举} 奋斗的珂珂~

    洛谷[P3799 妖梦拼木棒] {暴力枚举} 题目背景 上道题中,妖梦斩了一地的木棒,现在她想要将木棒拼起来. 题目描述 有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法? 答案 ...

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

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

  5. 洛谷-P3799 妖梦拼木棒

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

  6. 洛谷P3799 妖梦拼木棒

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

  7. 【题解】【算法】- 洛谷 - P3799 妖梦拼木棒(组合数学)

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

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

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

  9. 线段树 P3797 妖梦斩木棒

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

最新文章

  1. 样式集(七)仿微信发现页样式
  2. 学习 TList 类的实现[5]
  3. 走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
  4. 【SpringBoot】查看运行环境中所有的spring bean
  5. 如何熟悉一个开源项目
  6. 2017蓝桥杯省赛---java---A---7(正则问题)
  7. 设置dns_2019让你的网速飞起来,你需要……设置正确DNS服务篇
  8. C#LeetCode刷题-脑筋急转弯
  9. C#LeetCode刷题之#830-较大分组的位置(Positions of Large Groups)
  10. 使用MetalLB在您的Raspberry Pi家庭实验室上安装Kubernetes负载均衡器
  11. 鸿蒙系统正式面世,跨时代!“鸿蒙”系统正式面世!余承东:如有必要随时可替代安卓...
  12. matlab数字图像处理灰度变换ppt课件,数字图像处理 灰度变换.ppt
  13. 层次分析法(AHP)介绍
  14. 流程框图-各方框含义
  15. DRM在Android中
  16. php数据库输出文字怎么竖着的,关于文字竖排的详细介绍
  17. parameter与argument,property与attribute,这些翻译意思相近的词的区别
  18. java文章采集爬虫代码示例
  19. 编写程序,由键盘输入三个整数分别存入变量num1,num2,num3中,对它们进行排序, 使用if-else结构,并按从小到大的顺序输出
  20. 你要记得那些大雨中为你撑伞的人,帮你挡住外来之物的人。。。——村上春树 2021.11.13日 早上11点

热门文章

  1. 【51nod】---蚂蚁(模拟)
  2. VSCode:VSCode提供额外的环境变量
  3. 个人运营APP要投入多少钱?开发是小头,推广是大头!
  4. Intouch与Kepware通信,权限与控制的实现
  5. 2020年熔化焊接与热切割模拟考试题库及熔化焊接与热切割作业考试题库
  6. 赛尔号和赛尔机器人_赛尔号 - 赛尔机器人 - 顶点小说
  7. Infocomm China 2019,everywhere 数字冰雹
  8. 90年前第一批木制玩具丹麦诞生,这个家族企业如今成为全球最大的玩具企业之一 | 美通社头条...
  9. 电视剧 | 黑镜S5E2 碎片
  10. ZZNUOJ 1117