【树状数组】

问题的提出:是否可以用线性数据结构的方法解决动态统计子树权和的问题呢? 有的,树状数组。

假设当前数组为a[],元素个数为n。

1. 子区间的权和数组为sum,那么数组a[]中 i 到 j这段区间的数组元素和为sum[i,j]= a[k]的累加 【k属于(i->j)】

2. 现在定义前缀和数组s[],s[i]代表从a[i]---a[i]的和,那么又可以这样表示 sum[i,j] = s[j]-s[i-1].

3. lowbit(k)为整数k的二进制表示中 右边第一个1所代表的数字,lowbit(k)=k&(-k).

4. 树状数组为c[],c[k]存储的是从a[k]开始向 低的下标那边数lowbit(k)个元素之和,一层遍历。

注意:我们要把a[]数组的元素从下标1开始存储.

这里列举一下:

c[1]=a[1];                                                             s[1]=c[1];

c[2]=a[2]+a[1];                                                     s[2]=c[2];

c[3]=a[3];                                                             s[3]=c[3]+c[2];

c[4]=a[4]+a[3]+a[2]+a[1];                                    s[4]=c[4];

c[5]=a[5];                                                             s[5]=c[5]+c[4];

c[6]=a[6]+a[5];                                                    s[6]=c[6]+c[4];

c[7]=a[7];                                                             s[7]=c[7]+c[6]+c[4];

c[8]=a[8]+a[7]+a[6]+a[5]a[4]+a[3]+a[2]+a[1];    s[8]=c[8];

c[9]=a[9];                                                             s[9]=c[9]+c[8];

 

5. 计算每个s[i]的复杂度是O( log2(n) ).

6. 代码:

#include <stdio.h>
#include <string.h>int a[101];
int c[101];
int s[101];int lowbit(int x)
{return x&(-x);
}int sum(int x)
{int s=0;while(x>0){s+=c[x];x=x-lowbit(x);}return s;
}int main()
{int i, j, k;for(i=1; i<=10; i++)a[i]=i;//创建a[]数组for(i=1; i<=10; i++){//计算每个c[i]c[i]=0;//c[i]从初始为0for(j=i-lowbit(i)+1; j<=i; j++){c[i]+=a[j];}}for(i=1; i<=10; i++){s[i]=sum(i);//计算i的前缀数组和}return 0;
}

 

转载于:https://www.cnblogs.com/yspworld/p/4724552.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2013VS快捷键

VS2013常用快捷键&#xff1a; 1.回到上一个光标位置/前进到下一个光标位置 1&#xff09;回到上一个光标位置&#xff1a;使用组合键“Ctrl -”&#xff1b; 2&#xff09;前进到下一个光标位置&#xff1a;“Ctrl Shift - ”。 2.复制/剪切/删除整行代码 1&#xff09;如果…

GWT,GWT-Ext(SmartGWT),GXT(Ext GWT)常见任务

我在我们的JCG合作伙伴之一UI-Programming博客上浏览了一些旧文章&#xff0c;并注意到有很多简短的文章&#xff0c;介绍了如何使用GWT&#xff0c;GWT-Ext&#xff08;SmartGWT&#xff09;和GXT&#xff08;Ext GWT&#xff09;执行一些常见任务。 &#xff09;。 我相信它们…

h.264 去块滤波

块效应及其产生原因 我们在观看视频的时候&#xff0c;在运动剧烈的场景常能观察到图像出现小方块&#xff0c;小方块在边界处呈现不连续的效果&#xff08;如下图&#xff09;&#xff0c;这种现象被称为块效应&#xff08;blocking artifact&#xff09;。 首先我们需要搞清楚…

android开发的知识点(一)

1.android中背景图的设置&#xff1a; 将背景图放入到项目中的res/drawable-hdpi或res/drawable-mdpi或res/drawable-xhdpi或res/drawable-xxhdpi等任一文件夹下。然后在layout的xml文件夹下使用android:background"drawable/背景图名"&#xff0c;其中背景图必须是p…

566. 重塑矩阵

在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵&#xff0c;以及两个正整数 r 和 c &…

RabbitMQ播放模块! 构架

RabbitMQ提供了具有可预测且一致的吞吐量和延迟的高可用性&#xff0c;可伸缩和便携式消息系统。 RabbitMQ是AMQP &#xff08;业务消息传递的开放标准&#xff09;的领先实现 &#xff0c;并且通过适配器支持XMPP&#xff0c;SMTP&#xff0c;STOMP和HTTP来进行轻量级Web消息传…

Cyclic Nacklace - HDU 3746(next求循环节)

