U447601 星月的建筑游戏题解

题目链接

解题思路

solution1

动态规划题目,略微复杂。

状态非常好设计,设 f i f_i fi表示使用前i个木棍可以获得的最大积分。

然后暴力枚举来选择建筑材料的区间 [ i + 1 , j ] [i+1,j] [i+1,j],接着就在这个区间中枚举 a , b , c a,b,c a,b,c(其实就是三边长),用积分计算公式($f_i+16 \times S^2 $) 更新状态即可。

时间复杂度 O ( n 5 ) O(n^5) O(n5),直接拿捏20分

solution2

上述思路为何慢呢?打出了代码的大佬应该可以发现,上述思路使用了两个dp来维护转移,那么,简化dp即可减小时间复杂度

想到这一点之后,我们就可以用余弦定理从小到大枚举 l l l,然后再枚举r,并维护一个set记录 [ l + 1 , r − 1 ] [l+1,r-1] [l+1,r1]区间内所有的 c 2 c^2 c2(具体意义看一下题面),然后直接用upper_bound/lower_bound找到 a 2 + b 2 a^2+b^2 a2+b2的前去后计算面积并更新dp的值,

每次r+1的时候再把 a r 2 a_r^2 ar2放入Set种即可。当然这只有75分

核心代码:

for(int i=1;i<=n;i++)
{f[i]=max(f[i],f[i-1]);set<int>s;for(int j=i+1;j<=n;j++){auto it=s.lower_bound(a[i]*a[i]+a[j]*a[j]);if(it!=s.end())f[j]=max(f[j],f[i-1]+calc(a[i],a[j],sqrt(*it)+0.5));if(it!=s.begin())f[j]=max(f[j],f[i1]+calc(a[i],a[j],sqrt(*prev(it))+0.5));s.insert(a[j]*a[j]);}//calc是计算三角形面积的函数 
}

Solution3

这个当然是正解了

我们还是先枚举(废话) ,那么每⼀轮要做的事情就是在 r r r之前找到$\le a_l2+a_r2 最⼤的 最⼤的 a_i^2$ 。

如果我们从后往前枚举 r r r,那么只需要找到⼀个数据结构⽀持单点删除,查询 ≤ x \le x x最⼤的⼀个。

这个是可以⽤并查集维护的。

具体难以口述请见代码:

#include<bits/stdc++.h>
using namespace std;
using ll=__int128;
#define all(a) (a).begin(),(a).end()
const int N=8e3+10;
const ll INF=4e18;
long long n,a[N],b[N],cur[N],fa[N];
long long k,p[N],lim[N],rk[N];
ll f[N];
int find(long long x)//调用并查集 
{return fa[x]==x?x:fa[x]=find(fa[x]);
}
ll calc(int a,int b,int c)
{//计算面积的函数 if(max({a,b,c})*2>=a+b+c)return -INF;return 1ll*(a+b+c)*(b+c-a)*(c+a-b)*(a+b-c);
}
bool cmp(long long &x,long long &y)//&不能忘!!! 
{return b[x]<b[y];
}
std::ostream& operator << (std::ostream &out,__int128 a){if(a<0)out<<'-',a=-a;if(a>9)out<<a/10;return out<<int(a%10);
}//题目已经弱化,可以不写
signed main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i]*a[i];iota(cur,cur+1+n,0);//生成递增序列 不懂问度娘 sort(cur+1,cur+1+n,cmp);fill(f,f+1+n,-INF),f[0]=0;for(int i=1;i<=n;i++){f[i]=max(f[i],f[i-1]);k=0;for(int j=1;j<=n;j++)if(cur[j]>i)p[rk[cur[j]]=++k]=cur[j];for(int j=1,x=1;j<=k;j++){for(;x<=k&&b[p[x]]<=b[i]+b[p[j]];x++);lim[p[j]]=x;}iota(fa,fa+1+k,0);for(int j=n;j>i;j--)//核心部分1 {fa[rk[j]]=find(rk[j]-1);int x=find(lim[j]-1);//调用并查集 if(x)f[j]=max(f[j],f[i-1]+calc(a[i],a[p[x]],a[j]));//状态转移 }iota(fa,fa+1+k,0);fa[k+1]=0;for(int j=n;j>i;j--)//核心部分2 {fa[rk[j]]=find(rk[j]+1);int x=find(lim[j]);//调用并查集+1if(x)f[j]=max(f[j],f[i-1]+calc(a[i],a[p[x]],a[j]));//状态转移 }}std::cout<<f[n]<<std::endl;//理解为cout<<f[n];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/49239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源库编译 | zlib】 zlib库最新版本(zlib-1.3.1)在Ubuntu(Linux)系统下的 编译 、交叉编译(移植)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Git 基础知识

文章大纲 Git 是什么&#xff1f;-- 分布式版本控制系统版本控制系统简介Git 基本概念1. 安装 Git1.1 Windows 系统1.2 Linux 系统 2. Git 托管平台3. 常用 Git 操作4. tips4.1 全局设置 vs. 本地设置4.2 如何配置4.3 验证设置4.4 Git 四步曲 5. 常用插件6. 常规开发流程 作业其…

js+css侧边导航菜单 可收缩

jscss侧边导航菜单 可收缩https://www.bootstrapmb.com/item/14774 创建一个可收缩的侧边导航菜单需要使用JavaScript来处理交互&#xff0c;而CSS则用来设置样式和动画效果。以下是一个简单的示例&#xff0c;展示了如何创建一个可收缩的侧边导航菜单。 HTML 结构 html<!…

