#10119. 「一本通 4.2 例 1」数列区间最大值(ST算法求解静态的RQM问题)

本文介绍使用ST算法高效解决区间最大值查询问题,通过预处理建立dp数组,实现O(n*logn)的时间复杂度构建,及O(1)的查询效率。适用于没有修改操作、查询次数多的场景。

题目描述

输入一串数字,给你 M个询问,每次询问就给你两个数字X,Y ,要求你说出 X 到 Y 这段区间内的最大数。

输入格式

第一行两个整数n,m 表示数字的个数和要询问的次数;
接下来一行为 n 个数;
接下来 m行,每行都有两个整数 x,y。

输出格式

输出共M行,每行输出一个数。

样例

样例输入

10 2
3 2 4 5 6 8 1 2 9 7
1 4
3 8

样例输出

5
8

数据范围与提示

对于全部数据1<=n<=1e5,1<=m<=le6, 1<=x<=y<=n。数字不超过 C/C++ 的 int 范围。

思路:可用线段树写 nlogn + mlogn,这里可用ST算法求解,复杂度 O(n*logn),询问时O(1),ST算法适用于没有修改的操作且询问次数较多的的情况。

ST算法,其实就是动态规划,dp[i][j] 表示起始位为i,后2^j位的最大值,递推方程式dp[i][j] = Max(dp[i][j-1],dp[i+2^(j-1)][j-1]),区间长度2^j,分成两个2^(j-1),意思是要求一个数的后2^j位的最大值,需要先求出一个数后2^(j-1)位的最大值 (在这个数+2^(j-1)次方后) ,询问求最终结果时,// 要求最大的x满足 2^x<=r-l+1,x = log2(r-l+1),[i,j]的最大值 = max(dp[l][x],dp[r-2^x+1][x]);就算有dp[i][x] 和 dp[r-2^x+1][x] 有交集,也不影响 [l,r]中的最大值。

下面在递推时,还得要注意当 i+2^j-1 超过 n了,就不用求了,代码中有解释

代码:

//静态的RQM问题,可用ST算法,求解,时间复杂度N*logN,每次询问 O(1),空间复杂度N*logN 
#include<bits/stdc++.h>
using namespace std;
const int  Max = 1e5+10,LogN = 19;

int a[Max],n,k;
int Log[Max];
int dp[Max][LogN+5],c[LogN+5];

