首页 > 其他分享 >LOJ 10115. 「一本通 4.1 例 3」校门外的树

LOJ 10115. 「一本通 4.1 例 3」校门外的树

时间:2023-08-15 09:03:31浏览次数:39  
标签:12 4.1 LOJ sum tr int 端点 10115 数目

\(LOJ \ 10115\). 「一本通 4.1 例 3」校门外的树

一、题目描述

校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:

  • \(K=1\),读入 \(l,r\) 表示在 \(l\) 到 \(r\) 之间种上一种树,每次操作种的树的种类都不同;
  • \(K=2\),读入 \(l,r\) 表示询问 \(l\) 到 \(r\) 之间有多少种树。
    注意:每个位置都可以重复种树。

输入格式
第一行 \(n,m\) 表示道路总长为 \(n\),共有 \(m\) 个操作;
接下来 \(m\) 行为 \(m\) 个操作。

输出格式
对于每个 \(k=2\) 输出一个答案。

二、题目解析

开始怎么想都不知道怎么维护不同段中树的种类是否相同的情况,感觉这题有个思维技巧还是挺难想的,就是我们要开两个数组,\(sum_1\)分别维护左端点的数目,另一个数组\(sum_2\)维护右端点的数目。这样区间\([l,r]\)的树的种类的数目就是\(1-r\)中左端点的数目减去\(1-(l-1)\)中右端点的数目,即表示为\(sum_1[r]-sum_2[l-1]\)。

如图假如我们第一次在区间\(a[2,6]\)种上一种树,然后再在区间\(b[5,10]\)种上一种树,这时我们要统计区间\(c[8,12]\)中树的种类数目,我们就统计\([1,12]\)中左端点的数目即 \(sum_1[12]\)等于\(2\),说明有两种树可能在给定区间内,然后我们再求区间\([1,7]\)中右端点的数目即\(sum_2[7]=1\),表示有一种树完全在给定区间左边,并不是我们要求的,所以减去就好了,所以答案就为\(sum_1[12]-sum_2[7]\)了。

\(Code\)

#include <bits/stdc++.h>
using namespace std;
int const N = 50010;
int n, m;
// 树状数组模板
int sum1[N], sum2[N];

int lowbit(int x) {
    return x & -x;
}

void add(int tr[], int x, int c) {
    for (int i = x; i < N; i += lowbit(i)) tr[i] += c;
}

int sum(int tr[], int x) {
    int res = 0;
    for (int i = x; i; i -= lowbit(i)) res += tr[i];
    return res;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("LOJ10115.in", "r", stdin);
#endif
    int k, l, r;
    scanf("%d%d", &n, &m); // 第一行 n,m 表示道路总长为 n,共有 m 个操作;
    // n下面没有使用过。为什么呢?其实是n的上限N有用!我们就没有用到n,代码模板中也去掉了n的

    for (int i = 1; i <= m; i++) {
        scanf("%d%d%d", &k, &l, &r);
        if (k == 1)
            add(sum1, l, 1), add(sum2, r, 1); // sum1记录左括号的个数,sum2记录右括号的个数
        else
            printf("%d\n", sum(sum1, r) - sum(sum2, l - 1));
    }
    return 0;
}

标签:12,4.1,LOJ,sum,tr,int,端点,10115,数目
From: https://www.cnblogs.com/littlehb/p/17630351.html

相关文章

  • LOJ #6039「雅礼集训 2017 Day5」珠宝
    给定\(n\)个物品,第\(i\)个物品有体积\(c_i\),价值\(v_i\)。给定\(K\),对\(1\simK\)的所有\(i\)求大小为\(i\)的背包的最大价值。\(n\leq10^6\),\(K\leq5\times10^4\),\(c_i\leq300\),\(0\leqv_i\leq10^9\),时限\(\text{2.0s}\)。注意到\(c_i\)范......
  • Ubuntu18.04 安装Opencv3.4.15、PCL1.8.1、VTK7.1.0、Eigen3.4、Pangolin0.6、Sophus
    Eigen3.4安装方法mkdirbuild&&cdbuildcmake..sudomakeinstall安装后头文件安装在/usr/local/include/eigen3/,可以打开看一看安装的库Pangolin0.6安装方法+安装依赖项目sudoapt-getinstalllibglew-devsudoapt-getinstalllibboost-devli......
  • centos7.9 部署mongodb-4.4.18 分片集群
    准备基本环境名称ip地址cpu内存es监听端口redis-65110.0.2.18c64G9200redis-65210.0.2.28c64G9200redis-65310.0.2.38c64G9200......
  • LOJ3677 「北大集训 2021」出题高手
    卡死人了。数据随机写在上面,就是让你预估一下区间长度不会太长的,数据里最长的不超过\(2000\)。暴力扫\(2000\)个显然过不了\(500000\)的点,但是\(500000\)的点\(m\)为\(1\)且必定询问整个序列。可以分析出,在随机情况下,前缀和最小最大数量是根号个的,平方后是四次根号级......
  • Java 生态需要新鲜的血液、需要狂飙的刺激。Solon v2.4.1 发布
    Solon是什么开源项目?一个,Java新的生态型应用开发框架。它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模)。与其他框架相比,它解决了两个重要的痛点:启动慢,费内存。关键记事:2021年1月,正式对外开源2022年7月,建立官网,发力推广2023年2月,v2.0发布。......
  • UVM:4.1.1 验证平台内部的通信
    1.两个components通信可以有如下方法:1)设置全局变量。2)设置public让外部访问。3)写一个新的class,uvm_object,用config_db(config_object)配置,被配置的components去吃这个新的class。但是都不好!!!!!!!!!!!!!!!!2.1)上面的方法如果加入阻塞和非阻塞的概念,会更复杂。2)scoreboard主动要求数据,又怎么实现......
  • UVM:4.1.3 UVM 中的PORT 与 EXPORT
    1.UVM中常用的PORT有:总结到一起:1)put,get,transport都是3个。2)peek与get类似,都是主动获取数据。是有区别的。。。3)get_peek结合了get和peek的功能。4)前12个的参数就是PORT中的数据类型,后3个是request的类型和response的类型。5)如果没有指定是否阻塞,则都可以当。(都可以作只是端口......
  • CleanMyMac X4.14.1中文版如何清理 Mac系统?
    CleanMyMacX4.14.1中文版如何清理Mac系统?Mac系统在使用过程中都会产生大量系统垃圾,如不需要的系统语言安装包,视频网站缓存文件,mac软件卸载残留的注册表等。随着时间推移,mac系统垃圾就会越来越多,电脑就开始变慢变卡。CleanMyMacX可以帮你快速清理mac系统垃圾。CleanMyMacX4.14......
  • Android studio 4.1.2安装入门教程
    目录JDK安装与配置一、下载JDK二、JDK安装三、JDK的环境配置四、JDK的配置验证Androidstudio安装Androidstudio连接手机真机调试(以华为鸿蒙为例)一、新建一个android项目二、进入项目面板三、配置AndroidStudio四、安装手机驱动程序五、连接手机六、运行程序七、......
  • aqyi_pc_v9.4.156_去广告版
    特点描述:01.全新LOGO设计颜色统一深色风格02.绿化处理免安装,去安全效验,移除各种广告03.去今日推荐弹窗、去右下角精彩节目推送弹窗04.去缓冲广告、暂停广告,看片秒播,拒绝卡顿05.NSIS编译额外启动器,退出软件自动结束进程驻留程序下载地址:https://wwt.lanzouq.com/iOu4o04s4q2......