HDOJ 3487 Play with Chain

前言

在编程过程中总结归纳出来的一种编程经验,从而形成的设计思想称为设计模式。

设计模式有23种。它适用于所有的编程语言。

常用的有创新型的设计模式:简单工厂、抽象工厂和单例模式;行为型的设计模式:模板设计模式、观察者模式和命令模式;结构性的设计模式:适配器设计模式、代理模式(静态和动态两种,典型的有在spring的AOP编程中使用)和装饰器设计模式。

正文

单例模式(singleton)

保证一个类在内存中只能创建一个实例。

1.实现步骤:

1)将构造器私有化,即使用private修饰构造器

2)提供静态私有的属性,类型为要创建的对象类型。

3)提供一个返回在类内部创建的对象的静态方法。

注:

1.饱汉式的单例模式是等到外界第一次请求对象时才创建对象。

应用场景:对象比较小,创建过程消耗的时间少。

饱汉式是典型的时间换取空间。

饱汉式代码示例:

2.饿汉式是当程序一启动就立即产生对象加载到内存中。

应用场景:对象比较大,创建过程消耗的时间多。

饱汉式是典型的空间换取时间。

饿汉式代码示例:

简单工厂

对调用者封装对象的创建过程,提供产品。

使用工厂封装对象的创建过程。

1.实现步骤:

1)定义接口规范。

该接口是工厂中创建的对象必须实现的接口。

定义接口的方法时,避免体系技术的特点;比如:对于数据库的操作,避免在接口中适应SQLException.

2)定义实现类

该类是工厂需要创建的对象的模板,实现定义的接口。

3)构建工厂:采用抽象类

在工厂类中提供一个静态方法,方法的返回值类型为接口类型,用于动态绑定工厂中生产出得各种对象。

2.应用场景:

根据用户的不同需要产生不同的对象,这些对象都是同一类型的,且具有相同的行为

3.作用

能适应不同的用户的不同需求,根据不同的需求产生对应的对象,达到屏蔽对象的创建过程的目的。

4.简单工厂与放射结合使用的实现步骤

1)定义接口

2)提供具体的实现类

3)提供配置文件

配置类的基本信息:key="类的全限定名"

4)提供工厂类的实现

根据配置文件信息,通过外界传来的key,获取对应的全限定名。

代码示例:

抽象工厂

抽象工厂用于不同产品的实现;比如一些易于交换产品系列,它们只需改变具体工厂即可。

例如:一个开发中可能有mySql的数据库和oracle的数据库。

1.具体示例步骤:

1)定义接口

定义访问数据库的方法

IOrderDao-->addOrder方法//用户访问方式

IUserDao-->addUser方法////订单的访问方式

注:

访问数据库的方式与数据库产品无关,只和业务有关。

2)提供接口的实现:抽象产品的具体分类实现

不同的数据库产品他的操作方式不同

1))针对oracle的实现

OracleUserDaoImpl implements IUserDao

OracleOrderDaoImpl implements IOrderDao

2))针对mySql的实现MySqlUserDaoImpl implements IUserDao

MySqlOrderDaoImpl implements IOrderDa

3)提供抽象工厂类

该类应该包含所有的创建数据库产品的工厂的抽象方法

4)针对不同的数据库产品提供数据库的工厂

5)测试:通常在运行时刻创建一个ConcreteFactory类的实例

DaoFactory daoFacotry=DaoFactory.getInstance("mysql");

UserDao userDao=daoFactory.getUserDao();

注:

创建具体的工厂,再创建具有特定实现的产品对象。也就是说,为了创建不同的产品对象,客户端应使用不同的具体工厂。

模板设计模式(Template)

在一个类中定义操作的骨架,细节交给子类完成

 开发步骤:

1.定义一个抽象类

|-定义算法的骨架(方法实现的半成品)

|-定义一个抽象方法由抽象类当中的实例方法调用同时交给子类来实现。

应用场景:

jdbc操作数据库的更新与删除

原理:

子类重写父类的方法

定义算法框架在一个方法里,某些步骤推迟到子类。模板方法设计模式让子类定义算法的某些步骤,而不需要改变算法的结构。

代码示例:

2)抽象类的骨架

1)子类实现骨架的某些步骤

装饰器设计模式(decorator)

1.意图在运行时通过组合操作产生新的变化。IO流中的输入输出就是一个典型案例

装饰器动态的给对象增加职责。装饰器提供了一个比继承更好地弹性的方案。

代码示例:

2.装饰者可以在被委托的对象之前或之后,把它的行为加上,以便完成剩下的任务。

当然,它的缺点是造成大量的小类

3.原理:装饰器为被装饰器提供装饰的原料。

举例:节点文件流是装饰器,文件流获取的数据来填充缓冲流中的缓冲池,文件中的数据来修饰缓冲池。

代码示例:

1)类结构

2)Person接口

3)Man实现了

4)Decorator适配器类

5)适配器的子类DecA

6)适配器的子类DecB

7)测试类

适配器设计模式(adapter)

经常使用一些support或adapter的单词来表示适配器的类。

在jdk的swing中的事件监听器应用了该设计模式。