重修之路1

我也不知道我现在处于个什么状态&#xff0c;我在以前写代码时知道部分方法如何使用&#xff0c;但是也仅限于此我并不了其如何实现&#xff0c;让我感到迷茫我是越来越菜了随着AI的发展它写出的代码简洁高效甚至让我有些看不懂&#xff0c;以至于我开始怀疑自己的JS基本功因此…

开源模型应用落地-LangChain高阶-智能体探究-自定义agent(五)

一、前言 大模型具有非常强大的功能,可以解答疑问、撰写报告和文档、总结内容、进行翻译等各种日常工作任务。然而,大模型还可以应用于更多的场景,发挥出更强大的作用。 通过智能体,我们可以实现许多有价值的事情,比如:在日常生活中,我们能借助智能体实现智能家居的自动化…

Java中的异常处理与容错设计最佳实践

Java中的异常处理与容错设计最佳实践 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;异常处理是一个非常重要的环节。良好的异常处理和容错设计可以提升系统的健壮性和可维…

【接口测试】params传参与body传参区别

文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例&#xff1a; http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…

【java基础】spring springMVC springboot 的区别

Spring, Spring MVC, 和 Spring Boot 是三个紧密相关的技术&#xff0c;它们都是由 Pivotal 团队&#xff08;原SpringSource&#xff09;开发的&#xff0c;主要用于构建企业级的Java应用程序。尽管它们在功能上有所交集&#xff0c;但各自也有独特的定位和用途。 Spring Fra…

Linux定时执行程序和关闭程序

cron是一个基于时间的作业调度器&#xff0c;可以在指定的时间运行命令。 打开终端并编辑cron任务 crontab -e定时任务 # 每天20点30分执行程序 30 20 * * * /home/user/my_program # 每天15点30分关闭程序 30 15 * * * pkill my_programcrontab 用法 crontab 是 Unix 和类…

MacOS安装SDKMan管理Java版本

文章目录 1 简介2 安装与卸载2.1 安装2.2 卸载 3 使用3.1 查看其他工具&#xff1a;支持 Ant, Maven 等3.2 查看Java版本3.3 安装Java&#xff0c;加上相关的版本3.4 设置Java版本(全局)3.5 只在当前窗口生效3.6 卸载1 默认环境无法卸载 4 jdk安装的位置5 与IDEA集成参考 1 简介…

简单修改,让UE4/5着色器编译速度变快

简单修改&#xff0c;让UE4/5着色器编译速度变快 目录 简单修改&#xff0c;让UE4/5着色器编译速度变快 一、问题描述 二、解决方法 &#xff08;一&#xff09;硬件升级 &#xff08;二&#xff09;调整相关设置和提升优先级 1.调整相关设置 &#xff08;1&#xff09…

Pytorch 6

罗切斯特回归模型 加了激活函数 加了激活函数之后类 class LogisticRegressionModel(torch.nn.Module):def __init__(self):super(LogisticRegressionModel, self).__init__()self.linear torch.nn.Linear(1,1)def forward(self, x):# y_pred F.sigmoid(self.linear(x))y_p…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

Angular之store全局状态管理 浅学

在 Angular 应用中&#xff0c;我们可以使用 ngrx/store 进行状态管理可以有效地管理和跟踪应用程序的状态变化。ngrx/store 是基于 Redux 模式的状态管理库&#xff0c;它提供了一种集中式存储管理应用程序状态的方式。以下是关于 ngrx/store 的详细解释和使用方法&#xff1a…

MSPM0G3507学习笔记1:开发环境_引脚认识与点灯

今日速通一款Ti的单片机用于电赛&#xff1a;MSPM0G3507 这里默认已经安装好了Keil5_MDK 首先声明一下: 因为是速成&#xff0c;所以需要一定单片机学习基础&#xff0c;然后我写的也不会详细&#xff0c;这个专栏的笔记也就是自己能看懂就行的目标~~~ 文章提供测试代码解…

智能制造·数字化工厂建设规划方案(65P)

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取&#xff0c;请见下图

Ecovadis评估的流程是什么

Ecovadis评估流程是一个全面、系统且注重细节的过程&#xff0c;旨在为企业提供关于其可持续性表现的深入洞察。这一评估不仅覆盖了企业在环境、社会和治理方面的多个方面&#xff0c;还强调了持续改进的重要性&#xff0c;确保企业能够不断提升其CSR&#xff08;企业社会责任&…

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义 DSL语句 #实例 GET /capture_features_202407/_search {"query": {"bool": {"must": [{"terms": {"plateNo": ["汉A00001"]}},{"range&quo…

构建一个具有深色模式的简单React Web应用

在当今的Web开发世界里,创建一个既美观又功能丰富的用户界面是至关重要的。在本文中,我们将探讨如何使用React构建一个简单但功能强大的Web应用,它包含导航栏、内容展示区域和深色模式切换功能。 项目概述 我们的目标是创建一个具有以下特性的Web应用: 左侧导航栏,包含四个链…

Qt创建自定义组件并且promote to之后导致编译错误(CMake)

创建自定组件并且加入到全局(勾选"Global include"选项)后&#xff0c;重新编译&#xff0c;元对象编译器生成的ui_xxxx.h文件中会新加入自定义组件的头文件&#xff1a; 如图所示&#xff0c;编译器提示找不到自定义组件的头文件&#xff1a; Solution: 在CMakeL…