P13617 [ICPC 2025 APC] Bit Counting Sequenc

news/2025/9/23 15:45:29/文章来源:https://www.cnblogs.com/wingheart/p/19107208

P13617 [ICPC 2025 APC] Bit Counting Sequenc

为什么没有题解,我来写一发小清新题解吧。

题意

给你一段 popcount 序列 \(\{a_i\}\),求出它的原序列。

\(n \le 5 \times 10^5\)

思路

img

观察一下这个 popcount 序列的性质。(例子的原序列是 [0,15])

对每种颜色的框,右边的框等于左边的框加 \(1\)

因此你可以认为 popcount 序列是倍增构造的。

本质上是因为,我们把 \([0,2^k-1]\) 原序列的第 \(k\) 位改成 \(1\),就可以造出 \([2^k,2^{k+1}-1]\)


img

你可以把整个 pop 序列分成若干框框。这里只画其中几个框。

你想知道题目给的 pop 序列是哪一个框框里面的。以此确定原序列。


如果从大框框开始做,先把序列 \(\{a_i\}\) 分到左右两个大框框里面,然后再确定大框框内部是否合法。

3 3 4 1 2,先确定出它是 [(0 1 1 2 1 2 2 3 1 2 2 3 2) 3 3 4][1 2 (2 3 2 3 3 4 2 3 3 4 3 4 4 5)]

然后递归判一下框框内部是不是合法的。比如这里,[... 3 3 4][1 2 ...] 刚好都是合法的。


但是你咋确定最大的框框,你不知道长度,不知道分割点,只知道左边框框加一等于右边框框而已。

所以我们从小框框开始确定。

还是上面那个例子,你容易确定应该 3 3 一组还是 3 4 一组。

显然是 3 4!因为左边加一等于右边。

然后你有了:[(2) 3][3 4][1 2]

然后再分组,因为 [(2) 3] + 1 = [3 4]。所以显然它们分一组。

然后你有了下面的完整分组过程:

[(2) 3][3 4][1 2]
[(2) 3 3 4][1 2 (2 3)]
[(1 2 2 3) (2) 3 3 4][1 2 (2 3) (2 3 3 4)]
[(0 1 1 2 1 2 2 3) (1 2 2 3) (2) 3 3 4][1 2 (2 3) (2 3 3 4) (2 3 3 4 3 4 4 5)]

每个框框 [...] 只需要记首位数字。比较框框也只需要比框框的首位数字。(因为框框内部在框框长度更短的时候已经确定合法了,所以只需要比较框框首位大小,类似 SA 的排序)

时间复杂度 \(O(n)\)

时间复杂度是这么算的:\(n + \frac{n}{2} + \frac{n}{4} + \cdots + 2 + 2 + 2 + \cdots + 2 = O(n)\)

记得判无解。

只讲了大致思路,还有写细节懒得写了。

code

#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace wing_heart {constexpr int N=5e5+7;int T,n,a[N];bool ans;int st1[N],st2[N];int *vec,*tmp;int svec,stmp;void main() {sf("%d",&T);while(T--) {ans=1;sf("%d",&n);rep(i,1,n) sf("%d",&a[i]);svec=0;vec=st1;tmp=st2;rep(i,1,n) vec[svec++]=a[i];ll pos=0;int t=0;for(;;t++) {if(vec[0]<0) break;if(svec==1) break;stmp=0;if(vec[0]+1!=vec[1]) {pos+=1ll<<t;tmp[stmp++]=vec[0]-1;for(int i=1;i<svec;i+=2) tmp[stmp++]=vec[i];} else {for(int i=0;i<svec;i+=2) tmp[stmp++]=vec[i];}swap(svec,stmp);swap(vec,tmp);}if(vec[0]<0) ans=0;if(!ans) { puts("-1"); continue; }pos+=((1ll<<vec[0])-1)*(1ll<<t);rep(i,1,n) {if(a[i]!=__builtin_popcountll(pos+i-1)) {ans=0;puts("-1");break;}}if(ans) pf("%lld\n",pos);}}
}
int main() {#ifdef LOCALfreopen("in.txt","r",stdin);freopen("my.out","w",stdout);#endifwing_heart :: main();
}

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

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

相关文章

perl -MCPAN -e install GD;

