题目链接:https://loj.ac/problem/10115

题目描述

原题来自:Vijos P1448

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

  • K=1,读入l,r 表示在l  到 r 之间种上一种树,每次操作种的树的种类都不同;
  • K=2,读入 l,r 表示询问 l 到 r 之间有多少种树。

注意:每个位置都可以重复种树。

输入格式

第一行  表示道路总长为 n,共有  m个操作;
接下来 m 行为 m 个操作。

输出格式

对于每个 K=2 输出一个答案。

样例

样例输入

5 4
1 1 3
2 2 5
1 2 4
2 3 5

样例输出

1
2

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

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

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<queue>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int n,m,k,l,r,sum1[maxn],sum2[maxn];
//sum1[i]表示的是区间[1,i]中左端点的数目,sum2[i]表示的是区间[1,i]右端点的数目;
int lowbit(int x){return x&(-x);}
void update1(int x,int val){ //更新左端点的数目 while(x<=maxn){sum1[x]+=val;x+=lowbit(x);}
}
void update2(int x,int val){  //更新右端点的数目 while(x<=maxn){sum2[x]+=val;x+=lowbit(x);}
}
int ask1(int x){  //查找区间[1,x]中左端点的数目 int res=0;while(x){res+=sum1[x];x-=lowbit(x);}return res;
}
int ask2(int x){  //查找区间[1,x]中右端点的数目 int res=0;while(x){res+=sum2[x];x-=lowbit(x);}return res;
}
int main(){cin>>n>>m;while(m--){cin>>k>>l>>r;if(k==1){update1(l,1); update2(r,1);}else{cout<<ask1(r)-ask2(l-1)<<endl;}}return 0;
}

转载于:https://www.cnblogs.com/zjl192628928/p/10630450.html

Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)相关推荐

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

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

  2. 树状数组(二)——#10115. 「一本通 4.1 例 3」校门外的树

    题目链接:https://loj.ac/problem/10115 解题思路 一开始误会了重复种树的意思,以为是线段树染色QAQ,后来知道了重复种树是指该位置可以种无限棵树,用树状数组就能解决.我们用 ...

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

    题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作: K=1,读入 l,r表示在 l 到 r 之间种上 ...

  4. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  5. LOJ #10155. 「一本通 5.2 例 3」数字转换

    无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...

  6. LOJ 10155. 「一本通 5.2 例 3」数字转换

    题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...

  7. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

  8. #10049. 「一本通 2.3 例 1」Phone List(trie树应用)

    POJ3630: 给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据. 输入格式 第一行一个整数 ,表示数据组数. 对于每组数据,第一行一个数 ,接下来 行输入 个数 ...

  9. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

最新文章

  1. C# 栈 、队列的概念
  2. 怎么使用java初始化链表_Java 链表(LinkNode)的简单操作:初始化,遍历,插入,删除等...
  3. 【转载】Instagram架构分析笔记
  4. http通信协议的基本原理
  5. ubuntu系统备份和还原_如何使用Aptik在Ubuntu中备份和还原您的应用程序和PPA
  6. OK335xS dhcpcd porting
  7. Linux中设置tab4个空格,linux下vim中tab设置为4个空格例子
  8. Office文档转pdf和图片之NodeJS
  9. 关于字体的一些知识,以及分享一些免费可商用字体
  10. EICU数据库安装教程
  11. 正己尽己【管理学之六】
  12. Could not resolve subtype of [simple type, class org.apereo.cas.services.Reg...
  13. VBA教程初级(二):数据结构
  14. linux添加mx记录,在C linux中查询MX记录
  15. eclipse中的servers不见了解决方法
  16. 我终于读懂了适配器模式。。。
  17. zookeeper 启动失败,报错 “ZooKeeper JMX enabled by default”
  18. 【医学图像处理】CT成像技术之CT剂量
  19. 什么是外汇套期保值?套期保值和对冲有什么区别?
  20. Http状态码大全(100、200、300、404、500等)

热门文章

  1. IOS研究之App转让流程须知具体介绍
  2. 闪屏,default
  3. Flink SQL Client进行Kafka事实表与Hbase维度表Join(纯DDL/SQL方式)
  4. RowTime field should not be null, please convert it to a non-null long value.
  5. flink中的table api中的CloseableIterator是什么意思?
  6. cannot resolve symbol ‘springframework‘
  7. NIFI从mysql导入Hbase
  8. 集群状态正常时需要的jps进程+是否需要部署到各个节点(持续更新中)
  9. SecureCRT退格键需要出现^H
  10. 连续设置多张背景图片并且平铺