2087714878

2012873676

23:21 2018-11-12
  • 导语:codeforces 第1055B号题解

题目内容:

Alice's hair is growing by leaps and bounds. Maybe the cause of it is the excess of vitamins, or maybe it is some black magic...

爱丽丝的头发突飞猛进。也许它的原因是多余的维生素,或者它可能是一些黑魔法......


To prevent this, Alice decided to go to the hairdresser. She wants for her hair length to be at most l centimeters after haircut, where l is her favorite number. Suppose, that the Alice's head is a straight line on which n hairlines grow. Let's number them from 1 to n. With one swing of the scissors the hairdresser can shorten all hairlines on any segment to the length l, given that all hairlines on that segment had length strictly greater than l. The hairdresser wants to complete his job as fast as possible, so he will make the least possible number of swings of scissors, since each swing of scissors takes one second.

为了防止这种情况,爱丽丝决定去找美发师。她希望自己的头发长度在理发后最多可达l厘米,其中l是她最喜欢的数字。假设,爱丽丝的头部是一条直线,n条细线在其上生长。我们将它们从1编号为n。随着剪刀的一次摆动,理发师可以将任何段上的所有细线缩短到长度l,因为该段上的所有细线都长度严格大于l。理发师希望尽快完成他的工作,因此他将尽可能少的剪刀摆动,因为每次剪刀摆动需要一秒钟。


Alice hasn't decided yet when she would go to the hairdresser, so she asked you to calculate how much time the haircut would take depending on the time she would go to the hairdresser. In particular, you need to process queries of two types:

爱丽丝还没有决定何时去理发店,所以她要求你计算理发需要多长时间,这取决于她去理发店的时间。特别是,您需要处理两种类型的查询:


0 — Alice asks how much time the haircut would take if she would go to the hairdresser now.

1 p d — p-th hairline grows by d centimeters.

Note, that in the request 0 Alice is interested in hypothetical scenario of taking a haircut now, so no hairlines change their length.

0 - 爱丽丝询问,如果她现在去理发店,理发会花多少时间。

1 p d - p发际线增长d厘米。

请注意,在请求中0爱丽丝对现在理发的假设场景感兴趣,因此没有任何细线改变它们的长度。

输入:

The first line contains three integers n, m and l (1≤n,m≤100000, 1≤l≤109) — the number of hairlines, the number of requests and the favorite number of Alice.

第一行包含三个整数n,m和l(1≤n,m≤100000,1≤l≤109) - hairline的数量,请求的数量和Alice的最爱数量。


The second line contains n integers ai (1≤ai≤109) — the initial lengths of all hairlines of Alice.

第二行包含n个整数ai(1≤ai≤109) - Alice的所有细线的初始长度。


Each of the following m lines contains a request in the format described in the statement.

以下m行中的每一行都包含声明中描述的格式的请求。


The request description starts with an integer ti. If ti=0, then you need to find the time the haircut would take. Otherwise, ti=1 and in this moment one hairline grows. The rest of the line than contains two more integers: pi and di (1≤pi≤n, 1≤di≤109) — the number of the hairline and the length it grows by.

请求描述以整数ti开头。 如果ti = 0,那么你需要找到理发所需的时间。 否则,ti = 1,此时一条发际线增长。 该行的其余部分包含两个以上的整数:pi和di(1≤pi≤n,1≤di≤109) - 发际线的数量及其生长的长度。

输出:

For each query of type 0 print the time the haircut would take.

对于类型0的每个查询,打印理发所需的时间。

测试点输入:

4 7 3

1 2 3 4

0

1 2 3

0

1 1 3

0

1 3 1

0

测试点输出:

1

2

2

1

解题思路:

应该在输入头发长度的时候,计算当前这一组数据需要的总时间。

请求为0的时候:输出总时间

请求为1的时候:增加或减少总时间,并改变头发长度

java实现:

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.PrintWriter;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(new BufferedInputStream(System.in));

PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

int n = in.nextInt();

int m = in.nextInt();

long i = in.nextLong();

long[] hair = new long[n+2];

int time =0;

for(int j=1;j<=n;j++){

hair[j]=in.nextLong();

if(hair[j]>i && hair[j-1]<=i){

time++;

}

}

for(int j=0;j<m;j++){

int op = in.nextInt();

if(op == 0){

out.println(time);

out.flush();

}

else {

int or = in.nextInt();

long len = in.nextLong();

if(hair[or]<=i && hair[or]+len>i){

if(hair[or-1]<=i && hair[or+1]<=i)

time++;

else if(hair[or-1]>i && hair[or+1]>i) {

time--;

}

}

hair[or] += len;

}

}

}

}


5.输入输出 -《java核心技术》解读

00:27 2018-11-12
  • 导语:解读第3章部分重点知识,输入输出

Tip:希望读者先认真读完书上第3章3.7的内容再来阅读此文章,效果更佳!

输入:

Scannerç±»

定义在java.util包中,使用方法如下

Scanner in = new Scanner(System.in)

具体的操作方法参见P57

输出:

System.out对象,常用方法如下

  1. print:输出,不换行
  2. pirntln:输出,换行
  3. printf:格式化输出(格式参考P58-59)

创建格式化字符串:

String.format方法,返回一个字符串,参数类似printf

文件输入:

Scanner in = new Scanner(Paths.get("xxx"),"UTF-8");  /注意:如果路径中有"\",那么应该写成“\\”,如果文件不存在,抛出异常

可以使用一个字符串作为参数,那么读取的内容就是这个字符串的内容

文件输出:

PrintWriter out = new PrintWriter("xxx","UTF-8");  /如果文件不存在,创建文件,如果文件不能创建,抛出异常


894A QAQ cf题解(java)

23:53 2018-11-11

题目内容:

"QAQ" is a word to denote an expression of crying. Imagine "Q" as eyes with tears and "A" as a mouth.

Now Diamond has given Bort a string consisting of only uppercase English letters of length n. There is a great number of "QAQ" in the string (Diamond is so cute!).

Bort wants to know how many subsequences "QAQ" are in the string Diamond has given. Note that the letters "QAQ" don't have to be consecutive, but the order of letters should be exact.


“QAQ”是一个表示哭泣的词。把“Q”想象成含着眼泪的眼睛,把“A”想象成嘴巴。

现在Diamond给了Bort一个字符串,这个字符串只有大写的英文字母,长度是n。字符串中有很多QAQ (Diamond好可爱!)

Bort想知道字符串有多少子序列“QAQ”。注意,字母“QAQ”不必是连续的,但是字母的顺序应该是准确的。

输入:

The only line contains a string of length n (1 ≤ n ≤ 100). It's guaranteed that the string only contains uppercase English letters.

唯一的行包含一个长度为n的字符串(1≤n≤100)。 保证字符串只包含大写英文字母。

输出:

Print a single integer — the number of subsequences "QAQ" in the string.

打印单个整数 - 字符串中子序列“QAQ”的数量。

测试点输入:

  1. QAQAQYSYIOIWIN
  2. QAQQQZZYNOIWIN

测试点输出:

  1. 4
  2. 3

解题思路:

使用嵌套循环,遍历字符串,蛮力解法

java实现:

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.PrintWriter;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(new BufferedInputStream(System.in));

PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

String str = in.next();

int n=0;

for(int i=0;i<str.length();i++){

if(str.charAt(i)=='Q'){

for(int j=i+1;j<str.length();j++){

if(str.charAt(j)=='A'){

for(int k=j+1;k<str.length();k++){

if(str.charAt(k)=='Q'){

n++;

}

}

}

}

}

}

out.print(n);

out.flush();

}

}


393A Nineteen cf题解(java)

23:15 2018-11-11

题目内容:

Alice likes word "nineteen" very much. She has a string s and wants the string to contain as many such words as possible. For that reason she can rearrange the letters of the string.

