位運算實戰:數值構造終極優化

位運算優化實戰:數值構造問題詳解

今天我們將深入分析一個有趣的位運算優化問題,這個問題展示了如何通過巧妙的預處理和貪心算法來高效解決數值構造問題。

問題背景與定義

給定一個初始值x(0 ≤ x ≤ m)和一系列位運算操作(AND/OR/XOR),我們需要找到一個x,使得經過這些運算后的結果最大。

具體問題描述:

  • 輸入

    • 整數n(操作數量,1 ≤ n ≤ 10^5)
    • 整數m(上限值,0 ≤ m ≤ 10^9)
    • 接下來n行:每行一個操作符("AND"、"OR"或"XOR")和一個操作數v(0 ≤ v ≤ 10^9)
  • 輸出

    • 經過所有操作后能得到的最大結果值

核心解題思路

預處理極端情況

極端值分析原理:

位運算的一個重要特性是其結果只取決于當前位的狀態。對于32位整數的每一位(從第0位到第31位),我們只需要考慮初始為0或1兩種情況即可確定最終結果。

bitset存儲策略:

使用兩個32位的bitset:

  • z:記錄初始全0經過所有操作后的結果
  • o:記錄初始全1經過所有操作后的結果
操作處理邏輯:

每個操作同時應用于兩種極端情況:

if(op == "AND") {z &= v;  // 初始0 AND vo &= v;  // 初始1 AND v
} 
else if(op == "OR") {z |= v;  // 初始0 OR vo |= v;  // 初始1 OR v
} 
else {  // XORz ^= v;  // 初始0 XOR vo ^= v;  // 初始1 XOR v
}

貪心構造算法

高位優先原則:

從最高位(第30位,因為第31位是符號位)開始向低位處理,優先設置高位為1能帶來更大的數值增益。

構造決策條件:

對于每一位i:

  1. 如果z[i]為1:無論x的該位是0還是1,結果都為1,直接設置
  2. 如果o[i]為1且不超過m:需要x的該位為1才能得到1
  3. 其他情況:該位保持0
邊界檢查機制:

使用sum變量追蹤當前已設置的位值總和,確保sum + (1<<i) ≤ m才設置該位。

代碼深度解析

#include <bits/stdc++.h>
using namespace std;int n, m, v;
string op;
bitset<32> z, o;  // z記錄全0經過操作后的結果,o記錄全1經過操作后的結果int main() {cin >> n >> m;z.reset();  // 初始化為全0(二進制000...0)o.set();    // 初始化為全1(二進制111...1)// 預處理階段:處理n個操作while(n--) {cin >> op >> v;if(op == "AND") z &= v, o &= v;else if(op == "OR") z |= v, o |= v;else z ^= v, o ^= v;  // XOR操作}// 構造階段:從高位到低位貪心構造int ans = 0, sum = 0;for(int i = 30; i >= 0; i--) {  // 從高位到低位處理if(z[i]) {ans += (1 << i);  // 無條件設置該位}else if(o[i] && sum + (1 << i) <= m) {  // 有條件設置該位ans += (1 << i);sum += (1 << i);  // 更新已使用數值}// 否則該位保持0}cout << ans << endl;return 0;
}

關鍵點詳細說明

bitset的使用技巧

位數選擇:

32位足夠處理大多數整數問題(2^31-1約21億),對于更大的數值,可以擴展bitset位數。

初始化方法:
  • reset():將所有位設為0(二進制000...0)
  • set():將所有位設為1(二進制111...1)

操作處理細節

AND操作:
  • 示例:
    • 初始0 AND 1 → 0
    • 初始1 AND 1 → 1
  • 特性:只有操作數對應位為1時才能保留原值(類似邏輯與)
OR操作:
  • 示例:
    • 初始0 OR 1 → 1
    • 初始1 OR 1 → 1
  • 特性:操作數對應位為1時將強制結果為1(類似邏輯或)
XOR操作:
  • 示例:
    • 初始0 XOR 1 → 1
    • 初始1 XOR 1 → 0
  • 特性:操作數對應位為1時將翻轉原值(類似邏輯異或)

貪心策略的數學基礎

位權值原理:

高位貢獻的數值是低位的2倍,例如:

  • 第5位1 = 32(2^5)
  • 而0-4位全1 = 31(2^0 + 2^1 + 2^2 + 2^3 + 2^4)
決策優先級:
  1. 無條件設置(z[i]=1)優先于有條件設置
  2. 即使有條件設置可能影響后續決策,高位優先仍是最優策略

復雜度分析

