此题如果用常规的线段树或树状数组会非常麻烦,同时不好调试,在此介绍一种优美的做法:

由于本题是一条条线段,所以可以使用括号法:

如果需要在 \(l\sim r\) 区间种树,那么就在 \(l\) 和 \(r\) 上打一个括号表示这个区间里面种了一种树,我们使用两个树状数组 \(tr1,tr2\) 来分别维护左括号和右括号,并且用前缀和记录 \(1\sim i\) 区间里面有多少个左括号或右括号

那么当我们查询某一区间时,需要用 \(1\sim r\) 的种数减去 \(1\sim l-1\) 的种数(前缀和的思想),那么为了做到这个事情可以直接用 \(tr1[r]-tr2[l-1]\),如果在 \(1\sim l-1\) 形成了区间,那么必然有一对括号均在 \(1\sim l-1\) 中,反之则说明这个区间的右端点 \(\geq l\),所以使用 \(1\sim r\) 的左括号数减去 \(1\sim l-1\) 的右括号数就行了

#include <iostream>
using namespace std;
const int N = 5e4+5;
int tr1[N],tr2[N];
int n,m;
int lowbit(int x)
{
return x&-x;
}
int sum(int tr[],int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i)) res+=tr[i];
return res;
}
void add(int tr[],int x,int c)
{
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=c;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if(k==1) add(tr1,l,1),add(tr2,r,1);
else printf("%d\n",sum(tr1,r)-sum(tr2,l-1));
}
return 0;
}

Vijos P1448 校门外的树(括号序列法)的更多相关文章

  1. Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】

    校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...

  2. vijos P1448 校门外的树

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:\(K=1\),读入\(l, ...

  3. Vijos P1103 校门外的树【线段树,模拟】

    校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...

  4. vijos 1448 校门外的树 (不是05年普及组那题)

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表 ...

  5. vijos 1448 校门外的树 树状数组

    描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r表 ...

  6. 【vijos】P1448 校门外的树

    [题意]两种操作,[L,R]种新的树(不覆盖原来的),或查询[L,R]树的种类数.n<=50000. [算法]树状数组||线段树 [题解]这题可以用主席树实现……不过因为不覆盖原来的,所以有更简 ...

  7. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  8. Vijos1448校门外的树 题解

    Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...

  9. 树状数组例题-数星星,简单题easy,校门外的树2,清点人数

    [例1]数星星 天空中有一些星星,这些星星都在不同的位置,每个星星都有个坐标,如果一个星星的左下方(包括正左和正下)有k颗星星,就说这颗星星是k级的. 比如,上图中,星星5是3级的(1,2,4在其左下 ...

  10. Vijos1448 校门外的树 [树状数组]

    题目传送门 校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K= ...

随机推荐

  1. 从零开始,打造一款属于自己的JavaScript编程语言

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  2. MFC窗口闪烁问题

    本文引自:<VC窗口闪烁问题的解决> 概述 一般的windows复杂的界面需要使用多层窗口而且要用贴图来美化,所以不可避免在窗口移动或者改变大小时候出现闪烁. 闪烁产生的原因 原因一: 如 ...

  3. PC端自动化测试实战教程-6-pywinauto 打印和保存控件菜单树结构之ElementNotFoundError(详细教程)

    1.简介 其实前边的文章宏哥已经在控制台打印过控件菜单树结构,只是没有将其保存到文件中.只需要一个方法即可.在pywinauto中可以使用 print_control_identifiers() 方法 ...

  4. 2024Jiangxi_H Convolution

    Description Input Output Sample Input 5 5 3 3 0 -1 -1 0 0 0 1 -1 2 -2 2 -2 2 2 0 -1 0 0 -2 -1 0 -2 0 ...

  5. odoo14本地windows安装报错汇总

    odoo14安装libsass报错C++啥的解决办法:pip install wheel: pip install libsass-0.20.1-......whl 注意:whl版本应与python版 ...

  6. 初识protobuf

    protobuf的优点 性能方面 序列化后,数据大小可缩小3倍 序列化速度快 传输速度快 使用方面 使用简单:proto编译器自动进行序列化和反序列化 维护成本低:多平台只需要维护一套对象协议文件,即 ...

  7. CAN304 W2

    CAN304 W2 Classical and modern cryptography Classical cryptography 完全依赖于通信双方之间共享的秘密信息(Private-key cr ...

  8. 使用apache amoro + trino+minio搭建iceberg数据湖架构

    使用apache amoro + trino+minio搭建iceberg数据湖架构 以下是基于 Apache Amoro + Trino + MinIO 搭建 Iceberg 数据湖架构的核心步骤和 ...

  9. 一文看懂——SimSolid的优势

    在当今日益复杂的工程设计领域,大型装配体的分析变得愈发重要.装配体是由多个零件.部件或子装配体按照一定规则和技术要求组合而成的整体,其性能的好坏直接影响到整个产品的质量和可靠性. 然而,传统的有限元分 ...

  10. MongoDB入门实战教程(4)

    通过前面几篇的铺垫,我们基本了解了MongoDB是个什么东西,搭建起了一个MongoDB的小集群环境.接下来,我们就来学习一下MongoDB的基本操作. 1 insert操作 我们都知道对于传统关系型 ...