For example, if she has string "xiineteenppnnnewtnee", she can get string "xnineteenppnineteenw", containing (the occurrences marked) two such words. More formally, word "nineteen" occurs in the string the number of times you can read it starting from some letter of the string. Of course, you shouldn't skip letters.

Help her to find the maximum number of "nineteen"s that she can get in her string.


爱丽丝非常喜欢“nineteen”这个词。 她有一个字符串s,希望字符串包含尽可能多的单词。 因此,她可以重新排列字符串的字母。

例如,如果她有字符串“xiineteenppnnnewtnee”,她可以获得字符串“xnineteenppnineteenw”,其中包含(标记的事件)两个这样的单词。 更正式地,字符串中出现“nineteen”字样,从字符串的某个字母开始,您可以读取它的次数。 当然,你不应该跳过字母。

帮助她找到她可以在她的琴弦中获得的“nineteen”的最大数量


【注意:从下面的测试点看,可以让第二个“nineteen”开始的第一个字母'n'使用上一个单词的末尾'n'字母】

输入:

The first line contains a non-empty string s, consisting only of lowercase English letters. The length of string s doesn't exceed 100.

第一行包含非空字符串s,仅由小写英文字母组成。 字符串s的长度不超过100。

输出:

Print a single integer — the maximum number of "nineteen"s that she can get in her string.

打印一个整数 - 她可以在她的字符串中获得的“nineteen”的最大数量。

测试点输入:

  1. nniinneetteeeenn
  2. nneteenabcnneteenabcnneteenabcnneteenabcnneteenabcii
  3. nineteenineteen

测试点输出:

  1. 2
  2. 2
  3. 2

解题思路:

统计字符串中n、i、t、e字符出现的次数,各自除以在单词中的个数,他们的最小值为单词“nineteen”的最大数量。

因为第二个单词开始,n可以重复使用上一个单词的末尾n

所以n应该取(n-1)/2

java实现:

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.PrintWriter;

import java.util.Arrays;

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(new BufferedInputStream(System.in));

PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));

String str = in.next();

int n = 0;

int i = 0;

int e = 0;

int t = 0;

for(int j=0;j<str.length();j++){

char c = str.charAt(j);

switch (c) {

case 'n':

n++;

break;

case 'i':

i++;

break;

case 'e':

e++;

break;

case 't':

t++;

break;

default:

break;

}

}

int[] arr = new int[4];

arr[0] = (n-1)/2;

arr[1] = i;

arr[2] = t;

arr[3] = e/3;

Arrays.sort(arr);

out.print(arr[0]);

out.flush();

}

}


15.Mybatis介绍与核心对象 SSM框架基础 笔记

11:26 2018-10-31
  • 导语:SSM框架基础 学习笔记 之 Mybatis介绍与核心对象

Mybatis介绍:

MyBatis框架(前身是iBatis)是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。

它消除了JDBC的代码和参数的手动编写,以及对结果的检索,用XML或注解来配置,让代码的编写偏向于实际目的,不用编写一些无意义代码。

它也被称之为ORM(Object/Relation Mapping,即对象关系映射)框架。

ORM是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中

需要导入的包:

mybatis-x.x.x.jar  å’Œ  lib目录下的所有依赖包

数据库对应的驱动包

Mybatis核心对象:

在使用Mybatis框架的时候,主要用到两个核心对象:SqlSessionFactory和SqlSession

SqlSessionFactory:

它是单个数据库映射关系经过编译后的内存镜像,其主要作用是创建SqlSession

SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象的build方法从一个输入流中读取XML配置文件或一个预先定义好的Configuration实例来创建,并且是线程安全的,所以可以使用单例模式来创建SqlSessionFactory对象

SqlSession:

它是应用程序与持久层之间执行交互操作的一个单线程对象,其主要作用是执行持久化操作

是线程不安全的,应该作为一次事务中使用,并且要及时关闭它

