P3797 妖梦斩木棒

题目背景

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

题目描述

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

  1. 4 4
  2. 2 1 4
  3. 2 2 4
  4. 1 2 (
  5. 2 2 4
输出样例#1:

  1. 1
  2. 0
  3. 1

说明

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

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

by-orangebird

  1. /*
  2. 线段树维护一段区间向左有没有开口,向右有没有开口,以及是否贯通(全是X),包含几段完整木棒
  3. 如XXX)XXX,就只有向左开口,没有向右开口
  4. 然后单点修改,区间查询即可。
  5. 与普通线段树的区别就在于多了合并操作
  6. */
  7. #include<iostream>
  8. #include<cstdio>
  9. #include<cstring>
  10. #include<algorithm>
  11. using namespace std;
  12. int n,m;
  13. struct node{
  14. int num;
  15. bool l,r,p;
  16. node(){}
  17. node(int l_,int r_,int p_){
  18. l=l_;r=r_;p=p_;num=;
  19. }
  20. }tr[];
  21. node merge(node a,node b){
  22. node res;
  23. res.p=a.p&b.p;
  24. res.l=a.p?b.l:a.l;
  25. res.r=b.p?a.r:b.r;
  26. res.num=a.num+b.num;
  27. if(a.r&&b.l&&!a.p&&!b.p)res.num++;
  28. return res;
  29. }
  30. void pushup(int k){
  31. tr[k]=merge(tr[k<<],tr[k<<|]);
  32. }
  33. node query(int k,int l,int r,int L,int R){
  34. if(l>=L&&r<=R)return tr[k];
  35. int mid=(l+r)>>;
  36. if(mid+>R)return query(k<<,l,mid,L,R);
  37. if(L>mid)return query(k<<|,mid+,r,L,R);
  38. return merge(query(k<<,l,mid,L,R),query(k<<|,mid+,r,L,R));
  39. }
  40. void build(int l,int r,int k){
  41. if(l==r){
  42. if(l==)tr[k]=node(,,);
  43. else if(l==n)tr[k]=node(,,);
  44. else tr[k]=node(,,);
  45. tr[k].num=;
  46. return;
  47. }
  48. int mid=(l+r)>>;
  49. build(l,mid,k<<);
  50. build(mid+,r,k<<|);
  51. pushup(k);
  52. }
  53. void modify(int k,int l,int r,int x,int type){
  54. if(l==r){
  55. if(type==)tr[k]=node(,,);
  56. else if(type==)tr[k]=node(,,);
  57. else tr[k]=node(,,);
  58. return;
  59. }
  60. int mid=(l+r)>>;
  61. if(x<=mid)modify(k<<,l,mid,x,type);
  62. else modify(k<<|,mid+,r,x,type);
  63. pushup(k);
  64. }
  65. int main(){
  66. freopen("Cola.txt","r",stdin);
  67. scanf("%d%d",&n,&m);
  68. build(,n,);
  69. while(m--){
  70. int type;
  71. scanf("%d",&type);
  72. if(type==){
  73. int x,t;char c;
  74. scanf("%d %c",&x,&c);
  75. if(c=='X')t=;
  76. else if(c==')')t=;
  77. else t=;
  78. modify(,,n,x,t);
  79. }
  80. else {
  81. int l,r;
  82. scanf("%d%d",&l,&r);
  83. printf("%d\n",query(,,n,l,r).num);
  84. }
  85. }
  86. return ;
  87. }

洛谷P3797 妖梦斩木棒的更多相关文章

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

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

  2. 洛谷 P3797 妖梦斩木棒

    https://www.luogu.org/problem/show?pid=3797 题目背景 妖梦是住在白玉楼的半人半灵,拥有使用剑术程度的能力. 题目描述 有一天,妖梦正在练习剑术.地面上摆放了 ...

  3. 洛谷P3799 妖梦拼木棒

    P3799 妖梦拼木棒 53通过 345提交 题目提供者orangebird 标签 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 暂时没有讨论 题目背景 上道 ...

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

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

  5. Luogu P3797 妖梦斩木棒

    解题思路 用线段树做这个就不用说了吧,但是要维护的东西确实很神奇.在每一个节点上都维护一个$lbkt$,表示这个区间上最靠左的右括号的位置:一个$rbkt$,表示这个区间上最靠右的左括号的位置.还有一 ...

  6. AC日记——妖梦斩木棒 洛谷 P3797

    妖梦斩木棒 思路: 略坑爹: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 #define m ...

  7. [Luogu3797] 妖梦斩木棒

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

  8. AC日记——妖梦拼木棒 洛谷 P3799

    妖梦拼木棒 思路: 神特么题: 代码: #include <bits/stdc++.h> using namespace std; #define mod 1000000007LL int ...

  9. P3799 妖梦拼木棒 (组合数学)

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

随机推荐

  1. Mysql 外键级联

    如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表.外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常 ...

  2. MySQL——sql语句的执行顺序

    #核心知识点: 书写顺序:where——>group by——>having——>order by——>limit 许多时候在书写一些复杂的sql语句的时候,尤其是在渐进式推导 ...

  3. 模型层的Meta选项详解

    一 . 模型层的Meta选项详解 Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.便用方法及参数解释如下 : class Book(models.Model): ...

  4. 学习 Promise,掌握未来世界 JS 异步编程基础

    其实想写 Promise 的使用已经很长时间了.一个是在实际编码的过程中经常用到,一个是确实有时候小伙伴们在使用时也会遇到一些问题.Promise 也确实是 ES6 中 对于写 JS 的方式,有着真正 ...

  5. HTML5实现中国象棋游戏(无人能敌)

    1. [代码][JavaScript]代码    var AI = AI||{}; AI.historyTable =   {};     //历史表  //人工智能初始化AI.init = func ...

  6. BZOJ 1601 [Usaco2008 Oct]灌水:最小生成树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1601 题意: Farmer John已经决定把水灌到他的n(1<=n<=300 ...

  7. linux应用之bugfree的安装及配置

    Bugfree3.0.4 Linux环境安装指南 bugfree系统安装的前提是,配置LAMP环境(apache+mysql+php),下面以centos6.3系统为例介绍bugfree3.0.4的安 ...

  8. scala初步

    1 安装 http://scala-ide.org/ http://scala-lang.org/

  9. codeforces 609D D. Gadgets for dollars and pounds(二分+贪心)

    题目链接: D. Gadgets for dollars and pounds time limit per test 2 seconds memory limit per test 256 mega ...

  10. Unity-2017.2官方实例教程Roll-a-ball(二)

    声明: 本文系转载,由于Unity版本不同,文中有一些小的改动,原文地址:http://www.jianshu.com/p/97b630a23234 上一节Unity-2017.2官方实例教程Roll ...