[IOI 1998 / USACO2.2] 派对灯 Party Lamps 题解 + bitset浅谈

现在有这些按钮:

  • 按钮 \(1\):当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮;
  • 按钮 \(2\):当按下此按钮,将改变所有奇数号的灯;
  • 按钮 \(3\):当按下此按钮,将改变所有偶数号的灯;
  • 按钮 \(4\):当按下此按钮,将改变所有序号是 \(3k+1 \ (k \in [0,+\infty) \cap \mathbb Z)\) 的灯。例如:\(1,4,7,10 \dots\)

同时告诉你 \(n\) 的大小,以及按按钮的次数 \(c\) 和某些点的状态,求最后有几种情况。

题解

注意到只有 \(0,1\) 两种状态,考虑使用 \(bitset\)

bitset

可以看作是一个二进制数,且支持以下几种操作:
reset()清零一个 \(bitset\),及将其中每一位设置为 \(0\)
set()\(bitset\) 的每一位设置为 \(1\)
test(i)返回 \(bitset\) 内第 \(i\) 位的值(从零开始,其实像数组一样直接用下标访问也可以)
any()返回 \(bitset\) 内是否有元素的值为 \(1\)
none()any()相对,如果元素全部为 \(0\) 则返回 \(1\),否则返回 \(0\)
count()计算 \(bitset\) 内元素值为 \(1\) 的元素个数(求 \(0\) 的个数直接用长度减去它就好了)。
flip()\(bitset\) 内的所有元素翻转,相当于按位取反(也就是 \(\sim\))。
好的以上就是 \(bitset\) 的所有操作。
\(bitset\) 的每一位只占一个 \(bit\),空间比桶更优。

实现所有按钮

现在让我们回到题目,根据题意以下就是所有按钮的实现:

点击查看代码
bitset<100> bottom1(bitset<100> b){b.flip();return b;
}
bitset<100> bottom2(bitset<100> b){for(int i=1;i<=n;i+=2){b.flip(i-1);}return b;
}
bitset<100> bottom3(bitset<100> b){for(int i=2;i<=n;i+=2){b.flip(i-1);}return b;
}
bitset<100> bottom4(bitset<100> b){for(int i=0;3*i+1<=n;i++){b.flip(3*i);}return b;
}

为了判定最后的结果是否符合要求,我们需要下面这个函数,而答案要从小到大排序,我们还需要一个大小比较函数(\(bitset\) 不能直接比较):

点击查看代码
bool cmp(bitset<100> A , bitset<100> B){for(int i=0;i<100;i++){if(A[i]<B[i])return true;if(A[i]>B[i])return false;}return false;
}
bool check(bitset<100> tmp){for(int i=0;i<n;i++){if(tmp[i]==0&&light[i+1]==1)return false;if(tmp[i]==1&&light[i+1]==-1)return false;}return true;
}

每个按钮的性质

注意到任意一个按钮按两次就相当于没按,白白浪费了两次按按钮的机会(看作总共 \(c\) 次)。
手玩一下(假设总共 \(10\) 个灯,操作序列:\(bottom1,bottom2,bottom1\)):

初始状态:1111111111
bottom1:0000000000
bottom2:1010101010
bottom1:0101010101

而把两个 \(bottom1\) 抵消之后的操作:

初始状态:1111111111
bottom2:0101010101

结果完全一致,证明的我们的假设是对的。

解法

现在就很好解了,列出每个按钮最多一次的所有可能操作序列,然后判断 \(c\) 减去这个次数是否为 \(2\) 的倍数,如果可以,说明这个有可能是答案之一。
主函数部分:

