数据结构——查分数组

数据结构——查分数组介绍查分数组是一个数据结构。相当于前缀和的逆运算。查分数组的功能是修改区间,查询点。修改区间的时间复杂度是O(1).查询点的时间复杂度是O(n)。若配合树状数组时间复杂度可达到O(logn)。修改区间操作x位置加上修改量,y+1位置减去修改量。这样就相当于整个区间的元素都修改了。staticvoidupdate(intx,inty,intz){ b[x]+=z; b[y+1]-=z;}查询刚刚修改方便了,但是查询的时候就需要全部都加一遍了。staticint

大家好,又见面了,我是你们的朋友全栈君。

介绍

查分数组是一个数据结构。相当于前缀和的逆运算。
查分数组的功能是修改区间,查询点。
修改区间的时间复杂度是O(1).
查询点的时间复杂度是O(n)。若配合树状数组时间复杂度可达到O(log n)。

  • 修改区间操作
    x位置加上修改量,y+1位置减去修改量。这样就相当于整个区间的元素都修改了。
static void update(int x,int y,int z){ 
   
	b[x]+=z;
	b[y+1]-=z;
}
  • 查询
    刚刚修改方便了,但是查询的时候就需要全部都加一遍了。
static int sum(int x){ 
   
	int ans=0;
	for(int i=1;i<=x;i++) ans+=b[i];
	return ans;
}
  • 预处理
	b[1]=a[1];
	for(int i=2;i<=n;i++) b[i]=a[i]=a[i-1];

算法思路

地推建立查分数组s。使用递推式:c[i]=a[i-1]-a[i]。
将s[left]+k,s[right+1]-k可以实现区间修改的目的。
单点查询:求前缀和。
还原原数组的方式:s[i]+=s[i-1]

D – Tallest Cow

原题链接
这道题数据卡的很死。这种方法应该不是最优。我按原题给的最大数据范围开了数组空间。然后超了内存。


import java.io.IOException;
import java.util.Scanner;

public class Main { 
   
	/* * POJ-3263 D - Tallest Cow * 查分数组+前缀和 */
	static int N,I,R,H,a,b,M,cf[];
	static boolean vis[][];
	
	public static void main(String []args)throws IOException { 
   
		Scanner sc=new Scanner(System.in);
		N=sc.nextInt();I=sc.nextInt();
		H=sc.nextInt();R=sc.nextInt();
		M=N+1;
		vis=new boolean [M][M];
		cf=new int [N+1];
		for(int i=1;i<=R;i++) { 
   
			a=sc.nextInt();
			b=sc.nextInt();
			if(a>b) { 
    int temp=a;a=b;b=temp; }
			if(!vis[a][b]) { 
   
				cf[a+1]--;
				cf[b]++;
				vis[a][b]=true;
			}
		}
		int res=0;
		for(int i=1;i<=N;i++) { 
   
			res+=cf[i];
			System.out.println(H+res);
		}
	}
}
/* 9 3 5 5 1 3 5 3 4 3 3 7 9 8 5 4 5 3 4 4 5 5 5 */
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130612.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MyEclipse8.5免费的注册码[通俗易懂]

    MyEclipse8.5免费的注册码[通俗易懂]打开MyEclipse8.5,点击工具栏上的”MyEclipse”菜单–》SubscriptionInformation–》填入Subscribe和SubscriptionCode,如下:这三个,MyEclipse8.5注册码,到2017年   (1)Subscriber:jom   SubscriptionCode:wLR8ZC-855575-625668535

    2022年9月30日
    2
  • VSCode汉化_vscode汉化插件

    VSCode汉化_vscode汉化插件1.打开VSCode点击箭头指示地方在搜索框中输入chinese然后安装中文简体2.按住Ctrl+shift+p选择配置显示语言然后会看见下面的样子添加"locale&qu

    2022年8月2日
    7
  • win7-64bit 下oracle11g plsql 的正确安装[通俗易懂]

    win7-64bit 下oracle11g plsql 的正确安装

    2022年2月1日
    36
  • Java和c++哪个就业前景好

    Java和c++哪个就业前景好二、回顾整理阿里面试题基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了。自我介绍JVM如何加载一个类的过程,双亲委派模型中有哪些方法?HashMap如何实现的?HashMap和ConcurrentHashMap区别,ConcurrentHashMap线程安全hashtable吗,ConcurrentHashMap如何保证线程安全?HashMap和HashTable区别,HashTable线程安全吗?进程间通信有哪几种方式JVM分为哪些区,每一个区干吗的?JVM如

    2022年7月7日
    27
  • c语言字符数组初始化的三种方式_c语言赋值字符串

    c语言字符数组初始化的三种方式_c语言赋值字符串C语言中字符数组的初始化与赋值,字符串相关函数!1.字符数组初始化在C语言中,字符串是当做字符数组来处理的;所以字符串有两种声明方式,一种是字符数组,一种是字符指针。(1)直接逐个初始化字符数组:字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。charstr[10]={‘I’,”,’a’,’m’,”,‘h’,’a’,’p’,’p’…

    2022年8月30日
    4
  • 一致性hash算法 java实现_信息的一致性

    一致性hash算法 java实现_信息的一致性介绍一致性Hash算法是实现负载均衡的一种策略,后续会写如何实现负载均衡一致哈希是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。强哈希考虑到单服务器不能承载,因此使用了分布式架构,最初的算法为hash()modn,hash()通常取用户ID,n为节点数。此方法容易实现且能够满足运营要求。缺点是当单点发

    2022年9月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号