🌏博客主頁:PH_modest的博客主頁
🚩當前專欄:每日一題
💌其他專欄:
🔴 每日反芻
🟡 C++跬步積累
🟢 C語言跬步積累
🌈座右銘:廣積糧,緩稱王!
一.題目描述
題目大意:
塞浦路斯的天氣非常炎熱。因此,Theofanis 將此視為創建一家冰淇淋公司的契機。
他把冰淇淋鎖在大儲藏室里,防止其他冰淇淋生產商進入。然而,他忘記了密碼。幸運的是,這把鎖對健忘的人有特殊的功能!
要打開這把鎖,你需要找到一個由 n n n 個元素組成的數組 a a a :
- KaTeX parse error: Expected 'EOF', got '&' at position 11: 0 \le a_i &?lt; 2^{30} 和
- M i , j = a i ∣ a j M_{i,j} = a_i | a_j Mi,j?=ai?∣aj? 對于所有 i ≠ j i \neq j i=j ,其中 ∣ | ∣ 表示 bitwise OR 運算。
這個鎖有一個 bug,有時它會給出沒有任何解的表格。在這種情況下,冰激凌將永遠保持冰凍狀態。
你能找到一個數組來打開鎖嗎?
題目鏈接:
B. StORage room(Codeforces Round 912 (Div. 2))
二.思路分析
- 首先需要知道 | 操作符的特點:只有兩個數對應位上都是0時,結果的對應才是0,否則是1
- 所以我們可以假設xi為0x7fffffff(每一位上都是1),然后用這個數與結果進行&操作,操作結束之后,就會把肯定是0的位上的1變成0(覺得難理解的可以試著用樣例模擬一下)
三.代碼展示
//https://codeforces.com/contest/1903/problem/B
//兩個數|,如果結果的某一位為0,那么這兩個數對應的位也為0
//
#include<iostream>
#include<algorithm>
#include<string>
#include<deque>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
#define int long long
using namespace std;int s[2000][2000];
int v[200020];
void solve()
{memset(v,0x7fffffff,sizeof(v));int n;cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>s[i][j];}}for(int i=0;i<n;i++){for(int j=0;j<i;j++){v[i]&=s[i][j];}for(int j=i+1;j<n;j++){v[i]&=s[i][j];}}int flag=1;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i!=j&&(v[i]|v[j])!=s[i][j]){flag=0;break;}}if(flag==0){break;}}if(flag==0){cout<<"NO"<<"\n";}else if(n==1){cout<<"Yes"<<"\n";cout<<"1"<<"\n";}else{cout<<"Yes"<<"\n";for(int i=0;i<n;i++){cout<<v[i]<<" ";}cout<<"\n";}
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){solve();}return 0;
}
最后:
每日一題系列旨在養成刷題的習慣,所以對代碼的解釋并不會特別詳細,但足夠引導大家寫出來,選的題目都不會特別難,但也不是特別簡單,比較考驗大家的基礎和應用能力,我希望能夠將這個系列一直寫下去,也希望大家能夠和我一起堅持每天寫代碼。
之后每個星期都會不定期更新codeforces和atcoder上的題目,想要學習算法的友友們千萬別錯過了,有什么疑問歡迎大家在評論區留言或者私信博主!
在這里送大家一句話:廣積糧,緩稱王!