時間復雜度:

  • 預處理階段:O(n) —— 每個操作處理時間是常數
  • 構造階段:O(32) —— 固定32次循環
  • 總復雜度:O(n + 32) ≈ O(n)

空間復雜度:

O(1) —— 僅使用固定大小的bitset(32位×2),不隨輸入規模n增長而變化

實際應用場景

密碼學應用:

  • 設計最優位掩碼來最大化加密效果
  • 例如:構造最有效的密鑰變換序列

硬件設計:

  • 優化邏輯門組合電路
  • 尋找輸入信號的最優初始配置

算法競賽:

  • 位運算相關的優化問題
  • 數值構造類題目(如Codeforces、LeetCode中的相關問題)

數據壓縮:

  • 設計最優的位操作序列來最大化壓縮率
  • 在有限修改權限下獲得最佳結果

擴展思考

這種技術還可以應用于:

  • 網絡協議中的標志位優化
  • 圖形處理中的像素混合操作
  • 人工智能中的特征選擇問題
  • 數據庫查詢優化器的位索引設計

希望這篇詳細解析能幫助你深入理解位運算優化的精妙之處,并在實際問題中靈活應用這些技巧!

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86974.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86974.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nosql項目:基于 Redis 哨兵模式的鮮花預訂配送系統

1 鮮花預訂配送系統概述 1.1 項目背景 鮮花預訂系統是一個實時處理用戶訂單、庫存管理和配送跟蹤的平臺。系統需要處理大量并發訂單&#xff0c;實時更新鮮花庫存狀態&#xff0c;并跟蹤配送進度。傳統關系型數據庫難以應對高并發的訂單處理和實時庫存更新需求&#xff0c;因…

中心效應:多中心臨床試驗的關鍵考量

一、中心效應的來源與影響 1.1 常見來源 1.1.1 患者異質性 中心間基線特征差異(如疾病嚴重度、合并癥比例) 1.1.2 操作差異 給藥規范(如輸液速度)、隨訪依從性、數據記錄質量 1.1.3 評估偏倚 影像學判讀標準(如RECIST)、實驗室檢測方法(如中心實驗室 vs 本地實驗室) …

Redis 實現消息隊列

一、為什么選擇 Redis 作為消息隊列&#xff1f; 在分布式系統架構中&#xff0c;消息隊列是實現異步通信和解耦的核心組件。Redis 作為一個高性能的內存數據庫&#xff0c;憑借其卓越的速度和豐富的數據結構&#xff0c;成為輕量級消息隊列的理想選擇&#xff1a; 1.1 核心優…

(3)pytest的setup/teardown

1. 簡介 學過unittest的都知道里面用前置和后置setup和teardown非常好用&#xff0c;在每次用例開始前和結束后都去執行一次。 當然還有更高級一點的setupClass和teardownClass&#xff0c;需配合classmethod裝飾器一起使用&#xff0c;在做selenium自動化的時候&#xff0c;它…

Starrocks存算一體和存算分離

網上整理了一下starrocks兩種部署方式的區別差異性&#xff0c;個人感覺生產環境還是盡量存算分離部署&#xff0c;防止資源爭奪等問題影響線上生產數據&#xff0c;雖然存算一體部署起來更方便一些 &#x1f4ca; 1. 架構設計 存算一體&#xff1a; 節點類型&#xff1a;僅包含…

多線程編程 ----線程主動退出pthread_exit與線程被動退出pthread_cancel

主動退出 pthread_exit 與 pthread_cancel 的區別 1. 核心區別 特性pthread_exitpthread_cancel調用者線程自身調用&#xff0c;主動退出。其他線程調用&#xff0c;異步請求終止目標線程。行為方式立即終止線程&#xff0c;資源需手動釋放。發送取消請求&#xff0c;線程在取…

電腦開機加速工具,優化啟動項管理

軟件介紹 今天為大家推薦一款專業的電腦啟動項管理工具&#xff0c;這款軟件能有效優化電腦開機速度&#xff0c;幫助用戶管理開機自啟動程序。 使用方式 軟件無需安裝&#xff0c;以管理員身份直接雙擊運行即可使用。為確保安全&#xff0c;軟件特別設計為不添加注冊表…

設備管理的11個指標、七大誤區、六大特征

1、設備的完好率 在這些指標里用得最多,但其對管理的促進作用有限。所謂的完好率,是在檢查期間,完好設備與設備總臺數的比例(設備完好率=完好設備數/設備總數)很多工廠的指標可以達到95%以上。理由很簡單,在檢查的那一刻,如果設備是運轉的,沒出故障,就算是完好的,于…

11OAuth2