SqlSession对象中的常用方法:

查询方法:

  1. <T> T selectOne(String statement); 
  2. <T> T selectOne(String statement, Object parameter); 
  3. <E> List<E> selectList(String statement); 
  4. <E> List<E> selectList(String statement, Object parameter); 
  5. <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds); 
  6. void select(String statement, Object parameter, ResultHandler handler); 

插入、更新和删除方法:

  1. int insert(String statement); 
  2. int insert(String statement, Object parameter); 
  3. int update(String statement); 
  4. int update(String statement, Object parameter); 
  5. int delete(String statement); 
  6. int delete(String statement, Object parameter); 

其他方法:

  1. void commit(); 提交事务的方法。 
  2. void rollback(); 回滚事务的方法。 
  3. void close(); 关闭SqlSession对象。 
  4. <T> T getMapper(Class<T> type); 返回Mapper接口的代理对象。 
  5. Connection getConnection(); 获取JDBC数据库连接对象的方法。 


(615) 718-2321

14.事务管理方式 SSM框架基础 笔记

23:08 2018-10-28
  • 导语:SSM框架基础 学习笔记 之 事务管理方式

Spring事务管理分两种方式 :

编程式事务管理 :通过编写代码实现的事务管理,包括定义事务的开始、正常执行后的事务提交和异常时的事务回滚

声明式事务管理 :通过AOP技术实现的事务管理,主要思想是将事务作为一个“切面”代码单独编写,然后通过AOP技术将事务管理的“切面”植入到业务目标类中

声明式事务管理最大的优点在于开发者无需通过编程的方式来管理事务,只需在配置文件中进行相关的事务规则声明

声明式事务管理 :

  • 基于XML的方式
  • 基于注解的方式

基于XML的方式:

基于XML方式的声明式事务是在配置文件中通过<tx:advice>元素配置事务规则来实现的。当配置了事务的增强处理后,就可以通过编写的AOP配置,让Spring自动对目标生成代理

  1. 先配置事务管理器的bean,jdbc用到DataSourceTransactionManager类,属性需要一个数据源的bean
  2. 使用AspectJ的<aop:pointcut>和<aop:advisor>来配置切面

主要配置<tx:method>元素中的常用属性:

基于注解的方式:

在spring配置文件中配置:

<tx:annotation-driven transaction-manager="transactionManager"/>

注:其中transactionManager为事务管理器bean的名称

使用@Transactional注解时:

如果将注解添加在Bean类上,则表示事务的设置对整个Bean类的所有方法都起作用;

如果将注解添加在Bean类中的某个方法上,则表示事务的设置只对该方法有效

注解的属性:


disfeature

13.Spring事务管理 SSM框架基础 笔记

22:25 2018-10-28
  • 导语:SSM框架基础 学习笔记 之 Spring事务管理

Spring的事务管理简化了传统的事务管理流程,并且在一定程度上减少了开发者的工作量

注意:导入 spring-tx-x.x.x.RELEASE.jar 包

Spring事务管理的核心接口:

  • PlatformTransactionManager接口
  • TransactionDefinition接口
  • TransactionStatus接口

PlatformTransactionManager接口:

PlatformTransactionManager接口是Spring提供的平台事务管理器,主要用于管理事务。该接口中提供了三个事务操作的方法,具体如下:

  1. TransactionStatus getTransaction(TransactionDefinition definition);      ç”¨äºŽèŽ·å–事务状态信息
  2. void commit(TransactionStatus status);      ç”¨äºŽæäº¤äº‹åŠ¡
  3. void rollback(TransactionStatus status);      ç”¨äºŽå›žæ»šäº‹åŠ¡

3个常见的实现类:

  • org.springframework.jdbc.datasource.DataSourceTransactionManager :用于配置JDBC数据源的事务管理器 
  • org.springframework.orm.hibernate4.HibernateTransactionManager :用于配置Hibernate的事务管理器 
  • org.springframework.transaction.jta.JtaTransactionManager :用于配置全局事务管理器 