1.使原来由于接口不兼容的类在一起协同工作

代码示例:a类和b类的接口不兼容,一起协同工作的实例

1)A类的接口

2)A类的代码

3)B类的代码

4)测试类

2.适配器的类

*    |-初始化一些资源,直接提供给子类使用

*    |-子类可以只关心功能,需要实现什么功能重写什么方法

代码示例:

1)接口包含了很多的方法

2)通过继承实现了接口的类,来解决必须重写所有的接口方法的问题

3)子类可以只关心功能,需要实现什么功能重写什么方法

总结

1.简单描述一下其他的设计模式:

1)状态设计模式:允许对象在内部的状态改变时,改变它的行为。达到对象看起来就像修改了它的类的效果。

2)策略模式:定义一组算法家族,封装每个算法并使之可互换。策略模式让客户可以独立地应对算法的变化。

3)观察者模式:定义一对多的关系,当一个对象改变时,所有的依赖者都会自动得到通知和更新。它在jdk中的应用有javaBean和swing。

HDOJ 3487 Play with Chain

时间: 2024-10-13 21:07:59

HDOJ 3487 Play with Chain的相关文章

hdu 3487 Play with Chain(splay区间剪切,翻转)

题目链接:hdu 3487 Play with Chain 题意: cut a b c: 将a到b区间剪切下来,放在第c位置的后面. flip a b: 翻转a到b区间 题解: 第一个操作,选通过旋转,然后使a到b区间变成根的右儿子的左儿子,然后剪掉. 再找到c+1的位置,接上. 第二个操作,区间标记就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4

【HDOJ】3487 Play with Chain

Splay入门题目,区间翻转,区间分割. 1 /* */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm

hdu 3487 Play with Chain

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3487 YaoYao is fond of playing his chains. He has a chain containing n diamonds on it. Diamonds are numbered from 1 to n.At first, the diamonds on the chain is a sequence: 1, 2, 3, …, n.He will perform t

hdu 3487 Play with Chain (Splay)

hdu 3487 Splay树模板题 题意: 一开始给出1 2 3 4 ... n 这样一个序列,对这个序列进行以下两种操作: (1)CUT a b c: 将子串[a,b]切下来,放到剩余串的第c个数之后 . (2) FLIP a b : 将子串[a,b]翻转,如 1 2 3 4 就变成 4 3 2 1 . 总之就是一道Splay树的模板题 ... 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm&

Splay树——HDU 3487 Play with Chain

对应HDU题目:点击打开链接 Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4571    Accepted Submission(s): 1859 Problem Description YaoYao is fond of playing his chains. He has a chain cont

HDU 3487 Play with Chain 【Splay】

1-n的序列,有两种操作: 1,将一段区间翻转 2,将一段区间切下来放到剩余序列的第C个数后 采用延迟更新的方法维护区间的翻转,并维护一个size域. 添加一个最大点和一个最小点,防止出界 翻转时,将第L-1个点伸展到跟,再将第R+1个点伸展到L-1的右子树,这时R+1的左子树就是要翻转的区间,加上一个标记. 切区间时,跟翻转操作差不多,只是不加标记.然后找到C+1和C,将C伸展到根,C+1伸展到C的右子树,此时C+1的左子树就是要插入的位置. 其实我说了这么多并没有什么卵用....最后还是得自

HDU 3487:Play with Chain(Splay)

http://acm.hdu.edu.cn/showproblem.php?pid=3487 题意:有两种操作:1.Flip l r ,把 l 到 r 这段区间 reverse.2.Cut a b c ,把 a 到 b 这段区间切掉,再把这段区间接到切掉后的第 c 个数的后面. 思路:做完了上一道变态题目,做这道题目如鱼得水.Cut的时候就是把a 到 b 放到keytree的位置,记录一下当前keytree的值,然后切掉,再把切掉后的第 c 个数转到 root 的位置,再把这个记录的值重新连接回

HDOJ 5293 Tree chain problem LCA+树链剖分+树形DP

[题意] 给定一颗树上的几条链和每条链的权值,求能取出的不含有公共节点的链的最大权值.... [解] 预处理每条链的lca 树形DP, d[i]表示取到这个节点时可以得到的最大值 , sum[i]=sigma( d[k] | k 是i的子节点) 如果不取i  d[i]=sum[i] 如果取i , e是lca为i的链则 d[i]=max(d[i],e的权值+sigma(sum[k])-sigma(d[k]))  k为树链上的点 可以用树链剖分+树装数组在nlogn的时间复杂度内求链上的值 Tree

【HDU 3487】Play with Chain Splay

题意 给定$n$个数序列,每次两个操作,将区间$[L,R]$拼接到去掉区间后的第$c$个数后,或者翻转$[L,R]$ Splay区间操作模板,对于区间提取操作,将$L-1$ Splay到根,再将$R+1$ Splay到根节点的右儿子,那么根节点右儿子的左儿子就对应区间$[L,R]$,对于反转操作,通过懒操作下放 代码 #include <bits/stdc++.h> #define inf 0x7f7f7f7f using namespace std; const int N = 500005