CF1725D Deducing Sortability

news/2025/2/27 16:30:29/文章来源:https://www.cnblogs.com/CuteNess/p/18741252

有一个数组 \(A\),可以在上面进行任意次操作。每次操作选择一个位置,把它减去 \(2^c\) 后再乘 \(2\)(其中 \(c\) 是已经在这个位置上操作过的操作数)。每次操作之后,数组中的所有元素必须是正整数。如果可以将它变得单调上升,那么它就是一个好的数组。

现在需要构造长为 \(n\) 的一个好的数组,使得 \(\sum A_i\) 最小,在此基础上使得它的字典序最小,输出 \(\sum A_i\),并 \(q\) 次询问某个位置上的值,保证位置升序给出。

\(n\le10^9,q\le\min(n,10^5)\)


第一道没看题解写出来的 CF 2000+?(但是队友也给了我很多提示,所以应该不算(

首先,我们考虑一个数经过若干次后可以变成什么,假设原来是 \(x\),那么经过 \(k\) 次操作后,\(x\) 会变成 \(2^k(x-k)\)

接着,我们反过来考虑可以操作成 \(y\) 的数中最小的数是什么。

显然只要 \(2^k|y\),那么 \(\dfrac{y}{2^k}+k\) 就可以被操作成 \(y\)

我们发现,只要 \(y\) 是一个偶数,那么有 \(y\ge2\),此时 \(y-\dfrac{y}{2}\ge1\),那么我们贪心地取尽可能大的 \(k\) 是不劣的。

因此,在下文中,我们定义 \(f(y)=\dfrac{y}{2^k}+k\),其中 \(k\)\(y\) 二进制低位连续 \(0\) 的数量。

考虑回原问题,我们要操作出一个单调上升的 \(A\),这意味着 \(A\) 相邻两项必不能相同。

那么我们此时选择 \(f(A_i)\) 作为初始时原位置上的数必定是最优的。

因此我们可以选择考虑最终的序列 \(B\),答案就是 \(\sum f(B_i)\)

题目中的要求是长至少为 \(n\),因此最优策略就是贪心地每次选择 \(f(x)\) 最小的还未出现过的 \(x\) 插入到 \(A\) 里。

接下来我们考虑对于一个数 \(x\),有多少个数 \(y\)\(f(y)=x\),由于 \(f(y)=\dfrac{y}{2^k}+k\),我们令 \(z=\dfrac{y}{2^k}\)

枚举 \(1\le z\le x\),假如 \(z\) 是一个偶数,那么不符合 \(k\)\(y\) 二进制低位连续 \(0\) 的数量的定义,直接舍去。

剩余的所有奇数 \(z\) 都是合法的,因此我们可以得知,一共存在 \(\lceil\dfrac{x}{2}\rceil\)\(y\) 使得 \(f(y)=x\)

那么第一问就可以简单解决了,直接从小到大枚举 \(x\),最多只有 \(\sqrt{n}\)\(x\)

接下来我们考虑第二问,要求出所有数里面的第 \(k\) 大,第一眼看上去较困难,因为我们根本无法记下这么大和这么多的数。

但是我们发现每个数都能被表示为 \(2^ab\) 的形式,我们考虑对所有数取对数,那么这个数就可以被表示为 \(a+\log_2b\)

\(\log_2b\) 是不好计算的,因为这个东西是小数,我们考虑枚举 \(b\),考虑所有的 \(a+log_2b\) 的数。

显然,对于所有 \(b \le x\)\(x\) 都可以贡献到 \(b\),我们把 \(log_2b\) 的整数部分和小数部分分离,那么所有的 \(a+\log_2b\) 就可以被表示为 \(\log_2b\) 的小数部分再加上一个区间里整数的形式。

那么我们首先把所有 \(\log_2b\) 的小数部分预处理出来并离散化,然后从小到大对整数部分扫描线,然后用数据结构维护插入删除第 \(k\) 大即可。

我用的是树状数组,但是不知道为何仍然常数较大()

#pragma GCC optimize("Ofast", "inline", "no-stack-protector")
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
using std::cin, std::cout, std::cerr;
const int N = 1e6 + 7, Lg = std::__lg(N) + 1, M = 1 << Lg;
typedef long long i64;#define R(i,a,b) for(int i(a);i<=(b);++i)
typedef double unit;struct bit {int tr[M], cnt;void add(int x, int y) {cnt += y;for(; x < M; x += x & -x)tr[x] += y;}int qry(int x) {int y = 0;for(; x; x -= x & -x)y += tr[x];return y;}int kth(int k) {int p = M;for(int i = Lg-1; ~i; --i)if(tr[p - (1 << i)] >= k)p -= (1 << i);else k -= tr[p - (1 << i)];return p;}
} T;int n, q;unit val[N]; int offset[N], rnk[N], fr[N];
std::vector<unit> vals;
int qry[N], ans[N];
std::vector<int> st[N], ed[N];int main() {cin >> n >> q;int i = 1;i64 _ans = 0, t = 0;for(; t + (i + 1) / 2 < n; ++i) {t += (i + 1) / 2, _ans += i * ((i + 1) / 2);}_ans += i * (n - t);cout << _ans << "\n";for(int j = 1; j <= (i + 1) / 2; ++j) {int w = 2 * j - 1;val[j] = log2(w);while(val[j] >= 1) val[j] -= 1, ++offset[j];offset[j] -= w;vals.push_back(val[j]);}std::sort(vals.begin(), vals.end());vals.erase(std::unique(vals.begin(), vals.end()), vals.end());for(int j = 1; j <= (i + 1) / 2; ++j) {rnk[j] = std::lower_bound(vals.begin(), vals.end(), val[j]) - vals.begin() + 1;fr[rnk[j]] = j;}int Rp = 0;for(int j = 1; j <= (i + 1) / 2; ++j) {int l = 2 * j - 1, r = i - 1;if(j <= (n - t)) ++r;Rp = std::max(Rp, r + offset[j]);st[l+offset[j]].push_back(rnk[j]);ed[r+offset[j]+1].push_back(rnk[j]);}R(j, 1, q) cin >> qry[j];int Kt = 0, pt = 1;for(int j = 0; j <= Rp; ++j) {for(int& x: st[j]) T.add(x, 1);for(int& x: ed[j]) T.add(x, -1);int K = T.cnt;while(pt <= q && qry[pt] <= Kt + K) {int w = T.kth(qry[pt] - Kt);ans[pt++] = j - offset[fr[w]];}Kt += K;}R(j, 1, q) cout << ans[j] << "\n";
}

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

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

相关文章

Java SpringBoot实现简易扫码登录流程 附项目代码

SpringBoot实现简易扫码登录流程,附项目代码先总结流程:移动端请求扫码登录,服务端生成二维码并缓存二维码ID和状态,将二维码的Base64格式返回给前端展示; PC端页面轮询检查二维码状态; 手机扫码后调用扫码接口,携带移动端的Token和二维码ID请求服务端,服务端根据扫码的…

Salesforce宣布2025年不招工程师,技术岗位真的会消失吗?

Salesforce CEO Marc Benioff 最近放出了一条让科技圈热议的消息:2025年,Salesforce将不再招聘新的软件工程师。作为全球最大的CRM软件提供商之一,这一决定引发了许多人对AI对就业市场影响的思考。 AI改变工作模式,工程师岗位需求减少 Marc Benioff 在采访中透露,2024年,…

mysql查询语句

一、查询语句 1、select查询一个表中的所有数据 格式: select * from 表名 ; 案例: select * from student ;2、查询部分字段信息数据 格式: select 字段1,字段2 from 表名; 案例: select name,math from student;3、查询字段可以用as 取别名 格式: select 字…

Vue3安装配置+VSCode开发环境搭建,超详细保姆级教程(图文)

目录1. node.js 下载安装2. 查看 node.js 是否安装成功3. 配置 npm 下载的默认安装、缓存环境(1) 添加文件夹(2) 设置系统环境变量(3) 修改下载模块的存放路径4. npm 镜像源配置(1) 输入cmd打开命令提示符窗口,(2) 如果配置报错(3) 查看镜像配置是否成功5. 安装 vue-cli 工具6.…

Windows下Redis哨兵模式配置以及在.NetCore中使用StackExchange.Redis连接哨兵

一,Redis哨兵模式配置 1,下载Redis,然后解压复制5个文件夹分别如下命名。 2,哨兵模式配置 (1)修改主节点Redis-6379中redis.windows.conf配置文件如下 (2)修改从节点Redis-6380中redis.windows.conf配置文件如下(3)配置哨兵,在哨兵文件夹下添加Sentinel.conf配置文件…

zabbix监控http

一、模版复制与配置变更 1、模版复制2、修改宏 全克隆并修改好宏端口二、测试httpd服务状态 1、检查模块是否启用 apachectl -M | grep status修复 #ServerName www.example.com:80 ServerName 192.168.0.152:13000 重新执行后正常2、检查状态 http://112.81.86.33:13001/serve…

Ubuntu 22.04 或更高版本的系统中安装.NET Core 3.1的解决方案(使用1panel进行可视化演示)

第一步:先安装长期支持版本.NET 6 或更高 (这一步不是必须的,如果是干净的服务器建议这么做,因为安装完后会自动创建路径和环境变量方便后续操作)安装方法sudo apt update sudo apt install -y dotnet6如果安装时出现异常:A fatal error occurred. The folder [/usr/lib/dot…

考古新视野:LiDAR 揭开雨林下的玛雅古城!

一、当科技遇见文明:LiDAR 的考古革命茂密的雨林曾是考古学家的噩梦——藤蔓缠绕的树冠遮蔽了地面,人力勘探耗时费力,无数古代遗迹深藏其中。然而,激光雷达(LiDAR)技术的出现,如同一把“数字X光刀”,穿透了雨林的绿色屏障,将玛雅文明的失落之城从历史的尘埃中重新点亮…

mysql知识面试day2

mysql具有哪些锁 按锁的粒度分配:行级锁,表级锁,页级锁。mvcc的实现原理 MVCC--一份数据保留多个版本的一种方式,查询时通过readview和版本链获得对应版本的数据 好处:提升并发性能,对于高并发场景,mvcc比行级锁开销更小 实现原理 MVCC的实现依赖于版本链,版本链具有三个隐…

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索)

AI 搜索你的所有笔记!思源笔记 +Cursor+MCP Server ——打造你的个人专属 AI 资料库!(AI 大模型搜索笔记、内容总结、大纲凝练、RAG 搜索) 前排提示:本文撰写于 2025 年 2 月,仅仅离 Anthropic 发布的 MCP 协议过去不到 3 个月,因此本文很多接入 MCP 的方式还略显复杂。…

LLM大模型:deepseek浅度解析(四):Native Sparse Attention NSA原理

deepseek又整活了啊,2025.2.16的时候又发布了 "Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention",核心是解决attention计算耗时耗算力的问题!NSA具体又是怎么做的了?回忆一下:attention效果好的核心原因,就是Q*K得到了tok…

聊一聊:Air8000能解决哪些社会问题?

Air8000能解决什么社会问题呢?当前我们认为可以解决如下的问题: 问题一 硬件:成本高,备货压力大,稳定性差 嵌入式的一些常用的功能,比如GPIO、4G、Wi-Fi、蓝牙、定位、充电、升压、处理器等等,是项目上常用的功能。 如果每个都是模块,组合起来成本不菲。 Air8000的定价…