// 2^(j-1) = 1<<j; 若运算少的话,可以用左移运算符代替2的次方,运算多的话,就算了,怕卡时长。 
//dp[i][j] 表示起始位为i,后2^j位的最大值,递推方程式dp[i][j] = Max(dp[i][j-1],dp[i+2^(j-1)][j-1])
//区间长度2^j,分成两个2^(j-1),意思是要求一个数的后2^j位的最大值,需要求出一个数后2^(j-1)位的最大值 
//(在这个数+2^(j-1)次方后) 
int main()
{
	scanf("%d%d",&n,&k);
	for(int i = 1;i<=n;i++)
		scanf("%d",&a[i]);
	Log[0] = -1;   // log N 向下取整的递推方式;// 如向上取整 Log[0] = 0; 
	for(int i = 1;i<=n;i++)
		dp[i][0] = a[i],Log[i] = Log[i>>1] + 1;
	c[0] = 1;
	for(int i = 1;i<=LogN;i++)
		c[i] = c[i-1] * 2;
	for(int j = 1;j<=LogN;j++){
	//求 i后面2^j位的最大值,首先要保证i+2^j不超多n,超过就没有意义了,不一定要把每一个dp[i][j]都求不来,
	//i+2^j超过n的,就算求了在询问时,也用不上。 
		for(int i = 1;i+c[j]-1<=n;i++)  // 这里一定要注意减一,dp[i][j] 表示的是算上i后面的2^j位的最大值。 
			dp[i][j] = max(dp[i][j-1],dp[i+c[j-1]][j-1]);  
	}
	int x,y;
	while(k--)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int tt = Log[y-x+1]; // 要求最大的x满足 2^x<=r-l+1,所以log[y-x-1]求得log2(y-x-1)向下取整。
		printf("%d\n",max(dp[x][tt],dp[y-c[tt]+1][tt])); // 就算有重叠的部分也不影响最大值的 
	} 	 
	return 0; 
} 

 

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.quevo.fp</groupId> <artifactId>fp</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>web-controller</module> <module>web-run</module> <module>web-provide</module> </modules> <packaging>pom</packaging> <parent> <groupId>cn.quevo.core</groupId> <artifactId>quevo-core-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>cn.quevo.fp</groupId> <artifactId>web-provide</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>cn.quevo.fp</groupId> <artifactId>web-controller</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.13</version> </dependency> <dependency> <groupId>cn.quevo.core</groupId> <artifactId>quevo-core-ibeetl</artifactId> </dependency> <dependency> <groupId>cn.quevo.core</groupId> <artifactId>quevo-core-beetlsql</artifactId> </dependency> <dependency> <groupId>cn.quevo.core</groupId> <artifactId>quevo-core-spring-starter</artifactId> </dependency> <dependency> <groupId>cn.quevo.core</groupId> <artifactId>quevo-core-druid</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!--<scope>test</scope>--> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.10</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> <version>1.6.2</version> </dependency> <dependency> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId> <version>1.6.2</version> </dependency> </dependencies> </project> debug=true spring.application.name= spring.mvc.favicon.enabled=true #spring.profiles.active=prod server.port=8080 #server.session.timeout=1800 server.servlet.session.timeout=1H server.servlet.context-path=/fpweb server.max-http-header-size=3145728 server.tomcat.protocol-header=org.apache.coyote.http11.Http11NioProtocol #Session #spring.session.store-type=jdbc #spring.devtools.restart.exclude=/**,templates/**,view/**,sql/**,static/** spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=20MB #spring.mvc.view.prefix="" #spring.mvc.view.suffix=".html" #spring.beetl.cache=false spring.beetl.prefix=/templates/beetl/ spring.beetl.suffix=.html spring.beetl.config-file-resource=classpath:conf/beetl.properties #spring.beetl.resource-loader. #beetlsql.basePackage=cn.quevo #beetlsql.daoSuffix=Batis #beetlsql.dbStyle=org.beetl.sql.core.db.PostgresStyle spring.datasource.type= com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.name=test spring.datasource.druid.web-stat-filter.enabled=false spring.datasource.druid.stat-view-servlet.enabled=false #spring.datasource.druid.url=jdbc:mysql://17.168.0.10:3306/BUS_XFFPXX?characterEncoding=utf8 #spring.datasource.druid.username=BUS_XFFPXX_USER ## \u6570\u636E\u5E93\u5BC6\u7801 #spring.datasource.druid.password=1fOiOSX3y#ZD # \u6570\u636E\u5E93\u8FDE\u63A5URL spring.datasource.druid.url=jdbc:mysql://localhost:3309/BUS_XFFPXX?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true # \u6570\u636E\u5E93\u7528\u6237\u540D spring.datasource.druid.username=root # \u6570\u636E\u5E93\u5BC6\u7801 spring.datasource.druid.password=root # \u6570\u636E\u5E93\u9A71\u52A8 spring.datasource.driver-class-name=com.mysql.jdbc.Driver ##/index.html=classpath:/view/index.html, spring.mvc.statics=/view/**=classpath:/view/,/statics/**=classpath:/statics/,/plugins/**=classpath:/templates/plugins/,/bootstrap/**=classpath:/templates/bootstrap/,/css/**=classpath:/templates/beetl/css/,/uploads/**=http://17.168.0.36:8088/uploads/,/upload/**=http://17.168.0.36:8088/uploads/ sso.key.url=http://17.168.0.32:8080/sharedata/system/appinterface/getKey sso.time.url=http://17.168.0.32:8080/sharedata/system/appinterface/getTime sso.allUser.url=http://17.168.0.32:8080/sharedata/system/syncinterface/syncAllUser sso.allOrg.url=http://17.168.0.32:8080/sharedata/system/syncinterface/syncAllOrg sso.allRole.url=http://17.168.0.32:8080/sharedata/system/syncinterface/syncAllOrg cms.siteId=15 #cms.appId=de9d3dd500b341e586677b67cef30887 cms.appId=SYS_POVERTY cus.verifyId=cms_width_web cus.aesId=RQM5IwNQ6jmpSkyr cus.aesKey=YMiALR41J8dgp4kU cus.aesnKey=6p3eijOENnob38BC #\u8FC7\u671F\u65F6\u95F4 \u5206\u949F cus.eMinutesTime=30 # 彻底关闭Swagger(包括v2/api-docs接口和Swagger UI) springfox.documentation.enabled=false # 兼容旧版Springfox(2.x)的兜底配置(可选) springfox.documentation.swagger-ui.enabled=false springfox.documentation.swagger2.enabled=false springfox.documentation.v2.api-docs=false 为啥v2/api-docs还能访问
最新发布
11-29
你提出的问题是:**为什么在配置了 `springfox.documentation.enabled=false` 等多个关闭 Swagger 的配置后,`/v2/api-docs` 接口仍然可以访问?** --- ### ✅ 回答问题 尽管你在 `application.properties` 中添加了如下配置来禁用 Swagger: ```properties springfox.documentation.enabled=false springfox.documentation.swagger-ui.enabled=false springfox.documentation.swagger2.enabled=false springfox.documentation.v2.api-docs=false ``` 但 `/v2/api-docs` 依然可访问,说明 **Springfox 的核心组件(如 `DocumentationPluginsBootstrapper` 和 `Swagger2Controller`)仍被加载并注册到了 Spring 容器中**。 这常是因为: > ❌ **仅靠属性配置无法彻底阻止 Springfox 自动装配的初始化过程**,尤其是在某些版本中(如 Springfox 2.x),这些配置项并未被完全遵守或存在初始化顺序问题。 --- ### 🔍 原因分析 1. **`springfox.documentation.enabled = false` 不一定生效** - 在 Springfox 2.x 版本中,该属性主要用于控制是否启用 UI 或文档生成逻辑,但底层的 `@EnableSwagger2` 注解已经触发了大量 Bean 的注册。 - 即使设置为 `false`,`/v2/api-docs` 这个端点可能已经被注册进 MVC 路由系统。 2. **项目中显式使用了 `@EnableSwagger2` 或类似注解** - 检查你的启动类或配置类是否有: ```java @EnableSwagger2 ``` 或者导入了包含它的配置类。只要这个注解存在,Springfox 就会尝试初始化。 3. **依赖仍在 classpath 上** - 如果你引入了 `springfox-swagger2` 依赖,即使没有启用,其控制器(如 `Swagger2Controller`)仍可能被扫描到并注册成一个 REST Endpoint。 4. **Spring Boot 自动配置未完全排除** - Springfox 提供了自己的自动配置类(如 `org.springframework.boot.autoconfigure.EnableAutoConfiguration=...Swagger2DocumentationConfiguration`),如果没被排除,就会加载。 --- ### ✅ 解决方案:彻底禁用 /v2/api-docs #### ✅ 方法一:【推荐】排除 Springfox 自动配置类 在主应用类上使用 `@SpringBootApplication` 的 `exclude` 属性排除 Swagger 相关自动配置: ```java @SpringBootApplication(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, springfox.documentation.spring.web.plugins.Docket.class, // 防止 Docket 初始化 springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration.class }) public class FpApplication { public static void main(String[] args) { SpringApplication.run(FpApplication.class, args); } } ``` 但这还不够,还需要更彻底地排除自动配置。 #### ✅ 方法二:【最有效】过 `spring.factories` 排除自动配置 创建文件:`src/main/resources/META-INF/spring.factories`(如果是老版本 Spring Boot)或者 `src/main/resources/application.properties` 中添加: ```properties # 彻底禁用 Springfox 的自动配置 spring.autoconfigure.exclude=\ org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper,\ springfox.documentation.spring.web.scanners.ApiListingScanner,\ springfox.documentation.swagger2.configuration.Swagger2DocumentationConfiguration,\ springfox.documentation.swagger.web.SwaggerWebMvcConfiguration ``` > ⚠️ 注意:不同版本的 Springfox 包名略有差异,请根据实际使用的 JAR 查看。 #### ✅ 方法三:移除或排除 Maven 依赖(终极方案) 如果你**完全不需要 Swagger 功能**,最干净的方式是从依赖中直接排除: ```xml <!-- 检查你的模块是否间接引入了 springfox --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <scope>provided</scope> <!-- 或注释掉这一行 --> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <scope>provided</scope> </dependency> ``` 或者使用 `<exclusion>` 排除传递依赖: ```xml <dependency> <groupId>some.other.library</groupId> <artifactId>that-uses-springfox</artifactId> <version>x.y.z</version> <exclusions> <exclusion> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </exclusion> <exclusion> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </exclusion> </exclusions> </dependency> ``` #### ✅ 方法四:拦截 `/v2/api-docs` 请求(兜底) 如果以上都无效,可以过自定义 `HandlerInterceptor` 或 `Filter` 来屏蔽请求: ```java @Component public class BlockSwaggerFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; if (req.getRequestURI().equals("/v2/api-docs")) { HttpServletResponse resp = (HttpServletResponse) response; resp.setStatus(HttpStatus.NOT_FOUND.value()); return; } chain.doFilter(request, response); } } ``` 然后注册它: ```java @Configuration public class FilterConfig { @Bean public FilterRegistrationBean<BlockSwaggerFilter> blockSwaggerFilter() { FilterRegistrationBean<BlockSwaggerFilter> reg = new FilterRegistrationBean<>(); reg.setFilter(new BlockSwaggerFilter()); reg.addUrlPatterns("/*"); reg.setName("blockSwaggerFilter"); reg.setOrder(1); return reg; } } ``` --- ### 🧪 验证是否成功 重启服务后访问: ``` http://localhost:8080/fpweb/v2/api-docs ``` 应该返回 404403,而不是 JSON 文档。 --- ### ✅ 总结 | 方法 | 是否推荐 | 说明 | |------|---------|------| | 设置 `springfox.documentation.enabled=false` | ❌ 不够 | 仅表面禁用,不阻止注册 | | 排除自动配置类 | ✅✅✅ 强烈推荐 | 根本性解决 | | 移除依赖 | ✅✅✅ 最干净 | 若无需 Swagger | | 使用 Filter 拦截 | ✅✅ 可作为兜底 | 快速见效 | --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值