【Hibernate步步为营】--复合主键映射详解

本题是最基本的分段树操作了。或者一般叫线段树,不过好像和线段没什么关系,只是分段了。

不使用lazy标志,更新只是更新单点。

如果不使用分段树,那么更新时间效率只需要O(1),使用分段树更新效率就需要O(lgn)了。

但是不是用分段树,那么查询的时间效率是O(n),而分段树查询效率是O(lgn)

这就是amortize分摊了时间,而且lgn真的很快,数据不是非常巨大的时候,接近常数了。

故此本题需要使用分段树。

#include <cstdio>

class EnemyInfo
{
	static const int SIZE = 50001;
	int segTree[SIZE<<2];
	inline int lChild(int r) { return r<<1; }
	inline int rChild(int r) { return r<<1|1; }

	void pushUp(int root)
	{
		segTree[root] = segTree[lChild(root)] + segTree[rChild(root)];
	}

	void buildTree(int l, int r, int rt)
	{
		if (l == r)
		{
			scanf("%d", &segTree[rt]);
			return ;
		}

		int m = l + ((r-l)>>1);
		buildTree(l, m, lChild(rt));
		buildTree(m+1, r, rChild(rt));
		pushUp(rt);
	}

	void update(int addPoint, int addNum, int l, int r, int rt)
	{
		if (l == r)
		{
			segTree[rt] += addNum;
			return ;
		}

		int m = l + ((r-l)>>1);
		if (addPoint <= m) update(addPoint, addNum, l, m, lChild(rt));
		else update(addPoint, addNum, m+1, r, rChild(rt));
		pushUp(rt);
	}

	int query(const int L, const int R, int l, int r, int rt)
	{
		if (L <= l && r <= R) return segTree[rt];

		int m = l + ((r-l)>>1);
		int res = 0;
		if (L <= m) res += query(L, R, l, m, lChild(rt));
		if (R > m) res += query(L, R, m+1, r, rChild(rt));
		return res;
	}
public:
	EnemyInfo()
	{
		int T, n, a, b;
		scanf("%d",&T);
		for (int t = 1 ; t <= T ; t ++)
		{
			printf("Case %d:\n",t);
			scanf("%d",&n);
			buildTree(1 , n , 1);
			char op[6];
			while (scanf("%s",op) && op[0] != 'E')
			{
				scanf("%d%d",&a,&b);
				if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
				else if (op[0] == 'S') update(a , -b , 1 , n , 1);
				else update(a , b , 1 , n , 1);
			}
		}
	}
};

【Hibernate步步为营】--复合主键映射详解

时间: 2024-12-26 08:44:56

【Hibernate步步为营】--复合主键映射详解的相关文章

【Hibernate步步为营】--多对多映射详解

上篇文章详细讨论了一对多映射,在一对多映射中单向的关联映射会有很多问题,所以不建议使用如果非要采用一对多的映射的话可以考虑使用双向关联来优化之间的关系,一对多的映射其实质上是在一的一端使用<many-to-one>标签来标明它们之间的关系,另外还需要在一的一端的对象中使用set标明集合映射. 一.单向多对多 仍然按照前几篇的文章格式来讨论,首先来看对象之间的关系,单向的多对多关系是两个对象之间发生的,比如在人和职位之间,一个人可以有多个职位,而且一个职位也可以由多人来负责,所以它们之间就形成了

【Hibernate步步为营】--复合主键映射具体解释

上篇文章讨论了继承映射,它是对象模型中最主要的特性,对于继承映射它的主要区分是字段类型的不同,所以在生成表结构时须要有新列来标识数据的类型,能够使用<subclass>标签并在标签中加入discriminator-value鉴别器.该篇文章来讨论复合主键映射,它是指主键是多列的组合,如今在设计数据库时非常少用到复合主键,由于考虑到数据库的优化,经常会把复合主键拆分到两个表中,并利用一个关系表来维护两个表的关系,关系表中不加入主键. 一.复合主键映射 复合主键映射须要在映射配置文件里使用<

hibernate 复合主键映射

第一次写博客,只想把工作中遇到的问题记下来. 最近做了一个二次开发的改造,改完之后被告知数据表主键根据需求需要用复合主键,因为本人菜鸟一枚,复合主键从未用过,只能靠度娘 网上给出的复合主键映射大致就两种 第一种:将复合主键对应的属性与实体其他普通属性放在一起 /*实体类.复合主键必须实现Serialzable接口*/ public class User implements Serialzable { private static final long serialVersionUID=1L;/

Hibernate复合主键映射

目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用 在日常开发中会遇到这样一种情况,数据库中的某张表需要多个字段列才能唯一确定一行记录,这时表需要使用复合主键.面对这样的情况Hibernate为我们提供了两种方式来解决复合主键问题. 方式一:将复合主键对应的属性与实体其他普通属性放在一起 例如实体类People中"id"和"name"属性对应复合主键: /*实体类,

(九)Hibernate 的复合主键

一.什么是复合主键? 一张表的主键是由多个字段组成,这个主键就被称为复合主键.  主键是唯一确定某条记录的字段,比如公民的身份证号就是一个主键,因为由身份证号这个主键就可以确定 某个公民.   有一种情况,比如学生成绩这张表中,一个学号无法唯一确定这个学生的成绩,因为这个学生有多科成绩,这时候"学号+学科"才是主键,两者结合才能唯一确定一条记录,也就是成绩. 二.hibernate生成含有复合主键表的映射bean 2.1 创建有复合主键的表   这张表有复合主键 2.2 生成映射文件

hibernate中基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同

基于主键映射1-1关联关系和基于外键映射1-1关联关系的不同,主要区别是在配置映射文件上会有区别 两个持久化类为Manager和Department 1:基于主键映射1-1关联关系 1)使用其他持久化类的主键生成主键的实体的映射文件 首先需要指定主键生成方式为foreigner 格式为: <id name="departmentId" type="java.lang.Integer"> <column name="department_i

Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)

Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessionFactory; static{ //获取配置信息 hibernate.cfg.xml Configuration configuration = new Configuration().configure(); //创建一个 ServiceRegistry的实例 //首先获得其标准建造器,此处用

hibernate 注解 联合主键映射

联合主键用Hibernate注解映射方式主要有三种: 第一.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,再将 该类注解为@Embeddable,最后在主类中(该类不包含联合主键类中的字段)保存该联合主键类的一个引用,并生成set和get方法,并将该引用注 解为@Id 第二.将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode,最后 在主类中(该

【Hibernate步步为营】--组合映射详解

上篇文章详细讨论了复合主键的映射原理,对于复合主键映射需要使用<composite-id>标签来标明映射的类属性,并在该标签中添加<key-property>子标签,并且主键列需要实现序列化接口,使用很简单只要学会如何进行映射就可以实现复合映射.接下来讨论组合对象映射,组合映射关系其实是把两个对象的公共部分抽象出来形成一个对象,两个子对象会包含另一个主对像,在配置映射文件时需要使用<component>标签来标明映射关系. 一.组合映射 组合是关联关系的一种特殊情况,是