题目大意&#xff1a;给你一些串&#xff0c;问如果想让这个串里面的循环节至少循环两次&#xff0c;需要添加几个字符&#xff08;只能在最前面或者最后面添加&#xff09;。比如ababc 需要添加5个就是添加ababc。 分析&#xff1a;其实字符串的长度len-next[len] 最小循环节…

Xuggler开发教程

大家好&#xff0c; 在这篇文章中&#xff0c;我想介绍JavaCodeGeeks上的一些很酷的新教程。 他们将讨论与Xuggler &#xff0c; FFmpeg和Wowza进行媒体&#xff08;音频/视频&#xff09;操纵的方式。 我将在这篇文章中跟踪所有相关的教程。 您可以通过查看Pat较早的关于使用…

739. 每日温度

请根据每日 气温 列表 temperatures &#xff0c;请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 代码一 单调栈 class Solution {public int[] dailyTemperatures(int[] temperatures) {int length temperatur…

一个非常好的性格切割问题

结伙stackoverflow看到一道非常不错的问题。遂拿来分享之。 题目要求&#xff1a;我有一个非常长的字符串&#xff1a; String s1"This is my world. This has to be broken." 我要把上面的字符串打乱以固定的长度&#xff08;比如10&#xff09;使得输出为&#xff…

Cajo,用Java完成分布式计算的最简单方法

摘自Jonas Boner在2006年5月1日发布在TheServerSide.com上的文章“ Distributed Computing Easy”中的介绍部分&#xff1a; 分布式计算在企业应用程序开发世界中变得越来越重要。 如今&#xff0c;开发人员不断需要解决以下问题&#xff1a;如何通过将应用程序扩展到单个节点之…

Java中Integer.parseInt()用法

1.先看看该方法的实现 public static int parseInt(String s) throws NumberFormatException {return parseInt(s,10);}2.事实上他可以有两个参数&#xff0c; public static int parseInt(String s,int radix)意味着将字符串s按照radix进制转换成整数。太抽象了&#xff0c;…

关于maven相互依赖的工程部署问题

环境&#xff1a;win7 64位&#xff0c;myeclipse10.6&#xff0c;eclipse4.5&#xff0c;都配置了svn插件 问题描述&#xff1a;1、工程模块化之后都是通过pom配置model来关联的&#xff0c;svn提交之后&#xff0c;通过myeclipse的svn‘检出为项目’&#xff0c;依赖的子工程…

什么是JAR包?

jar包就是别人已经写好的一些类&#xff0c;然后将这些类进行打包&#xff0c;你可以将这些jar包引入你的项目中&#xff0c;然后就可以直接使用这些jar包中的类和属性了&#xff0c;这些jar包一般都会放在lib目录下的 转载于:https://www.cnblogs.com/wulianshang/p/5513474.h…

....

输入流和输出流相对于内存设备而言. 将外设中的数据读取到内存中:输入将内存的数写入到外设中&#xff1a;输出。 字符流的由来&#xff1a;其实就是&#xff1a;字节流读取文字字节数据后&#xff0c;不直接操作而是先查指定的编码表。获取对应的文字。在对这个文字进行操作。…

DataNucleus 3.0与Hibernate 3.5

如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规范&#xf…

手工内存管理规则的总结

1.如果需要保持一个对象不被销毁,可以使用retain.在使用完对象后,需要使用release销毁 2.给对象发送release消息并不会销毁对象,只有当这个对象的引用计数减为0时,对象才会被销毁.然后系统会发送dealloc消息给这个对象用于释放它的内存. 对使用了retain或者copy,mutableCopy,al…

Java 字符,整型,字符串三者转换

1.整型 —> 字符型 先把整型转化为字符串&#xff0c;再把字符串转化为字符 //整型 ---> 字符型 toString(int n).charAt(int index) System.out.println(Integer.toString(20).charAt(0));2.整型 —> 字符串 //整型 ---> 字符串 Inte…

AngularJS 的常用特性(二)

3、列表、表格以及其他迭代型元素 ng-repeat可能是最有用的 Angular 指令了&#xff0c;它可以根据集合中的项目一次创建一组元素的多份拷贝。 比如一个学生名册系统需要从服务器上获取学生信息&#xff0c;目前先把模型之间定义在 JavaScript 代码里面&#xff1a; 1 var stud…

Ruby,Python和Java中的Web服务

今天&#xff0c;我不得不准备一些示例来说明Web服务是可互操作的。 因此&#xff0c;我已经使用Metro使用Java创建了一个简单的Web服务&#xff0c;并在Tomcat上启动了它。 然后尝试使用Python和Ruby消耗它们。 这是全部完成的过程… Java中的Web服务 我从Java中的简单Web服…