数据结构——查分数组

数据结构——查分数组介绍查分数组是一个数据结构。相当于前缀和的逆运算。查分数组的功能是修改区间,查询点。修改区间的时间复杂度是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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • COM编程之三 QueryInterface

    COM编程之三 QueryInterface【1】IUnknown接口客户同组件交互都是通过接口完成的。在客户查询组件的其它接口时,也是通过接口完成的。而那个接口就是IUnknown。IUnknown接口的定义包含在Win32SDK中的UNKNEN.h头文件中。引用如下:1interfaceIUnknown2{3virtualHRESULT__stdcallQueryInterface(const…

    2022年6月23日
    22
  • xshell怎么退出vi_xshell5

    xshell怎么退出vi_xshell5最近在学习Linux时,初次使用Vi编辑模式编辑文本,但是编辑完成之后,不知道怎么退出编辑模式,然后在网上查找了一番,特此分享给各位老铁:下面总结一些vi退出命令,学习!进入编辑模式,按o进行编辑编辑结束,按ESC键跳到命令模式,然后输入退出命令::w 保存文件但不退出vi编辑:w! 强制保存,不退出vi编辑:wfile 将修改另存到file中,不退出vi…

    2022年9月30日
    0
  • seekg的应用案例

    seekg的应用案例在学习C++文件流控制时(链接)我们知道C++有一个标准库fstream该库定义了三个数据类型ofstreamifstream和fstream在练习相应的案例时,seekg()函数掌握的不是很好,后经过多次尝试,可以正常调用了代码如下:#include<fstream>#include<iostream>usingnamespacestd;intmain(){chardata[100];////以写模式打开文件

    2022年5月22日
    35
  • java中String\十六进制String\byte[]之间相互转换函数和MD5加密

    java中String\十六进制String\byte[]之间相互转换函数和MD5加密java中String\十六进制String\byte[]之间相互转换函数和MD5加密

    2022年4月23日
    94
  • 一致性哈希算法 虚拟节点(比一致性哈希还好的算法)

    采用固定哈希算法平衡负载在大规模的缓存应用中,应运而生了分布式缓存系统。key-value如何均匀的分散到集群中?最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K)modN对应的机器。但是在一些高速发展的web系统中,这样的解决方案仍有些缺陷。随着系统访问压力的增长,缓存系统不得不通过增加机器节点的方式提高集群的相应速…

    2022年4月14日
    49
  • Linux安装软件命令&&快捷键

    安装软件命令(1)、rpm和yum命令介绍rpm:rpm是由RedHat公司开发的一种软件包管理方式,使用rpm我们可以方便的进行软件的安装、查询、卸载等工作,但是使用rpm命令安装rpm软件包,不能自己解决软件包之间的依赖性问题,需要自己一个一个去安装依赖的软件包。yum:Yum(全称为YellowdogUpdater,Modified):是一…

    2022年4月15日
    80

发表回复

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

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