UOJ NOI Round #7 Day1 比特迷宫 题解

news/2024/11/13 19:48:25/文章来源:https://www.cnblogs.com/SkyMaths/p/18544624

思路

构造,且上界并不是特别严格。/bx/bx/bx

首先加法比较“混合”,考虑转成位运算,具体地,钦定操作的 \(a, b\) 满足 \(a\&b = 0\)

考虑递归成子问题,按照 popcount 分组,有一个关键观察是:我们在操作一个 \(a|b = c\) 的时候,可以将任意几个 \(d\&c = d\)\(popcount(d) = popcount(c) - 1\)\(a_d\) 01 翻转。

具体而言,假设我们在操作 10111,我们要使得 10110 和 10101 01翻转,那我们可以使 a|b = 10111,且 b = 00011,即我们要的 \(d\) 的缺的 1。

发现这个时候 < k - 1 的位上的 a 会受到一堆操作的影响,那我们直接先不管它,因为我们在操作 \(popcount = i\) 的时候 \(popcount > i\) 的是不会受影响的所以递归成子问题即可。

那么我们考虑求出 \(T_{1\sim k}\) 使得 \(T_i\) 能覆盖所有 \(popcount = i - 1\)。这个可以贪心求,每次求最大的可行的即可(可以用桶优化),不一定最优但是够了,我构造出来的 \(\sum T_k = 159599\),不知道为啥,其他人好像可以构造出 157884。哦,他们选择的是覆盖最多的情况下最小的值加入 T 中,而我是随便选的,不知道为什么他们会更优/yun

好像没什么细节,注意一开始若 \(a_{n - 1}\not= 1\) 的话要额外进行一次操作使得 \(a_{n - 1}\) 变为 1.

代码

const int N = 1 << 20;
const int LogN = 20;
int n, k, _, tot;
int a[N], vis[N], cnt[N], inT[N];
vector <int> pos[LogN + 1], val[LogN + 1], T[LogN + 1];vector <pii> opt;
void answer(int a, int b) {assert((a & b) == 0);int s = b;do {Main::a[a | s] ^= 1;} while(s && (s = (s - 1) & b, 1));opt.eb(a, b);
}
void output() {printf("%llu\n", opt.size());for (pii _ : opt) {int a = _.fi, b = _.se;printf("%d %d\n", a, b);}fflush(stdout);
}void skymaths() {read(n, k, _);for (int i = 0; i < n; ++i) read(a[i]);// read(k); n = 1 << k;for (int i = 0; i < n; ++i) {vis[i] = 1;pos[cnt[i] = __builtin_popcount(i)].emplace_back(i);}rep (c, 1, k) {// 求 T(c),即覆盖所有 T(c - 1)for (int i = 0; i <= k; ++i) val[i].clear();for (int v : pos[c]) {val[c].eb(v);assert(cnt[v] == c);// printf("c = %d, v = %d\n", c, v);}per (i, k, 1) {for (int v : val[i]) {if (cnt[v] != i) {// printf("    %d cnt -> %d\n", v, cnt[v]);// assert(cnt[v] < i);val[cnt[v]].eb(v);continue;}T[c].eb(v); ++tot;inT[v] = 1;rep (j, 0, k - 1) {if ((v >> j & 1) && vis[v ^ (1 << j)]) {int t = v ^ (1 << j);vis[t] = 0;rep (bit, 0, k - 1) {if (t >> bit & 1) continue;--cnt[t ^ (1 << bit)];}}}}}}// 此时输出 tot 就是 sum |Tk|if (!a[n - 1]) answer(n - 1, 0);per (i, k, 1) {for (int v : T[i]) {int msk = 0;rep (j, 0, k - 1) {if (v >> j & 1) {if (a[v ^ (1 << j)] != inT[v ^ (1 << j)]) msk |= 1 << j;}}answer(v ^ msk, msk);}}rep (i, 0, n - 1) {if (a[i] != 0) {cerr << "Wrong on i = " << i << endl;}}output();// check 正确性用的代码// clr(vis);// rep (c, 1, k) {//     for (int v : T[c]) {//         rep (j, 0, k - 1) {//             if (v >> j & 1) {//                 vis[v ^ (1 << j)] = 1;//             }//         }//     }// }// rep (i, 0, n - 1) {//     if (!vis[i]) {//         printf("wrong on i = %d\n", i);//     }// }// printf("%d\n", tot);// return ;// rep (c, 1, k) {//     printf("T(%d) = \n", c);//     for (int v : T[c]) {//         printf("%d ", v);//     }//     printf("\n");// }
}

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

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

相关文章

Object

