HDU 4325 离散化+树状数组 或者 不使用树状数组
题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放。
由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段树与树状数组两种做法,一般的,树状数组是用来维护区间和与单点修改的,那么,如何通过树状数组进行区间更新和单点查询呢,联想到差分数组,差分数组可以在o(1)的时间内进行区间的更新,但是单点查询的效率为o(n),显然不能用于处理此题,这时,考虑树状数组维护差分数组,就可以o(logn)地进行区间更新(更新差分数组的 l, r+1即可,使sub[l]++,sub[r+1]--),o(logn)地查询单点值(求差分数组前缀和)//树状数组维护差分数
#include<bits/stdc++.h#define N 100005#define mod 998244353 using namespace std; typedef long long ll; int sub[N<<1],n,l[N],r[N],tim[N],nn; int lowbit(int x){ return x&-x;}; int add(int x,int val) {while(x<=nn){sub[x]+=val;x+=lowbit(x);} } int query(int x) {int ans=0;while (x>0){ans+=sub[x];x-=lowbit(x);}return ans; } int main() {int t;cin>>t;for(int ca=1;ca<=t;ca++){memset(sub,0, sizeof(sub));vector<int>mp;int q,L,R;cin>>n>>q;for(int i=1;i<=n;i++){scanf("%d%d",l+i,r+i);mp.push_back(l[i]);mp.push_back(r[i]);}for(int i=1;i<=q;i++){scanf("%d",tim+i);mp.push_back(tim[i]);}nn=mp.size();sort(mp.begin(),mp.end());unique(mp.begin(),mp.end());for(int i=1;i<=n;i++){L=lower_bound(mp.begin(),mp.end(),l[i])-mp.begin()+1;R=lower_bound(mp.begin(),mp.end(),r[i])-mp.begin()+1;add(L,1);add(R+1,-1);}//for(int i=1;i<=mp.size();i++)cerr<<query(i)<<endl;printf("Case #%d:\n",ca);for(int i=1;i<=q;i++){int pos=lower_bound(mp.begin(),mp.end(),tim[i])-mp.begin()+1;printf("%d\n",query(pos));}}return 0; }
嘤嘤嘤~~博客写完,我就后悔了,本题的区间更新和单点查询操作是分开的,那么我为什么搞这么麻烦还用树状数组,直接差分数组求和后不就能o(1)单点查询了吗。。但是总体复杂度不变,仍为o(nlogn)
(n为离散化后,映射中点的个数,),常数降低了很多,,虽然运行时间只是由312ms到296ms,但是写起来简单了许多,以下是没有使用树状数组的ac代码
//树状数组维护差分数组 #include<bits/stdc++.h> #define N 100005 #define mod 998244353 using namespace std; typedef long long ll; int sub[N<<1],n,l[N],r[N],tim[N],nn; int main() {int t;cin>>t;for(int ca=1;ca<=t;ca++){memset(sub,0, sizeof(sub));vector<int>mp;int q,L,R;cin>>n>>q;for(int i=1;i<=n;i++){scanf("%d%d",l+i,r+i);mp.push_back(l[i]);mp.push_back(r[i]);}for(int i=1;i<=q;i++){scanf("%d",tim+i);mp.push_back(tim[i]);}nn=mp.size();sort(mp.begin(),mp.end());unique(mp.begin(),mp.end());for(int i=1;i<=n;i++){L=lower_bound(mp.begin(),mp.end(),l[i])-mp.begin()+1;R=lower_bound(mp.begin(),mp.end(),r[i])-mp.begin()+1;sub[L]++;sub[R+1]--;}for(int i=1;i<=nn;i++)sub[i]+=sub[i-1];printf("Case #%d:\n",ca);for(int i=1;i<=q;i++){int pos=lower_bound(mp.begin(),mp.end(),tim[i])-mp.begin()+1;printf("%d\n",sub[pos]);}}return 0; }
事实证明,只要多思考,问题就会更简单。算是一点小小的启发吧
转载于:https://www.cnblogs.com/xusirui/p/9427708.html
HDU 4325 离散化+树状数组 或者 不使用树状数组相关推荐
- 数据结构 【树状数组】【线段树】【珂朵莉树】
一.区间合并 1.AcWing245你能回答这些问题吗 分析: 线段树.维护四个变量,即可实现区间合并. mx 区间最大连续子段和 mx_l 以区间左端点为左界的最大连续字段和 mx_r 以区间左端点 ...
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的-- 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
[题目] Atlantis Problem Description There are several ancient Greek texts that contain descriptions of ...
- php 数据集转换树、递归重组节点信息多维数组(转)
一.将数据集转换成树 /*** 将返回的数据集转换成树* @param array $list 数据集* @param string $pk 主键* @param string $pid 父节点名称* ...
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放、hclust包层次聚类(创建距离矩阵、聚类、绘制树状图dendrogram,在树状图上绘制红色矩形框)
R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放.hclust包层次聚类(创建距离矩阵.聚类.绘制树状图dendrogram,在树状图上绘制红色矩形框) ...
- 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...
作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...
- b+树时间复杂度_数据结构:线性表,栈,队列,数组,字符串,树和二叉树,哈希表...
作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...
- 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查
03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...
最新文章
- java+mysql中文乱码问题
- 设计模式-Decorator模式
- lua脚本在redis集群中执行报错--Lua script attempted to access a non local key in a cluster node...
- 大数据统计分析毕业设计_大数据分析与传统统计分析的区别
- 「JavaScript面向对象编程指南」原型
- mysql卸载工具下载_MySQL的卸载、下载与安装
- Nexus 3.X(Maven仓库私服)仓库迁移与备份
- Python实现恋爱AA公式
- PMP模拟题 | 每日一练,快速提分
- 最大约数(秋季每日一题 34)
- arXiv每日推荐-5.9:计算机视觉/图像处理每日论文速递
- 爬取实习僧工作岗位信息
- 苹果手机微信怎么接龙_微信又更新了:群接龙怎么玩?文件如何备份?怎么发高清大视频?...
- 全球及中国布鲁顿酪氨酸蛋白激酶抑制剂行业研究及十四五规划分析报告
- CS:GO开服架设服务器搭建游戏配置方法教程教学插件配置下载资源配置
- 来了,掏心窝的最重要3条建议
- 经典简单的猜数字小游戏
- BruteXSS:XSS暴力破解神器
- 解决: Error Code: 2013. Lost connection to MySQL server during query
- 魔兽世界怀旧服2020年最新服务器列表,2020年2月15日魔兽世界怀旧服服务器的排队等待时间的真实数据...