目錄 本節大綱 一、OAuth2 簡介 二、OAuth2 授權總體流程 三、四種授權模式 授權碼模式 簡化模式 密碼模式 客戶端模式 四、OAuth2 標準接口 五、GitHub 授權登錄 1. 創建 OAuth 應用 2. 項目開發 六、Spring Security OAuth2 七、授權、資源服務器 1. 授權服務器…

Github Copilot協助解決cucumber插件不支持async/await

一、提示詞 問題描述 在使用了badeball/cypress-cucumber-preprocessor插件后&#xff0c;存在不支持nodejs原生的promise和async/await語法問題 執行用例命令 npx cypress run --env configFilemhesi-staging,TAGS"API005" --spec "cypress/integration/AL…

C++多線程【Linux】

Linux的多線程 Linux的子線程實際上也是個進程&#xff0c;但是比傳統的進程輕量化。 pthread pthread是用于Linux系統下的線程庫&#xff0c;頭文件是<pthread.h>。C11 之前的多線程開發高度依賴平臺原生 API&#xff0c;Windows 以 CreateThread 和內核對象為核心&am…

Windows 環境下 NVM 命令詳解:多版本 Node.js 管理利器

“一個 Node.js 版本走天下&#xff1f;太局限了&#xff01;試試 nvm&#xff0c;版本切換如絲般順滑。” 什么是 NVM NVM&#xff08;Node Version Manager&#xff09;是一個命令行工具&#xff0c;允許你安裝并在多個 Node.js 版本之間自由切換。 在 Linux/macOS 下常用的…

一二級路由之間的傳參方式以及高亮問題

實現如下圖所示的一二級路由的高亮情況&#xff1a; 在一級路由APP.vue下設置&#xff1a; .head a.router-link-active {background-color: rgb(235, 221, 204); }在二級路由Mycenter.vue下設置&#xff1a; /* 要求在點擊跳轉到mycenter_lianxi頁面時候父路由保持高亮…

前端JavaScript力扣HOT100刷題【51-100】

注&#xff1a;純手打&#xff0c;如有錯誤歡迎評論區交流&#xff01; 轉載請注明出處&#xff1a;https://blog.csdn.net/testleaf/article/details/148953015 編寫此文是為了更好地學習前端知識&#xff0c;如果損害了有關人的利益&#xff0c;請聯系刪除&#xff01; 本文章…

智能制造數字孿生集成交付生態鏈:智慧產線極速克隆,孿生重構生產周期

在智能制造的浪潮中&#xff0c;數字孿生技術正以前所未有的速度重塑制造業的生產模式。從產品設計到生產制造&#xff0c;再到運維管理&#xff0c;數字孿生通過構建物理世界的虛擬鏡像&#xff0c;實現了生產全流程的數字化映射與優化。 山東融谷信息以“智能制造數字孿生集成…

非常詳細版: dd.device.geolocation 釘釘微應用獲取定位,移動端 PC端都操作,Vue實現釘釘微應用獲取精準定位并渲染在地圖組件上

dd.device.geolocation 釘釘微應用獲取定位,釘釘微應用獲取精準定位并渲染在地圖組件上 ,手機端 PC端要都可用 【dd.device.geolocation是需要鑒權的哦】 想要的數據和效果圖 想要的數據格式 代碼 <template><div class="dialogStyles"

鴻蒙5:組件狀態共享

目錄 1. 組件狀態共享 1.1 狀態共享-父子傳值&#xff1a;Local、Param、Event 1.2 狀態共享-父子雙向綁定!! 1.3 跨代共享&#xff1a;Provider和Consumer 1.3.1 aliasName和屬性名 1.3.2 實現跨代共享 1.3.3 裝飾復雜類型&#xff0c;配合Trace一起使用 1.3.4 支持共…

【MySQL】12. C語言與數據庫的連接

1. 下載MySQL的連接庫 sudo apt install -y libmysqlclient-dev 2. MySQL連接庫的常用接口介紹 通過下面的樣例了解MYSQL的常用接口&#xff1a; #include <iostream> #include <mysql/mysql.h> using namespace std;const char *host "localhost";…

[springboot系列] 探秘JUnit 5: Java單元測試利器

介紹 JUnit 5 是一個用于 Java 編程語言的單元測試框架&#xff0c;它是 JUnit 框架的第五個版本&#xff0c;與 JUnit 4 相比&#xff0c;JUnit 5 提供了許多改進和新特性&#xff0c;包括更好的擴展性、靈活性和對現代 Java 特性的支持。 JUnit 5 由三個主要的子模塊組成&a…

開源 java android app 開發(十三)繪圖定義控件、搖桿控件的制作

文章的目的為了記錄使用java 進行android app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 java an…