点击查看代码
if(c%2==0){if(check(first))ans[++len] = first;}if(c>=1&&(c-1)%2==0){if(check(bottom1(first)))ans[++len] = bottom1(first);if(check(bottom2(first)))ans[++len] = bottom2(first);if(check(bottom3(first)))ans[++len] = bottom3(first);if(check(bottom4(first)))ans[++len] = bottom4(first);}if(c>=2&&(c-2)%2==0){if(check(bottom1(bottom2(first))))ans[++len] = bottom1(bottom2(first));if(check(bottom1(bottom3(first))))ans[++len] = bottom1(bottom3(first));if(check(bottom1(bottom4(first))))ans[++len] = bottom1(bottom4(first));if(check(bottom2(bottom3(first))))ans[++len] = bottom2(bottom3(first));if(check(bottom2(bottom4(first))))ans[++len] = bottom2(bottom4(first));if(check(bottom3(bottom4(first))))ans[++len] = bottom3(bottom4(first));}if(c>=3&&(c-3)%2==0){if(check(bottom1(bottom2(bottom3(first)))))ans[++len] = bottom1(bottom2(bottom3(first)));if(check(bottom1(bottom2(bottom4(first)))))ans[++len] = bottom1(bottom2(bottom4(first)));if(check(bottom1(bottom3(bottom4(first)))))ans[++len] = bottom1(bottom3(bottom4(first)));if(check(bottom2(bottom3(bottom4(first)))))ans[++len] = bottom2(bottom3(bottom4(first)));}if(c>=4&&(c-4)%2==0){if(check(bottom1(bottom2(bottom3(bottom4(first))))))ans[++len] = bottom1(bottom2(bottom3(bottom4(first))));}sort(ans+1,ans+len+1,cmp);for(int i=1;i<=len;i++){for(int j=0;j<n;j++)cout << ans[i][j];cout << "\n";}if(len==0)cout << "IMPOSSIBLE";
一道 $bitset$ 简单题。

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

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

相关文章

解题报告-小 A 的树

小 A 的树 题目描述 小 A 有一棵 \(N\) 个点的树,每个点都有一个小于 \(2^{20}\) 的非负整数权值。现在小 A 从树中随机选择一个点 \(x\),再随机选择一个点 \(y\)(\(x\)、\(y\)可以是同一个点),并对从 \(x\) 到 \…

【React 状态管理深度解析:Object.is()、Hook 机制与 Vue 对比实践指南】 - 教程

【React 状态管理深度解析:Object.is()、Hook 机制与 Vue 对比实践指南】 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

2025 --【J+S 二十连测】-- 第一套 总结

总结 T1 考场上很快写出了正解,没有问题 T2 考场上很快写出了正解,但提交时交了两边,故0分 T3 考场上很快写出了正解,没有问题 T4 考场上很快写出了部分分,拿满了,没有问题 题解 T1 照题意模拟即可 代码 #includ…

详细介绍:分布式缓存的正确姿势:Cache-Aside、更新策略与分布式锁在 Java 微服务中的实战

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

企业网站建设的文章太原市做网站

AI的归纳和演绎法分别是什么&#xff1f; AI的归纳和演绎法是两种常见的推理方法。 归纳法&#xff08;inductive reasoning&#xff09;是一种从特殊到一般的过程&#xff0c;在有限的实例观察中得出一般规律或原则。用简单的说法&#xff0c;就是从一些具体的事物或情况中总…

做网站大彩票网站开发搭建

《绝地求生》PCL秋季赛的战斗已经全部落下帷幕了&#xff0c;Team Razer 雷蛇战队成员&#xff0c;国内最具人气的4AM战队凭借着在季后赛的出色发挥&#xff0c;以316分的高分碾压全场&#xff0c;成功斩获本次PCL秋季赛的冠军&#xff0c;成为PCL联赛首个双冠队伍。随着金色的…

个人网站建设服务器aaa云主机怎么做网站

1、基本操作 1.1、进入HBase客户端命令行 前提是先启动hadoop集群和zookeeper集群。 bin/hbase shell 1.2、查看帮助命令 helphelp 查看指定命令的语法规则 查看 list_namespace 的用法&#xff08;‘记得加单引号’&#xff09; help list_namespace 2、namespace 我们…

信阳市网站建设自己做服装搭配的网站

