因為是與運算,所以我們可以貪心地每次找最高位的,將他們加入到新的序列中,然後每一次在這個新的序列繼續找下乙個位。
然後最後序列中任意兩個的與運算的值都是一樣的且是最大的。
#include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long ll;
#define pii pair#define mkpii make_pair#define pdi pair#define mkpdi make_pair#define pli pair#define mkpli make_pair#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define cc(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b)
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const ll getint()
inline const int max(const int &a, const int &b)
inline const int min(const int &a, const int &b)
} printf("%d\n", a[1]&a[n]);
return 0;
}
題目描述:
給你乙個長度為n的序列a,請你求出一對ai,aj(1<=ips:「與」表示位運算and,在c++中表示為&。
輸入描述:
第一行為n。接下來n行,一行乙個數字表示ai。
輸出描述:
輸出最大的ai「與」aj的結果。
樣例輸入:
樣例輸出:
樣例解釋:
8 and 10 = 8
8 and 2 = 0
10 and 2 = 2
資料範圍:
20%的資料保證n<=5000
100%的資料保證 n<=3*10^5,0<=ai<=10^9
NOIP模擬題 位運算 生成樹
如約而至。願不辜負。說正事,不要因為寫得很快而沾沾自喜,對拍要快快快一點啊啊啊!然後推的時候要用變數代替樣例資料,同時一定!要自己出資料。還有,一定要在思路理清楚以後認真檢查一次程式的邏輯關係,是否能達到要求,尤其是常數的使用。靜態差錯一!定!要!認真看每一句,清醒一點呀喂!現在腦子不太好使,很容易...
NOIP模擬 位運算(trie樹 按位貪心)
題目描述 有q次操作,每次操作是以下兩種 1 加入乙個數到集合中 2 查詢,查詢當前數字與集合中的數字的最大異或值,最大and值,最大or值 輸入格式 第一行1個正整數q表示操作次數 接下來q行,每行2個數字,第乙個數字是操作序號op 1,2 第二個數字是x表示操作的數字 輸出格式 輸出查詢次數行,...
NOIP模擬題 連通
給定乙個無向圖,請編寫乙個程式實現以下兩種操作 1 d x y,從原圖中刪除連線x和y頂點的邊。2 q x y,詢問x和y頂點是否連通。這也是連通問題,考慮用並查集解決。但是這是刪除的問題耶,怎麼辦?考慮將刪除變為連通,能不能將所有操作給反過來,從最後乙個操作開始處理。當然是可以的。include ...