NOIP模擬 位運算(trie樹 按位貪心)

2021-08-25 08:41:46 字數 1322 閱讀 9057

【題目描述】

有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 ...