Object 类是 Java 中的顶级父类, 所有的类都直接或间接继承于 Object 类. Object 类中的方法可以被所有子类访问. Object 类没有成员变量, 所以只有无参构造方法. Java 中, 子类的共性才会往父类中去抽取, 然而不可能有一个属性是所有类的共性, 所以在 Object 这个类中, 是没有…

Windows平台下安装与配置MySQL5.7

1.下载mysql安装文件 下载地址:https://downloads.mysql.com/archives/installer/2.安装与配置MySQL 双击打开,接受许可协议,点击下一步:选择自定义安装,点击下一步:选择要安装的产品,点击下一步:点击执行按钮:安装完成,点击下一步进入配置界面:配置界面继续点击下一…

C++ 逆向之常用字符集互转

在过往的编程过程中,常常会因为碰到字符集问题而头痛,而每次在进行字符集转换的时候,各种搜索网上文档,想找字符集转换的示例程序,但是都不尽人意,本篇文章的目的就是彻底解决之前编程过程中对字符集认识以及字符集转换之间似懂非懂、云里雾里的状态,并在文章结尾附上 A…

团队作业4——项目冲刺-1-第二篇

团队作业4——项目冲刺-1-第二篇这个作业属于哪个课程 <计科22级34班>这个作业要求在哪里 <作业要求>这个作业的目标 修改完善需求规格说明书、系统设计、Alpha任务分配计划、测试计划GitHub 链接 https://github.com/tangliweiwww/ChatGpt🍟一、团队 1.团队名称…

[Paper Reading] Fusing Monocular Images and Sparse IMU Signals for Real-time Human Motion Capture

目录名称TL;DRMethodLocal Pose EstimationRNN-P1RNN-P2RNN-P3Global Translation EstimationRNN-T1RNN-T2RNN-T3Hidden State Feedback MechanismExperiment效果可视化总结与发散相关链接 名称 link 时间:23.09 作者与单位:主页: https://github.com/shaohua-pan/RobustCap…

HarmonyOS Next 入门实战 - 创建项目、主题适配

​开发一个简单的demo,其中涉及一些鸿蒙应用开发的知识点,其中涉及导航框架,常用组件,列表懒加载,动画,深色模式适配,关系型数据库等内容,在实践中学习和熟悉鸿蒙应用开发。 ​​ ​​ 首先下载并安装DevEco Studio开发环境,下载完成后按照提示安装即可,过程不在多说…

rust学习八、包和模块

总体上,也没有什么特别的地方,和其它语言比较起来。 我们可以看懂熟悉的字眼:包括、模块、use、公共等等 如果是英文,则需要知道crate、pub。 本章节对应相关书籍的第七章节. 一、一个rust可执行程序的大体结构 就本章节而言,尚未接触到一个非常复杂的工程结构,据说有什么…

starrycan的pwn学习记录1

一.Introducation 0x01 简介CTF 0x02 什么是pwn ”Pwn”是一个黑客语法的俚语词,是指攻破设备或者系统 。发音类似“砰”,对黑客而言这就是成功实施黑客攻击的声音--砰的一声,被“黑”的电脑或手机就被你操纵了。 CTF中的pwn CTF中的PWN主要是针对于二进制漏洞挖掘与利用,通…

计算机组成原理与操作系统 第二章 处理机组成与管理

目录1.CPU的功能和组成1.1CPU的四大功能1.2CPU的基本组成1.3 一条指令如何在CPU内运行2.指令系统2.1机器语言与指令2.1.1基本概念2.1.2一条指令一般应包含的信息2.1.3指令的类型与功能2.1.4寻址方式2.2指令格式的设计2.2.1基本概念2.2.2指令类型2.2.3操作码类型2.2.4指令设计2.…

UWB无线通信技术

UWB定位与通信技术标准第2章 UWB无线通信技术 UWB(超宽带)技术最早诞生于无线通信领域,该新兴技术一出现就备受关注UWB信号有着极大的带宽,其时间分辨率高、抗多径效应能力强,被认为是高速率短距离无线通信中具有很强竞争力的候选方案之一为此,本章寻根溯源,从UWB无线通…

极速启动,函数计算弹性降本能力再升级

本文将深入探讨函数计算如何通过技术革新实现提效降本,以及其在 AI 业务、数据处理和 Web 应用等多个领域的广泛应用。作者:墨飏 在数字化转型的大潮中,云计算成为推动创新和优化业务流程的关键力量。作为阿里巴巴集团的核心产品之一,函数计算(Function Compute)引领着 S…

用函数实现模块化程序设计四

数组作为函数参数数组作为函数参数 调用有参函数时,需要提供实参,实参可以是常量、变量或表达式 数组元素的作用与变量相当,一般来说,凡是变量可以出现的地方,都可以用数组元素代替,因此,数组元素也可以用作函数实参,其用法与变量相同,向形参船体数组元素的值。此外,…