题目背景

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

题目描述

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


调了3个小时无果。

弃疗了。

留下代码以后调。


#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
#define reg register
inline int read() {
int res = ;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) res=(res<<)+(res<<)+(ch^), ch=getchar();
return res;
}
#define N 200005
int n, m; int L1[N<<], R1[N<<], dat[N<<], L2[N<<], R2[N<<];
#define ls(o) o << 1
#define rs(o) o << 1 | 1 inline void pushup(int o)
{
dat[o] = dat[ls(o)] + dat[rs(o)];
if (L2[ls(o)] > R1[ls(o)] and R2[rs(o)] < L1[rs(o)]) dat[o]++;
L1[o] = min(L1[ls(o)], L1[rs(o)]);
L2[o] = max(L2[ls(o)], L2[rs(o)]);
R1[o] = max(R1[ls(o)], R1[rs(o)]);
R2[o] = min(R2[ls(o)], R2[rs(o)]);
} void Build(int l, int r, int o)
{
if (l == r) {
if (l == ) L1[o] = , L2[o] = , R1[o] = , R2[o] = 1e9;
else if (l == n) R1[o] = n, L1[o] = 1e9, L2[o] = , R2[o] = n;
else L1[o] = 1e9, L2[o] = , R1[o] = , R2[o] = 1e9;
return ;
}
int mid = l + r >> ;
Build(l, mid, ls(o));
Build(mid + , r, rs(o));
pushup(o);
} void change(int l, int r, int o, int pos, char c)
{
if (l == r)
{
if (c == '(') L1[o] = pos, L2[o] = pos, R1[o] = , R2[o] = 1e9;
else if (c = ')') R1[o] = pos, R2[o] = pos, L1[o] = 1e9, L2[o] = ;
else L1[o] = 1e9, L2[o] = , R1[o] = , R2[o] = 1e9;
return ;
}
int mid = l + r >> ;
if (pos <= mid) change(l, mid, ls(o), pos, c);
else change(mid + , r, rs(o), pos, c);
pushup(o);
} int query(int l, int r, int o, int ql, int qr)
{
if (l >= ql and r <= qr) return dat[o];
int res = ;
int mid = l + r >> ;
if (ql <= mid) res += query(l, mid, ls(o), ql, qr);
if (qr > mid) res += query(mid + , r, rs(o), ql, qr);
if (ql <= mid and qr > mid and L2[ls(o)] > R1[ls(o)] and R2[rs(o)] < L1[rs(o)] and L2[ls(o)] >= ql and R2[rs(o)] <= qr) res++;
return res;
} int main()
{
//freopen("testdatain.txt", "r", stdin);
//freopen("ym.ans", "w", stdout);
n = read(), m = read();
Build(, n, );
while(m--)
{
int opt = read();
if (opt == ) {
int x = read();
char y;
cin >> y;
change(, n, , x, y);
} else {
int x = read(), y = read();
printf("%d\n", query(, n, , x, y));
}
}
return ;
}

[Luogu3797] 妖梦斩木棒的更多相关文章

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

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

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

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

  3. 洛谷P3797 妖梦斩木棒

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

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

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

  5. 洛谷 P3797 妖梦斩木棒

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

  6. Luogu P3797 妖梦斩木棒

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

  7. 洛谷P3799 妖梦拼木棒

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

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

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

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

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

随机推荐

  1. 磁盘告警之---神奇的魔法(Sparse file)

      一.问题来源 半夜钉钉接到告警,某台机器的磁盘使用率少于20%,于是迷糊中爬起来,咔咔咔 find / -size +1G,咔咔咔,把几个只有4-5G的日志文件echo空值了一下,然后吓蒙了,刚刚 ...

  2. CentOS7.2搭建LAMP环境

    所谓的Lamp就是:Linux+Apache+mysql+php.这里的Linux使用CentOS7.2. 0x00 开始我们可以先更新一下yum: # 升级所有包同时也升级软件和系统内核 yum - ...

  3. mybatis-geneator

    一.简介 在使用mybatis时我们需要重复的去创建pojo类.mapper文件以及dao类并且需要配置它们之间的依赖关系,比较麻烦且做了大量的重复工作,mybatis官方也发现了这个问题, 因此给我 ...

  4. 亮剑.NET第二章

    第二章主要讲解C#中各种让人模糊不清的概念,用法,类型等等. 1.Equals()与==区别 当比较两个值类型时,二者基本一致,当比较引用类型时,==比较的是引用类型的地址是否一致,即两个引用是否指向 ...

  5. Day 21 进程管理

    1.什么是进程 比如: 开发写的代码我们称为程序,那么将开发的代码运行起来.我们称为进程. 总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程. PS1: 当程序运行为进程后,系统会为该 ...

  6. [VB.NET Tips]对于基本数据类型的提示

    1.类型字符 有时需要直接量后面加上类型字符以明确指定类型,下面把常用的类型字符列出来 类型 字符 Short S Integer I Long L Decimal D Char c Single F ...

  7. 23种设计模式之原型模式(Prototype Pattern)

    原型模式 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 分析: 孙悟空:根据自己的形状复制(克隆)出多个身外身 软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象 ...

  8. 【ADO.NET基础-Regidter】简单的账户注册界面和源代码(可用于简单面试基础学习用)

    在阅读时如有问题或者建议,欢迎指出和提问,我也是初学者......... 前台代码: <!DOCTYPE html> <html xmlns="http://www.w3. ...

  9. String 用法 简单API

    明天天梯赛选拔,怕不是STl忘到姥姥家去了,赶紧复习一下 构造str string s = "fuckyouRMA"; string s1(s, 2); de(s1); strin ...

  10. .net core 3.0 Signalr - 实现一个业务推送系统

    ## 介绍 ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程. 实时 Web 功能使服务器端代码能够即时将内容推送到客户端. SignalR 的适 ...