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<<],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=;
while (x>)
{
ans+=sub[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int t;
cin>>t;
for(int ca=;ca<=t;ca++)
{
memset(sub,, sizeof(sub));
vector<int>mp;
int q,L,R;
cin>>n>>q;
for(int i=;i<=n;i++)
{
scanf("%d%d",l+i,r+i);
mp.push_back(l[i]);
mp.push_back(r[i]);
}
for(int i=;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=;i<=n;i++)
{
L=lower_bound(mp.begin(),mp.end(),l[i])-mp.begin()+;
R=lower_bound(mp.begin(),mp.end(),r[i])-mp.begin()+;
add(L,);
add(R+,-);
}
//for(int i=1;i<=mp.size();i++)cerr<<query(i)<<endl;
printf("Case #%d:\n",ca);
for(int i=;i<=q;i++)
{
int pos=lower_bound(mp.begin(),mp.end(),tim[i])-mp.begin()+;
printf("%d\n",query(pos));
}
}
return ;
}
嘤嘤嘤~~博客写完,我就后悔了,本题的区间更新和单点查询操作是分开的,那么我为什么搞这么麻烦还用树状数组,直接差分数组求和后不就能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<<],n,l[N],r[N],tim[N],nn;
int main()
{
int t;
cin>>t;
for(int ca=;ca<=t;ca++)
{
memset(sub,, sizeof(sub));
vector<int>mp;
int q,L,R;
cin>>n>>q;
for(int i=;i<=n;i++)
{
scanf("%d%d",l+i,r+i);
mp.push_back(l[i]);
mp.push_back(r[i]);
}
for(int i=;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=;i<=n;i++)
{
L=lower_bound(mp.begin(),mp.end(),l[i])-mp.begin()+;
R=lower_bound(mp.begin(),mp.end(),r[i])-mp.begin()+;
sub[L]++;
sub[R+]--;
}
for(int i=;i<=nn;i++)sub[i]+=sub[i-];
printf("Case #%d:\n",ca);
for(int i=;i<=q;i++)
{
int pos=lower_bound(mp.begin(),mp.end(),tim[i])-mp.begin()+;
printf("%d\n",sub[pos]);
}
}
return ;
}
事实证明,只要多思考,问题就会更简单。算是一点小小的启发吧
HDU 4325 离散化+树状数组 或者 不使用树状数组的更多相关文章
- HDU 6203 ping ping ping(dfs序+LCA+树状数组)
http://acm.hdu.edu.cn/showproblem.php?pid=6203 题意: n+1 个点 n 条边的树(点标号 0 ~ n),有若干个点无法通行,导致 p 组 U V 无法连 ...
- hdu 1166 敌兵布阵——(区间和)树状数组/线段树
pid=1166">here:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Input 第一行一个整数T.表示有T组数据. 每组数据第一 ...
- HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...
- R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数
R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...
- 【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1146 第一种做法(时间太感人): 第二种做法(rank5,好开心) ================ ...
- 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)
[题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...
- POJ 1804 Brainman(5种解法,好题,【暴力】,【归并排序】,【线段树单点更新】,【树状数组】,【平衡树】)
Brainman Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10575 Accepted: 5489 Descrip ...
- Vijos P1448 校门外的树【多解,线段树,树状数组,括号序列法+暴力优化】
校门外的树 描述 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作: K=1,K= ...
- SPOJ DQUERY树状数组离线or主席树
D-query Time Limit: 227MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submit Status ...
随机推荐
- springboot 在配置文件写参数注入到类中
@Configuration//配置文件位置@PropertySource("classpath:city.properties")//前缀@ConfigurationProper ...
- node.js是用来做什么的
Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物,使得不 ...
- C# - 怎么截取字符串中指定字符及其后面的字符
方法1:去掉空格以及后面的字符 //怎么截取让date的值为"2011/12/9",即去掉空格以及后面的字符 string date = "2011/12/9 2 ...
- CSP2019总结
CSP2019总结 前言 赛前停课集训了两个星期,自认为已经准备充分了,结果... 不知道有没有写挂分,即使一分没挂,满打满算也只有400出头,还是太菜了. Day0 晚上复习了一会,打了会游戏就睡了 ...
- 洛谷 P4196 [CQOI2006]凸多边形 (半平面交)
题目链接:P4196 [CQOI2006]凸多边形 题意 给定 \(n\) 个凸多边形,求它们相交的面积. 思路 半平面交 半平面交的模板题. 代码 #include <bits/stdc++. ...
- 20140610 PP中可以绘制表格;PPT组合之后再加效果
PPT绘制表格(行人检测的cell和block) 动画:组合之后再加效果
- 2019ICPC南京网络赛A The beautiful values of the palace
题意:蛇形填数超大版本,需要求出一些给定坐标的值的数位和,然后q次询问,一个矩形区域内值的和是多少 解题思路:二维偏序前缀和的经典题 二维偏序:求(x,y)左下角点的个数,思路是对x,y升序排序,用树 ...
- 多个串的最长公共子串 SPOJ - LCS2 后缀自动机
题意: 求多个串的最长公共子串 这里用的是O(n)的后缀自动机写法 我后缀数组的专题有nlog(n)写法的 题解: 对于其中的一个串建立后缀自动机 然后对于后缀自动机上面的每一个节点求出每一个节点最长 ...
- span里面插入文字
.text-box span::before{ content:attr(data-text);}
- 使用sqlyog工具同步两个相同结构的数据库之间的数据
compare two database data 因为工作上遇到 同一个项目被部署到不同服务器上,原项目(后统称"源")在运行中,后部署的项目(后统称"目标" ...