P13617 [ICPC 2025 APC] Bit Counting Sequenc

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

题意

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

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

思路

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

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

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

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


你可以把整个 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 LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
wing_heart :: main();
}

P13617 [ICPC 2025 APC] Bit Counting Sequenc的更多相关文章

  1. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU5952 Counting Cliques (暴力深搜+剪枝) (2016ACM/ICPC亚洲赛区沈阳站 Problem E)

    题目链接:传送门 题目: Counting Cliques Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total S ...

  3. Hdu 5439 Aggregated Counting (2015长春网络赛 ACM/ICPC Asia Regional Changchun Online 找规律)

    题目链接: Hdu 5439 Aggregated Counting 题目描述: 刚开始给一个1,序列a是由a[i]个i组成,最后1就变成了1,2,2,3,3,4,4,4,5,5,5.......,最 ...

  4. 数数字 (Digit Counting,ACM/ICPC Danang 2007,UVa 1225)

    思路: 利用java 特性,将数字从1 一直加到n,全部放到String中,然后依次对strring扫描每一位,使其carr[str.charAt(i)-'0']++; 最后输出carr[i],即可. ...

  5. 数数字(Digit Counting,ACM/ICPC Danang 2007,UVa1225)

    #include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char s[10000]; in ...

  6. 数数字 (Digit Counting,ACM/ICPC Dannang 2007 ,UVa1225)

    题目描述:算法竞赛入门经典习题3-3 #include <stdio.h> #include <string.h> int main(int argc, char *argv[ ...

  7. UVa 1225 - Digit Counting - ACM/ICPC Danang 2007 解题报告 - C语言

    1.题目大意 把前n$(n\le 10000)$个整数顺次写在一起:12345678910111213……计算0~9各出现了多少次. 2.思路 第一想法是打表,然而觉得稍微有点暴力.不过暂时没有想到更 ...

  8. The Preliminary Contest for ICPC Asia Shanghai 2019 D. Counting Sequences I

    题目:https://nanti.jisuanke.com/t/41412思路:dfs           先取ai>2  2^12>3000 因此至多取11个 其余用1补        ...

  9. 习题3-3 数数字(Digit Counting , ACM/ICPC Danang 2007, UVa1225)

    #include<stdio.h> #include<string.h> int main() { char s[100]; scanf("%s",s); ...

  10. hnu Counting ones 统计1-n 二进制中1的个数

    Counting ones Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit users ...

随机推荐

  1. java 套接字

    简介 RT code package com.kuang; import java.io.ByteArrayOutputStream; import java.io.IOException; impo ...

  2. java radioButton

    简介 简单 code /* * @Author: your name * @Date: 2020-11-04 10:19:14 * @LastEditTime: 2020-11-04 10:28:50 ...

  3. 探索 MCP C# SDK:实现大语言模型与应用的无缝对接

    探索 MCP C# SDK:实现大语言模型与应用的无缝对接 在当今人工智能快速发展的时代,大语言模型(LLMs)已经成为众多应用的核心驱动力.然而,如何让这些强大的模型与各种数据源和工具进行有效集成, ...

  4. VUE项目开发报错:Error in render: "TypeError: Cannot read property 'country' of undefined"

    VUE项目开发中遇到的问题记录一下 如题,vue页面开发中控制台报如上错误,但是页面展示是有数据的,展示正常,具体错误如下图 对页面展示没有影响,但是控制台一直报这个错,看着就不舒服,于是去找原因 首 ...

  5. SpringBoot启动原理(基于2.3.9.RELEASE版本)

    目录 版本 总体上 main方法上的注解:@SpringBootApplication 源码 @SpringBootConfiguration @ComponentScan @EnableAutoCo ...

  6. ARC184 随便写点

    最逆天的一集. ARC184 A 题目解析 关键观察:注意到 \(m\) 很小,只有 \(10\),并且 \(q = 950\).考虑有什么性质. 我们发现 \(m\) 很小,我们考虑挖掘性质. 有一 ...

  7. 20250730 - AnyswapV4Router 授权漏洞: 绕过了不存在的 permit 函数

    背景 20250730 一名用户在授权并使用 AnyswapV4Router 兑换了 WETH 后,被攻击者通过 AnyswapV4Router 授权漏洞转移走 WETH,前后共计损失 401 WET ...

  8. LongRunningTask-正确用法

    在上一篇文章<如何正确实现一个 BackgroundService>中有提到 LongRunning 来优化后台任务始终保持在同一个线程上. protected override Task ...

  9. Negigent Norbert Gym - 102680E

    https://vjudge.net/problem/Gym-102680E/origin https://vjudge.net/contest/396206#problem/E Naughty Ne ...

  10. [题解]ABC364 A~F

    A - Glutton Takahashi 给定\(n\)道菜,每道菜要么是甜的(用sweet表示),要么是咸的(用salty表示).必须按顺序吃,如果连续吃到\(2\)个甜的菜,就会浑身难受吃不下去 ...