Docker Compose是一种流行的技术&#xff0c;可以用来定义和管理你的应用程序所需的多个服务容器。通常在你的应用程序旁边创建一个 compose.yml 文件&#xff0c;它定义和配置服务容器。 使用 Docker Compose 的典型工作流程是运行 docker compose up&#xff0c;用它连接启动…

网站建设优化服务方案模板西安商城网站建设

前言 spring作为主流的 Java Web 开发的开源框架&#xff0c;是Java 世界最为成功的框架&#xff0c;持续不断深入认识spring框架是Java程序员不变的追求。 本篇博客介绍SpringBootApplicant注解的自动加载相关内容 其他相关的Spring博客文章列表如下&#xff1a; Spring基…

【实验报告】华东理工大学随机信号处理实验报告 - 详解

【实验报告】华东理工大学随机信号处理实验报告 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

网站建设都包含哪些内容wordpress 更新网站

print() 在控制台输出 input() 获取控制台输⼊的内容 type() 获取变量的数据类型 len() 获取容器的⻓度 (元素的个数) range() ⽣成⼀个序列[0, n) 以上都是我们学过的函数&#xff0c;函数可以实现⼀个特定的功能。我们将学习⾃⼰如何定义函数, 实现特定的功能。 1.函数是什么…

页面置换算法

最佳置换算法opt 类似于cache 每次选择淘汰的页面将是以后永不使用的,或者在最长时间不会被访问的页面,这样可以保证最低的缺页率 缺页时未必发生页面置换,若还有可用的空闲内存块,就不用进行页面置换 缺页率=缺页…

Docker部署配置全流程(超详细——Windows和Linux) - 指南

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

推进电子设计革新:仿真(Emulation)如何引领下一代验证方式

在 IC 设计领域,硬件仿真(也称 FPGA 原型验证)已经跃升为不可或缺的关键技术。它以近乎真实硬件的形式重构目标设计,帮助工程师在硅片制造前进行高精度验证,为安全性、性能与功能保驾护航。1、为什么硬件仿真如此…

佛山网站建设兼职小型企业网站如何建设

为什么游戏公司选择物理服务器 1、选择的自由 选择游戏物理服务器可让我们根据需要自由选择和配置硬件。在完成设置和配置新获得的游戏服务器的所有艰苦工作后&#xff0c;请始终查看我们获得的价格&#xff0c;以确保自己拥有足够的带宽资源、端口容量和CPU核心&#xff0c;以…

AT_abc309_g [ABC309G] Ban Permutation

做这种排列计数题不是很明白. 首先考虑 \(x\) 很小,但它范围是扣掉一段区间,很不好. 我们容斥 \(j\) 个位置不满足条件去 DP,每次状压 \([i - x + 1, i + x - 1]\) 里数的用的情况即可,需要注意开头结尾的时候填不满.

在Mac上运行Windows 365的完整指南

本文详细介绍如何在Mac设备上部署和运行Windows 365云电脑,比较网页客户端与原生应用的功能差异,并逐步说明配置步骤和可用功能,包括多显示器支持和外围设备重定向等关键技术特性。如何在Mac上运行Windows 365 IT团…

完整教程:华为海思正式进入Wi-Fi FEM赛道?

完整教程:华为海思正式进入Wi-Fi FEM赛道?2025-10-03 09:26 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

现在做微信开发网站多少钱创新产品设计

只听名字的话会感觉对偶单纯形法和对偶问题关系很大&#xff0c;其实不然(想要了解对偶问题的话可以看我之前的文章)。对偶单纯形法在我看来和大M法以及两阶段法很像&#xff0c;都是用来补充纯粹的单纯形法无法解决特殊问题的缺陷。而且对偶单纯形法更加“强大”&#xff0c;因…

摩刻S10 动感单车 速度传感器故障及更换!

前段时间骑行过程中发现仪表盘上速度偶尔为0,时间停止不走的情况。之后就完全为0,时间也不增长了。 之后询问官方客服人员说是速度传感器故障,需要更换,但需到官方制定店铺购买备件。 测试方式是在拆下的传感器接…