【題目描述】
有q次操作,每次操作是以下兩種:
1、 加入乙個數到集合中
2、 查詢,查詢當前數字與集合中的數字的最大異或值,最大and值,最大or值
【輸入格式】
第一行1個正整數q表示操作次數
接下來q行,每行2個數字,第乙個數字是操作序號op(1,2),第二個數字是x表示操作的數字
【輸出格式】
輸出查詢次數行,每行3個整數,空格隔開,分別表示最大異或值,最大and值,最大or值
【輸入樣例1】
51 2
1 32 4
1 52 7
【輸出樣例1】
7 0 7
5 5 7
【輸入樣例2】
101 194570
1 202332
1 802413
2 234800
1 1011194
2 1021030
2 715144
2 720841
1 7684
2 85165
【輸出樣例2】
1026909 201744 1032061
879724 984162 1048062
655316 682376 1043962
649621 683464 1048571
926039 85160 1011199
【備註】
對於%10的資料1<=q<=5000 對於另%10的資料保證 x<1024 對於另%40的資料保證1<=q<=100000 對於所有資料保證1<=q<=1000000,1<=x<=2^20 保證第乙個操作為1操作。
對於10%的資料,顯然暴力模擬即可,每一次詢問就掃一遍當前陣列並更新最大^,&,|值即可,複雜度o(q^2)。
對於20%的資料,在10%的基礎上標記出現過的的數,複雜度o(q*c)。
對於100%的資料,顯然異或可用 trie 樹解決,&和|顯然可以按位貪心,問題就是&時,若 x該位已為零,則既可以填1,又可以填0,於是只需要標記子集,預設填零即可,|時類似。
貼**:
#includeusing namespace std;
const int maxn=1<<20;
int le[maxn];
void markless(int x)
}int ask(int x)
printf("%d ",now&x);
now=0;
for(int i=19;~i;i--)
printf("%d\n",now|x);
} }return 0;
}
NOIP模擬題 位運算 生成樹
如約而至。願不辜負。說正事,不要因為寫得很快而沾沾自喜,對拍要快快快一點啊啊啊!然後推的時候要用變數代替樣例資料,同時一定!要自己出資料。還有,一定要在思路理清楚以後認真檢查一次程式的邏輯關係,是否能達到要求,尤其是常數的使用。靜態差錯一!定!要!認真看每一句,清醒一點呀喂!現在腦子不太好使,很容易...
NOIP模擬題 「與」(位運算)
因為是與運算,所以我們可以貪心地每次找最高位的,將他們加入到新的序列中,然後每一次在這個新的序列繼續找下乙個位。然後最後序列中任意兩個的與運算的值都是一樣的且是最大的。include include include include include include include include in...
opencv 按位運算
1.按位與 cv.bitwise and dst cv.bitwise and scr1 scr2 dst mask scr1 輸入陣列1 scr2 輸入陣列2 dst 輸入陣列 與輸入陣列形狀和型別相同 mask 可選引數 8 位單通道陣列 用於指定要更改的元素位置 dst 目標影象 dst i ...