Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接: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」校门外的树 (树状数组)相关推荐
- #10115. 「一本通 4.1 例 3」校门外的树
描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K=1,读入l. ...
- 树状数组(二)——#10115. 「一本通 4.1 例 3」校门外的树
题目链接:https://loj.ac/problem/10115 解题思路 一开始误会了重复种树的意思,以为是线段树染色QAQ,后来知道了重复种树是指该位置可以种无限棵树,用树状数组就能解决.我们用 ...
- 「一本通 4.1 例 3」校门外的树 (loj10115)
题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作: K=1,读入 l,r表示在 l 到 r 之间种上 ...
- 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] ...
- LOJ #10155. 「一本通 5.2 例 3」数字转换
无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...
- LOJ 10155. 「一本通 5.2 例 3」数字转换
题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...
- LOJ 10155 - 「一本通 5.2 例 3」数字转换
前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...
- #10049. 「一本通 2.3 例 1」Phone List(trie树应用)
POJ3630: 给定 个长度不超过 的数字串,问其中是否存在两个数字串 ,使得 是 的前缀,多组数据. 输入格式 第一行一个整数 ,表示数据组数. 对于每组数据,第一行一个数 ,接下来 行输入 个数 ...
- 【C++】「一本通 1.1 例 4」加工生产调度
「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...
最新文章
- C# 栈 、队列的概念
- 怎么使用java初始化链表_Java 链表(LinkNode)的简单操作:初始化,遍历,插入,删除等...
- 【转载】Instagram架构分析笔记
- http通信协议的基本原理
- ubuntu系统备份和还原_如何使用Aptik在Ubuntu中备份和还原您的应用程序和PPA
- OK335xS dhcpcd porting
- Linux中设置tab4个空格,linux下vim中tab设置为4个空格例子
- Office文档转pdf和图片之NodeJS
- 关于字体的一些知识,以及分享一些免费可商用字体
- EICU数据库安装教程
- 正己尽己【管理学之六】
- Could not resolve subtype of [simple type, class org.apereo.cas.services.Reg...
- VBA教程初级(二):数据结构
- linux添加mx记录,在C linux中查询MX记录
- eclipse中的servers不见了解决方法
- 我终于读懂了适配器模式。。。
- zookeeper 启动失败,报错 “ZooKeeper JMX enabled by default”
- 【医学图像处理】CT成像技术之CT剂量
- 什么是外汇套期保值?套期保值和对冲有什么区别?
- Http状态码大全(100、200、300、404、500等)
热门文章
- IOS研究之App转让流程须知具体介绍
- 闪屏,default
- Flink SQL Client进行Kafka事实表与Hbase维度表Join(纯DDL/SQL方式)
- RowTime field should not be null, please convert it to a non-null long value.
- flink中的table api中的CloseableIterator是什么意思?
- cannot resolve symbol ‘springframework‘
- NIFI从mysql导入Hbase
- 集群状态正常时需要的jps进程+是否需要部署到各个节点(持续更新中)
- SecureCRT退格键需要出现^H
- 连续设置多张背景图片并且平铺