四道树状数组模版题

原创 2018年04月17日 15:52:41
概念与实现就(lande)不写了,反正一大堆

#532. 数星星

(严格来说其实不是模版题,但由于实际编码接近模版题,当作模版题来说)

题目描述

天文学家经常要检查星星的地图,每个星星用平面上的一个点来表示,每个星星都有坐标。我们定义一个星星的“级别”为给定的星星中不高于它并且不在它右边的星星的数目。天文学家想知道每个星星的“级别”。

                            5
                          *
                        4
                      *
                    1       2   3
                  *       *   *

例如上图,5号星的“级别”是3(1,2,4这三个星星),2号星和4号星的“级别”为1。

给你一个地图,你的任务是算出每个星星的“级别”。

(这图要横着看)

输入格式

输入的第一行是星星的数目N(1<=N<=60000),接下来的N行描述星星的坐标(每一行是用一个空格隔开的两个整数X,Y,0<=X,Y<=32000)。

星星的位置互不相同。星星的描述按照Y值递增的顺序列出,Y值相同的星星按照X值递增的顺序列出。

由于说到(星星的描述按照Y值递增的顺序列出,Y值相同的星星按照X值递增的顺序列出。),就可以得出结论:每输入一次x,输出x位置的前缀和,再将x加入树状数组(这里的先后顺序可以保证不将自己算进答案中),可以得到答案:

以4为例,因为在之前前缀和已经计算了比4的y值小的答案(Y值递增),又因为之前前缀和已经计算了比4的x值小的答案(Y值相同,X值递增),所以正看时getsum(x)是4的左边、正下方与左下方的所有星星个数。

所以实现的是一个最基础的树状数组:

操作:

1.单点修改

2.查询前缀和

int add(int x)
{
	for (;x<=50000;x+=lowbit(x))
	 t[x]++;
}
int getsum(int x)
{
	int ans=0;
	for (;x;x-=lowbit(x))
	 ans+=t[x];
	return ans;
}

#531. 树状数组

操作:

1.单点修改

2.查询区间和

这个没什么好说的,就是输出稍作变动:

printf("%d\n",sum(y)-sum(x-1));

这个很好理解:

一数列a[1]-a[5]:1 2 8 6 30

前缀和b[1]-b[5]:1 3 11 17 47

如果要查询3-5的区间和:

a[3]+a[4]+a[5]=a[1]+a[2]+a[3]+a[4]+a[5]-a[1]-a[2]

                       =b[5]-b[2](这个总看得懂)

                       =b[5]-b[3-1]

所以……没有所以了吧

#533. 区间修改单点查询

操作:

1.区间修改

2.单点查询


区间修改要用到差分思想:

add(x,k);
add(y+1,-k);

如果x=2 y=5 k=3

在一个长度为6数值为0的数列中:

修改后为0 3 0 0 -3

计算前缀和:0 3 3 3 0

从x的位置开始计算+k,在遇到y+1时恢复(+k-k=0)

单点查询也就是长度为1的区间查询,不再赘述

#534. 打鼹鼠

操作:

1.单点修改

2.查询平面和

这波直接上代码:

void add(int x,int y,int k)
{
	for (;x<=n;x+=lowbit(x))
	 {
	 	int j=y;
	 	for (;j<=n;j+=lowbit(j))
	 	 t[x][j]+=k;
	 }
	return;
}//在二维平面内单点修改,相信还是看得懂的
int getsum(int x,int y)
{
	int ans=0;
	for (;x;x-=lowbit(x))
	 {
	 	int j=y;
	 	for (;j;j-=lowbit(j))
	 	 ans+=t[x][j];
	 }
	return ans;
}//在二维平面内查询二维前缀和,相信也还是看得懂的
由于查询的是二维前缀和,还是要处理一下数据的:
printf("%d\n",getsum(x2,y2)+getsum(x1-1,y1-1)-getsum(x2,y1-1)-getsum(x1-1,y2));
前缀和处理成平面和的方法与处理成区间和的方法大同小异,就不再说了
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fsl123fsl/article/details/79975059

软件开发,人的管理——书评《最后期限》

软件开发,人的管理——书评《最后期限》Windy.J    记得有一段时间,我迷上了UFO,神秘文明,四维空间等等,走在路上,周围一个人也没有的时候,经常会担心:我会不会一不小心走进四维空间,然后发生...
  • gigix
  • gigix
  • 2003-03-07 15:40:00
  • 1881

树状数组模板题—hdu1166+poj2352

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1166
  • Delacour_
  • Delacour_
  • 2014-06-22 20:10:17
  • 683

树状数组模板及poj几道简单题

/* 觉得真是…经历了高考啥都忘了(其实还是当初学得不踏实 现在一点一点再重新来补吧(过了一年再来说这话的我 */参考资料及模板http://blog.csdn.net/lawrence_jan...
  • kkkkahlua
  • kkkkahlua
  • 2017-08-06 18:09:04
  • 209

RHCSA 16题

  • 2015年01月30日 16:12
  • 4KB
  • 下载

树状数组(模板)

树状数组模板
  • u012860063
  • u012860063
  • 2014-04-30 20:54:58
  • 3473

蓝桥杯 入门训练四道题

第一题: 入门训练 Fibonacci数列 重点: 在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值, 再将计算的结果除以10007取余数,...
  • yhflyl
  • yhflyl
  • 2018-02-12 12:08:44
  • 26

回答 | 4道过滤菜鸟的iOS面试题

1. struct和class的区别swift中,class是引用类型,struct是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个”指向”。所以他们两者之间的区别就是两个...
  • lxubin
  • lxubin
  • 2016-08-17 10:30:27
  • 1078

树状数组题集[不断更新]

一. 基本原理 树状数组中用的d【】,每个点都有一定的管辖范围; 如c[1]=a[1]; d[2]=a[1]+a[2]; d[3]=a[3]; d[4]=a[1]...
  • Matrix_Reloaded
  • Matrix_Reloaded
  • 2014-06-18 11:40:26
  • 3194

树状数组萌新讲解+基础习题【一点一滴】

树状数组基础篇树状数组讲点中文名:树状数组 英文名:Binary Indexeds Tree 英译中:二进制索引树 这特么多清楚引入: 给你n个数 1. 求区间的的和 2. 改变某个值...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2016-08-02 11:09:48
  • 807

【树状数组】专题+模板

先放模板。。。 #define lowbit(x) (x) & (-x) const int N=1005; const int M=1e9+7; int dp[N][N],c[N][N]; int...
  • cacyth
  • cacyth
  • 2015-12-02 20:07:23
  • 726
收藏助手
不良信息举报
您举报文章:四道树状数组模版题
举报原因:
原因补充:

(最多只允许输入30个字)