001、 Package gdlib was not found in the pkg-config search path.Perhaps you should add the directory containing `gdlib.pcto the PKG_CONFIG_PATH environment variableNo package gdlib found

Day 02 HTML的基础 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

如何在网站添加代码大气精美网站设计工作室织梦模板

【芯片DFX】万字长文带你搞懂JTAG的门门道道【芯片DFX】ARM:CoreSight、ETM、PTM、ITM、HTM、ETB等常用术语解析

网络建站的费用微网站开发一般费用多少钱

Navicat Premium&#xff08;16.3.3 Windows 版或以上&#xff09;正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结…

什么网站专做店铺wordpress 一栏主题

首先已经创建好了 Vue 框架&#xff0c;安装好了 node.js。 没有完成的可按照此博客搭建&#xff1a;搭建Vue项目 之后打开终端&#xff0c;使用命令。 1、命令安装 axios 和 vue-axios npm install axios --save npm install vue-axios --save2、package.json 查看版本 在 p…

做静态网站的步骤怎么下载网页视频到本地

一、类型转换 C语言中的类型转换比较松散&#xff0c;C新增4个类型转换运算符&#xff0c;更加严格的显示类型转换&#xff0c;使转换的效率更加规范 1、static_cast static_cast&#xff0c;用于仅在编译时检查的强制转换。 如果编译器检测到你尝试在完全不兼容的类型之间强制…

微信公众号手机网站做网站有哪些需求

在工作中&#xff0c;偶尔看到有些机器的网口名字是以ethX命令&#xff0c;有些则以enpXsX这种名字命名。网上的资料说的都不太明白,资料也无据可查&#xff0c;很难让人信服。于是决定自己查了下官方的资料和源码&#xff0c;把这些搞清楚。 官方文档&#xff1a;Predictable…

P3959 [NOIP 2017 提高组] 宝藏 题解

link 题目要求任选图中一点为根,通过拓展道路最终形成一棵树,使得代价总和最小,代价受深度和边权两个因素影响。 容易想到一种爆搜,任选一点为根,每次扫描已选点来不断尝试拓展道路,但这样做太蛋疼了,我们尝试优…

(二)若依前后端分离版本二次开发 代码生成、目录添加、数据字典维护

(二)若依前后端分离版本二次开发 代码生成、目录添加、数据字典维护一 摘要 主要介绍添加目录、菜单、代码自动生成等功能。 二 目标 2.1 掌握添加目录,菜单 2.2 掌握添加数据字典 2.3 掌握代码生成 三 实施 已标签…

C#与Access数据库操作简易指南:增删改查及类封装

简介:C#是面向对象的编程语言,常用于Windows应用开发,而Microsoft Access是一种数据库管理系统。本教程指导如何结合C#操作Access数据库进行基本的增删改查(CRUD)操作,使用ADO.NET通过OLEDB类连接和操作数据库。…

对之前部署hbase总结

部署路程为看黑马大数据视频 部署直到yarn集群部署之后看尚硅谷的视频完成部署即可 之后参考有可能会报错直接复制报错到csdn即可 启动代码和停止指令: 注意每次启动检查每一个主机启动是否完成 慢一些 否则会报错

网站排版图片网站禁止右键

一、前言 在大多数传统的web系统中&#xff0c;使用Redis一般都是作为缓存使用&#xff0c;在大数据查询时作为缓解性能的一种解决方案。博主的的系统中使用Redis也主要使用到缓存的作用&#xff0c;还有做了注册中心&#xff0c;分布式事务。其他的强大的功能&#xff0c;没有…

书画工作室网站模板网站建设做vip视频网站赚钱吗

在K8s中&#xff0c;创建Pod时的流程如下&#xff1a; 用户通过Kubectl或其他方式向API Server发送创建Pod的请求。API Server接收到请求后&#xff0c;会先进行权限验证和身份认证。一旦验证通过&#xff0c;API Server会将请求转发给Scheduler组件。Scheduler负责对新创建的…

网站自动更新时间代码网站域名和空间费用

网站地址&#xff1a;网络游戏防沉迷实名认证系统 PHP代码&#xff1a; 创建对应文件&#xff0c;在需要的位置get传参请求即可&#xff0c;具体参数参考 网络游戏防沉迷实名认证系统接口对接技术规范v2.0 1、上传信息 <?php $url "https://wlc.nppa.gov.cn/test…

百度推广要自己建站吗做网站需要公章吗

我们使用redis时发现yaml配置中的redis相关配置不生效&#xff0c;后面发现将配置修改甚至删除所有相关redis的配置&#xff0c;springboot依然能使用redis里面默认的db0并且不报错。上网查阅了一些文章&#xff0c;也都没有解决今天分享下&#xff0c;我的处理方法, SpringBo…

做网站关键词加到什么位置彩票网站如何建设

alist-org/alist Stars: 35.6k License: AGPL-3.0 alist 是一个支持多存储的文件列表/WebDAV 程序&#xff0c;使用 Gin 和 Solidjs。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 支持多种存储方式易于部署和开箱即用文件预览&#xff08;PDF、markdown、代码等&…

做外贸用什么网站好台州 网站建设

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为&#xff1a;每人口中喊出一个数字&#xff0c;同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和&#xff0c;谁就赢了&#xff0c;输家罚一杯酒。两人同赢或两人同输则继续下一轮&…

站点推广是什么意思企业网络设计方案论文

头文件介绍 axftmp1.h 是收集类模板(MFC模板类)的头文件&#xff0c;倘若你在程序中用到了CArray, CObList等数据结构时&#xff0c;那么就得加载该文件。通常在MFC编程中&#xff0c;为了使用集合、数组类&#xff0c;要在StdAfx.h中加入下面语句&#xff1a;#include <afx…

怎么在qq上自己做网站国内响应式网站

一种获取Linux虚拟机内部日志的方法【技术领域】[0001]本发明涉及云计算管理技术领域&#xff0c;特别是指一种获取Linux虚拟机内部日志的方法。【背景技术】[0002]在云计算环境下&#xff0c;虚拟机被广泛使用&#xff0c;对于虚拟机的维护要求越来越高&#xff0c;当虚拟机出…