邪修卡常:动态bitset 由于 std::bitset 仅支持编译期固定大小无法动态确定长度这使得某些 ∑≤ 的多测题中使用 std::bitset 超时。于是我让 AI 生成了一份比赛中可用的动态bitset模版并且测试了其在部分板题里的性能。实现cpp#include iostream #include vector #include cstdint using namespace std; using u64 uint64_t; struct dynamic_bitset { int n; std::vectoru64 b; dynamic_bitset(int _n 0) : n(_n), b((_n 63) 6, 0) {} void resize(int new_n) { if (new_n n) return; b.resize((new_n 63) 6, 0); // 新块自动置零 n new_n; clean_tail(); } // 读取某一位只读不抛异常 bool operator[](int pos) const { return (b[pos 6] (pos 63)) 1; } // 设置某一位 void set(int pos, bool val true) { if (val) b[pos 6] | 1ULL (pos 63); else b[pos 6] ~(1ULL (pos 63)); } // 置零某一位 void reset(int pos) { b[pos 6] ~(1ULL (pos 63)); } // 翻转某一位 void flip(int pos) { b[pos 6] ^ 1ULL (pos 63); } // 位运算 dynamic_bitset operator(const dynamic_bitset rhs) { for (size_t i 0; i b.size(); i) b[i] rhs.b[i]; return *this; } dynamic_bitset operator|(const dynamic_bitset rhs) { for (size_t i 0; i b.size(); i) b[i] | rhs.b[i]; return *this; } dynamic_bitset operator^(const dynamic_bitset rhs) { for (size_t i 0; i b.size(); i) b[i] ^ rhs.b[i]; return *this; } dynamic_bitset operator~() const { dynamic_bitset res *this; for (auto x : res.b) x ~x; res.clean_tail(); return res; } // 1 的个数 int count() const { int ans 0; for (auto x : b) ans __builtin_popcountll(x); return ans; } // 清除尾部多余位 void clean_tail() { if (n 0) return; int rem n 63; if (rem) b.back() (1ULL rem) - 1; } }; // 非成员二元运算符方便书写 inline dynamic_bitset operator(dynamic_bitset a, const dynamic_bitset b) { return a b; } inline dynamic_bitset operator|(dynamic_bitset a, const dynamic_bitset b) { return a | b; } inline dynamic_bitset operator^(dynamic_bitset a, const dynamic_bitset b) { return a ^ b; }使用范例cppint main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); dynamic_bitset a(10),b; b.resize(10); a.set(1), a.set(2); b.flip(0); dynamic_bitset c(a|b); cout c.count() endl; return 0; }与 std::bitset 的区别不支持左移/右移[]只读无法通过 bit[0] 1 来置位。置位只能使用 set 和 reset 函数不支持 any、all 等函数这些也没什么必要输出不与 cout 兼容只能逐位遍历不支持转化整数和字符串与 std::bitset 的性能对比【模板】传递闭包std::bitset动态bitset[PA 2025] 集合 1 / Zbiory 1std::bitset动态bitset可以看到与 std::bitset 的性能差距还是比较明显。但是作为一种走投无路下的卡常手段动态bitset已经足够了。如果再追求优化可以考虑上 SIMD 指令集由于比赛中不确定是否能够使用这里不太推荐。

相关新闻

最新新闻

Java高并发底层原理(七)volatile 到底解决了什么问题

Java高并发底层原理(七)volatile 到底解决了什么问题

缓存一致性协议能够协调多个 CPU Core 对同一条 Cache Line 的读写,但 Java 程序仍然需要明确一件事:一个线程修改变量以后,另一个线程什么时候必须看到这个修改? volatile 就是 Java 提供的一种内存语义。它不负责把一段代码变成…

2026/7/7 16:07:50
【板子】kmp

【板子】kmp

#include <iostream> #include <string> #include <vector> using namespace std;// 求模式串p的next数组&#xff08;最长border&#xff09; vector<int> getNext(const string &p) {int n p.size();vector<int> next(n 1, 0); // next[…

2026/7/7 16:07:50
B站缓存视频格式转换:m4s-converter技术解析与实用指南

B站缓存视频格式转换:m4s-converter技术解析与实用指南

B站缓存视频格式转换&#xff1a;m4s-converter技术解析与实用指南 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 当你在B站缓存了珍贵的教学视…

2026/7/7 16:07:50
LTC6904与PIC32MX675F256L构建高精度方波发生器方案

LTC6904与PIC32MX675F256L构建高精度方波发生器方案

1. 项目背景与核心价值在嵌入式系统开发中&#xff0c;精确的时钟信号就像交响乐团的指挥棒&#xff0c;它决定了整个系统能否和谐运转。LTC6904这颗来自ADI的硅振荡器芯片&#xff0c;配合PIC32MX675F256L这款Microchip的32位微控制器&#xff0c;能够构建出精度高达0.5%的方波…

2026/7/7 16:07:50
控制系统串联校正 3 种方法对比:超前/滞后/滞后-超前适用场景与选择决策树

控制系统串联校正 3 种方法对比:超前/滞后/滞后-超前适用场景与选择决策树

控制系统串联校正方法实战指南&#xff1a;从理论到工程决策在工业自动化与机电系统设计中&#xff0c;控制系统的性能优化是一个永恒的话题。当我们面对一个响应迟缓、超调过大或稳态误差不达标的系统时&#xff0c;串联校正往往成为工程师的首选武器箱。不同于教科书上抽象的…

2026/7/7 16:07:50
高压安全隔离技术:ISOM8710与PIC18LF25K50应用解析

高压安全隔离技术:ISOM8710与PIC18LF25K50应用解析

1. 高压安全隔离技术背景与需求解析在工业控制和电力系统中&#xff0c;高压电路的安全隔离是一个至关重要的技术环节。传统的高压开关柜操作存在明显的安全隐患&#xff1a;当操作人员需要接触10kV及以上电压等级的电气设备时&#xff0c;即使设备已经断电&#xff0c;残余电荷…

2026/7/7 16:02:50

月新闻