注:一般使用第一个实现类DataSourceTransactionManager 

TransactionDefinition接口:

TransactionDefinition接口是事务定义(描述)的对象,该对象中定义了事务规则,并提供了获取事务相关信息的方法

  1. String getName( );      获取事务对象名称
  2. int getIsolationLevel( );       èŽ·å–事务的隔离级别
  3. int getPropagationBehavior( );     èŽ·å–事务的传播行为
  4. int getTimeout( );          èŽ·å–事务的超时时间
  5. boolean isReadOnly( );      获取事务是否只读

关于传播行为的解释:

在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务,通常情况下,数据的查询不会影响原数据的改变,所以不需要进行事务管理,而对于数据的插入、更新和删除操作,必须进行事务管理。如果没有指定事务的传播行为,Spring默认传播行为是REQUIRED

传播行为的值:

TransactionStatus接口:

TransactionStatus接口是事务的状态,它描述了某一时间点上事务的状态信息,包含6个方法

  1. void flush();    åˆ·æ–°äº‹åŠ¡
  2. boolean hasSavepoint();     èŽ·å–是否存在保存点
  3. boolean isCompleted();        获取事务是否完成
  4. boolean isNewTransaction();     èŽ·å–是否为新事务
  5. boolean isRollbackOnly();        获取事务是否回滚
  6. void setRollbackOnly();        设置事务回滚


985-594-1110

2018038521

21:57 2018-10-28
  • 导语:SSM框架基础 学习笔记 之 JdbcTemplate常用方法

JdbcTemplate类实现了JdbcOperations接口,实现了操作数据库的一些方法

需要导入的包:

  1. 数据库驱动包
  2. spring-jdbc-x.x.x.RELEASE.jar
  3. spring-tx-x.x.x.RELEASE.jar

execute方法:

execute(String sql) 用于执行SQL语句

update方法:

update()方法可以完成插入、更新和删除数据的操作。在JdbcTemplate类中,提供了一系列的update()方法

注:通常使用最后一种,sql字符串中用?来代替需要传入的参数。

query方法:

query()方法来处理各种对数据库表的查询操作

注:常用第3和第4种方法。

关于RowMapper说明:

RowMapper是一个泛型接口,BeanPropertyRowMapper是它的实现类,可以自动的把数据表的数据映射到对象中(需要对象属性名与数据库的字段名相同)

BeanPropertyRowMapper接受一个目标泛型的Class作为构造器参数


centaury

11.Spring JDBC SSM框架基础 笔记

12:03 2018-10-28
  • 导语:SSM框架基础 学习笔记 之 Spring JDBC

Spring的JDBC模块负责数据库资源管理和错误处理

相对于传统的JDBC:大大简化了开发人员对数据库的操作,从而将更多的精力投入到编写业务逻辑当中


Spring JdbcTemplate:

JdbcTemplate类是Spring JDBC的核心类

JdbcTemplate类的直接父类是JdbcAccessor,该类为子类提供了一些访问数据库时使用的公共属性,同时实现了JdbcOperations接口。

JdbcAccessor中的公共属性:

  1. DataSource: 其主要功能是获取数据库连接,还可以引入对数据库连接的缓冲池和分布式事务的支持,它可以作为访问数据库资源的标准接口 
  2. SQLExceptionTranslator:该接口负责对SQLException进行转译工作。通过必要的设置获取SQLExceptionTranslator中的方法,可以使JdbcTemplate在需要处理SQLException时,委托SQLExceptionTranslator的实现类来完成相关的转译工作

JdbcOperations接口:

定义了在JdbcTemplate类中可以使用的操作集合,包括添加、修改、查询和删除等操作

Spring JDBC的配置:

Spring JDBC模块主要由4个包组成,分别是core(核心包)、dataSource(数据源包)、object(对象包)和support(支持包)

  • core:即核心包,它包含了JDBC的核心功能。此包内有很多重要的类,包括:JdbcTemplate类、SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedParameterJdbcTemplate类。
  • datasource:即数据源包,访问数据源的实用工具类。它有多种数据源的实现,可以在JavaEE容器外部测试JDBC代码。
  • object:即对象包,以面向对象的方式访问数据库。它允许执行查询并返回结果作为业务对象。它可以在数据表的列和业务对象的属性之间映射查询结果。
  • support:即支持包,是core包和object包的支持类。例如提供了异常转换功能的SQLException类。

在编程中,我们主要用到core(核心包)和dataSource(数据源包)

通过spring bean来配置JdbcTemplate:

实现org.springframework.jdbc.core.JdbcTemplate类,并注入属性:dataSource

dataSource实现org.springframework.jdbc.datasource.DriverManagerDataSource,并注入属性:driverClassName、url、username、password

之后便可以在其他bean中注入JdbcTemplate或在代码中使用JdbcTemplate。


(936) 223-1608

3236165358

20:38 2018-10-24
  • 导语:SSM框架基础 学习笔记 之 AspectJ框架AOP开发

AspectJ是一个基于Java语言的AOP框架,它提供了强大的AOP功能,新版本的Spring框架,也建议使用AspectJ来开发AOP。

使用AspectJ实现AOP有两种方式:

  1. 基于XML的声明式
  2. 基于注解的声明式

注意:需要导入spring-aspects-x.x.x.RELEASE.jar 和 aspectjweaver-x.x.x.jar


基于XML的声明式:

<beans>标签下可以定义多个<aop:config>来声明AOP

注意:子元素需要按上图顺序来定义,灰色部分标注的元素即为常用的配置元素

使用方法:

  1. 切面类(Aspect),一个切面类可以包含多个增强方法(Advice)
  2. 目标对象(Target Object)
  3. 配置<aop:config>

配置<aop:config>:

  1. 配置切面:在Spring的配置文件中,配置切面使用的是<aop:aspect>元素,该元素会将一个已定义好的Spring Bean转换成切面Bean,所以要在配置文件中先定义一个普通的Spring Bean
  2. 配置切入点 :当<aop:pointcut>元素作为<aop:config>元素的子元素定义时,表示该切入点是全局切入点,它可被多个切面所共享;当<aop:pointcut>元素作为<aop:aspect>元素的子元素时,表示该切入点只对当前切面有效
  3. 配置通知 : 使用<aop:aspect>的子元素可以配置5种常用通知,这5个子元素不支持使用子元素,但在使用时可以指定一些属性,属性如下图:

配置<aop:aspect>元素时,通常会指定id和ref两个属性:

注意:<aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。两者是一样的

id:用户定义该切面的唯一标识名称

ref:用于引用普通的Bean

定义<aop:pointcut>元素时,通常会指定id和expression两个属性:

id:用于指定切入点的唯一标识名称

expression:用于指定切入点关联的切入点表达式

切入点表达式格式:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

modifiers-pattern:定义的目标方法的访问修饰符,如public、private等

ret-type-pattern:定义的目标方法的返回值类型,如void、String等

declaring-type-pattern:定义的目标方法的类路径, 如com.ruixiaozi.jdk.UserDaoImpl

name-pattern:具体需要被代理的目标方法,如add()方法

param-pattern:需要被代理的目标方法包含的参数

throws-pattern:需要被代理的目标方法抛出的异常类型

注意:带有问号(?)的部分表示可配置项,而其他部分属于必须配置项。


基于注解的声明式:

@Aspect 定义类为切入类

@Pointcut 声明一个切入策略供 @Before @After @ 选择

@Before 被切入方法执行前执行

@After 被切入方法执行后执行

@Around 被切入方法前后都可以加入一些逻辑

@AfterReturning 被切入方法返回时执行

在配置文件中添加注解的声明式AspectJ支持:

<aop:aspectj-autoproxy />