Codeforces Round 871 (Div. 4) G 记忆化搜索+二分 你没见过的解法!

news2024/12/24 9:55:17

G. Hits Different

在这里插入图片描述
在这里插入图片描述

记dp数组为答案数组
首先

dp[2]= 2 2 2^2 22+ 1 2 1^2 12
dp[3]= 3 2 3^2 32+ 1 2 1^2 12
dp[5]= 2 2 2^2 22+ 3 2 3^2 32+ 1 2 1^2 12
不难发现dp[5]=dp[2]+dp[3]-dp[1]
同理dp[25]=dp[18]+dp[19]-dp[13]

接下来就是愉快的找公式时间
观察到题目中给的每一层塔的级数 (易得级数公式为 n ∗ ( n + 1 2 \frac{n*(n+1}{2} 2n(n+1)
找到当前数字x所对应的级数为 p o s pos pos, 此时 x − p o s x-pos xpos就是这个数字头上左边的数字, 易得 x − p o s + 1 x-pos+1 xpos+1就是头上右边的数
同理可得 x − p o s + 1 x-pos+1 xpos+1头上左边的数字就是 x − 2 ∗ p o s + 2 x-2*pos+2 x2pos+2
所以公式就是 x ∗ x + d p [ x − p o s ] + d p [ x − p o s + 1 ] + d p [ x − 2 ∗ p o s + 2 ] x*x+dp[x-pos]+dp[x-pos+1]+dp[x-2*pos+2] xx+dp[xpos]+dp[xpos+1]+dp[x2pos+2]

但是! 公式并不完全适用
此公式不适用于左右两端的情况

数字在金字塔左端时, 级数计算调整-1(至于为什么调整可以自己找找看), 且不能加左上方的数(不存在这个位置的数字), 也不需要减去重复的值, 因为重复的值是在加了两项dp值后产生的, 此时不存在这个位置的数因此也不需要减去重复的值
数字在金字塔右端时, 级数正常计算, 其他同上

明白了公式后, 仍然有一个难题在面前, 那就是如何找到这个数所在的金字塔层数

其实很简单: 只需要预处理出来所有1e6以下的级数( n ∗ ( n + 1 2 \frac{n*(n+1}{2} 2n(n+1), 在查找时候进行lower_bound二分即可

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define endl "\n"

ll cnt,n,m,t,ans,ant;
const int N=1e6+10;
const int INF=0x3f3f3f3f;
const ll llINF=0x3f3f3f3f3f3f3f3f;
ll arr[N];
string str;
vector<ll>vis(N);
vector<ll>ks;

ll dfs(ll x)
{
    if(x<=0) return 0;
    if(x==0) return 0;
    if(vis[x]) return vis[x];
    ll pos=0;

    pos=lower_bound(ks.begin(),ks.end(),x)-ks.begin();

    ll fuck=pos*(pos+1)>>1;
    if(x==fuck)
    {
        vis[x]+=x*x+dfs(x-pos);
        return vis[x];
    }
    if(x==fuck-pos+1)
    {
        pos--;
        vis[x]+=x*x+dfs(x-pos);
        return vis[x];
    }
    vis[x]+=x*x+dfs(x-pos)+dfs(x-pos+1)-dfs(x-2*pos+2);
    return vis[x];
}

void solve()
{
    cin>>n;
    cout<<dfs(n)<<endl;
    return;
}

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //所有输入用cin
    //所有输出用cout
	vis[1]=1;
    vis[2]=5;
    vis[3]=10;
    ks.push_back(0);
    for(int i=1;i<=1000000;i++)
    {
        cnt=i*(i+1)>>1;
        if(cnt>=1000000) break;
        // cout<<cnt<<endl;
        ks.push_back(cnt);
    }

    cin>>t;
    while(t--)
        solve();
    return 0;
}

记得开longlong

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

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

相关文章

Notion AI 进阶【help me write】

对于Notion Ai来说,尽管一直在不断发展&#xff0c;但似乎人们还沉浸在Chat Gpt带来的狂欢&#xff0c;但如果你是国内用户&#xff0c;Notion AI所能提供的是远远大于限制过多的GPT&#xff0c;本篇讲一讲在Notion AI中help me write的使用 在这周我把Notion ai接入到Discord…

PostgresML - PostgreSQL的生成式AI扩展

PostgresML 是 PostgreSQL 的机器学习扩展&#xff0c;支持生成式AI&#xff0c;使你能够使用 SQL 查询对文本和表格数据执行训练和推理。 借助 PostgresML&#xff0c;你可以将机器学习模型无缝集成到你的 PostgreSQL 数据库中&#xff0c;并利用尖端算法的强大功能来高效地处…

【Python数据类型-集合】------- PYTHON基础14

内容目录 一、 集合1. 集合创建1.1. 创建集合1.2. 创建空集合 2. 集合基本操作2.1. add()添加新的元素 set1.add(element)2.2.remove()删除元素 set1.remove(element)2.3.discard()删除元素 set1.discard(element)2.4.clear()清空集合里的所有元素 set1.clear() 3. 集合与列表、…

介绍10款ChatGPT替代产品

ChatGPT 引领着聊天 AI 的世界&#xff0c;许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础&#xff0c;它使得用户能够通过回答问题与 AI 进行交互。 GPT-4 的引入为机器人提供了更强大的功能。然而&#xff0c;它也有一个明显的缺点&#xff…

09-HTML-表格标签(合并单元格)

标签描述<table>定义表格<caption>定义表格标题。<th>定义表格中的表头单元格。<tr>定义表格中的行。<td>定义表格中的单元。<thead>定义表格中的表头内容。<tbody>定义表格中的主体内容。<tfoot>定义表格中的表注内容&#x…

API数据接口可以从几个不同的角度来看待;

一.API数据接口可以从几个不同的角度来看待&#xff1a; 1. 技术角度&#xff1a;API数据接口是一种技术实现&#xff0c;通常是以HTTP协议或其他网络协议为基础&#xff0c;并采用特定的数据格式&#xff08;如JSON或XML&#xff09;来传递数据。 2. 业务角度&#xff1a;API数…

Ubuntu22.04安装PyTorch1.12.1 GPU版本

目录 一、电脑相关信息 1. 电脑显卡环境&#xff1a; 二、安装Pytorch1.12.1/cu116&#xff08;GPU版本&#xff09; 1. 准备&#xff1a;新建虚拟环境 2. 方式一&#xff1a;用pip在线安装torch1.12.1cu116、torchvision0.13.1cu116&#xff1a;&#xff08;在pytorch官网…

堆的实现,以及画图和代码分析,建堆,堆排序,时间复杂度的分析

堆的实现 堆的概念及结构堆的实现初始化销毁返回堆顶元素判空有效数据个数 堆的插入&#xff08;向上调整算法&#xff09;删除堆顶元素&#xff0c;仍然保持堆的形态&#xff08;向下调整算法&#xff09;堆的创建向上调整法建堆向下调整建堆两种建堆方法时间复杂度向下调整法…

shell脚本之数值,冒泡排序算法

目录 一、数组 1.定义数组 2. 数组中数据类型 2.1数值类型 2.2字符类型 二、数组的用法 1. 输出数组中的值 2. 统计数组参数个数 ​编辑 3.查看数组下标列表 4.分割字符串 5.替换数组中的字符 6.删除数组 三、数组追加元素 1.方法1示例 2.方法2示例 3.方法3示例 …

Notion Ai中文指令使用技巧

Notion AI 是一种智能技术&#xff0c;可以自动处理大量数据&#xff0c;并从中提取有用的信息。它能够 智能搜索&#xff1a;通过搜索文本和查询结果进行快速访问 自动归档&#xff1a;可以根据关键字和日期自动将内容归档 内容分类&#xff1a;可以根据内容的标签和内容的…

【嵌入式Linux】MBR分区表 和 GPT分区表

文章目录 GUID以及分区表MBR分区方案GPT 分区方案GPT分区表结构 GPT分区表LBALBA0LBA1LBA 2-33python生成GPT分区表gpt分区表实例 gpt分区表查看查看百问网T113-s3固件查看友善之臂nanopi-m1-plus官方固件查看荣品RV1126固件查看f1c200s固件查看V3s的SD启动卡 原文&#xff1a;…

session和Filter

session 介绍 jsp利用servlet提供的HttpSession接口识别一个用户&#xff0c;存储这个用户的所有访问信息。默认情况下&#xff0c;jsp允许会话跟踪&#xff0c;一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要关掉它&#xff0c;通过将page指令中ses…

多模态:BLIP-2论文讲解

多模态&#xff1a;BLIP-2论文讲解 IntroductionMethod第一阶段第二阶段 实验 Introduction 多模态学习在近两年我们已经见证了他的快速发展&#xff0c;由于它是视觉-语言的交叉领域&#xff0c;我们自然地期待可以借助目前风头正盛的LLM来辅助完成多模态任务。 在这篇论文中…

【SAP Abap】X-DOC:SNRO - ABAP流水号应用

【SAP Abap】X-DOC&#xff1a;SNRO - ABAP流水号应用 1、定义表&#xff08;字段域&#xff09;2、定义流水号3、使用流水号4、测试程序 1、定义表&#xff08;字段域&#xff09; 2、定义流水号 Tcode: SNRO/SNUM&#xff0c; 根据以上创建的字段域 YDSNRO&#xff0c;创建对…

grep练习题

题目: 文件格式&#xff1a; 第1列&#xff1a;城市位置编号。 第2列&#xff1a;月份。 第3列&#xff1a;存储代码及出库年份。 第4列&#xff1a;产品代号。 第5列&#xff1a;产品统一标价。 第6列&#xff1a;标识号。 第7列&#xff1a;合格数量。 file.txt文件内容&a…

RabbitMQ入门案例及简单工程搭建

环境的搭建 这里是用Maven工程搭建的基础环境项目&#xff0c;这里的dome_rabbitmq就是父工程。 子工程 publisher&#xff1a;消息发布者&#xff0c;将消息发送到队列queueconsumer&#xff1a;订阅队列&#xff0c;处理队列中的消息 父工程的pom文件依赖 <?xml ver…

SpringCloud-11_Alibaba Sentinel

SpringCloud系列 SpringCloud-10_Alibaba Nacos SpringCloud-9、SleuthZipkinSpringCloud-8、Gateway网关服务SpringCloud-7_OpenFeign服务调用SpringCloud-6_Ribbon负载均衡SpringCloud-5_模块集群化 求帮助 富文本编辑器用着真伤心TT。。不知道编辑器发生了什么。。--- 用…

Android Studio Notification(状态栏通知) 不显示通知 解决

引言&#xff1a;在学习的过程中&#xff0c;我发现&#xff0c;无论怎么修改&#xff0c;甚至是直接复制了大佬的代码&#xff0c;我的程序都不呢个正确的弹出一个状态栏通知&#xff0c;在经过一晚上的纠缠后&#xff0c;终于找到了原因 通知不显示可能由多种原因引起&#…

C++自动推导与函数模板

自动推导、函数模板、类模板 目录 1. 自动推导出数据类型 2. 函数模板 基本概念注意事项函数模板的具体化函数模板分文件编写函数模板高级函数后置返回类型 1. 自动推导出数据类型 auto关键字 linux 系统下使用的话&#xff0c;要在编译时 —stdc11 注意&#xff1a; a…

关于B+树的介绍、用途和c++代码实现

数据结构和算法的重要性不言而喻&#xff0c;一些优秀的开源项目的核心和灵魂就是数据结构、算法。在实际的编程中我们经常可以在各种框架、算法中看见B树、B树的身影。特别是在数据库的数据库引擎中&#xff0c;它们更是占据着重要的地位。 下面我将通过简单的二叉树&#xff…