每日一題 7月3日精講 毒瘤xor

2022-05-05 14:12:09 字數 1806 閱讀 1285

【每日一題】7月3日精講—毒瘤xor

時間限制:c/c++

1秒,其他語言2秒

空間限制:c/c++

32768k,其他語言65536k

輸入描述:

第一行乙個整數n,表示序列的長度 第二行n個整數,表示序列內的元素 第三行乙個整數q,表示詢問的個數 接下來q行,每行兩個整數[l,

r],表示詢問的區間

輸出描述:

輸出q行,每行乙個整數表示答案

若有多組可行解,請輸出較小的解

示例1

輸入

複製

5478

12133

2514

33

輸出

2147483632

2147483635

2147483635

備註:

對於30

%的資料,n , q ≤ 10

對於60

%的資料,n , q ≤ 1000

對於100

%的資料,n, q ≤ 10^5

保證ai <2^

31

很久沒有遇到異或的題了

先講下異或:1 ^ 1 =0 , 0 ^ 0= 0,1 ^ 0 =1,0 ^ 1 =1

相同為0,不同為1

異或是兩個數二進位制狀態下相同數字進行操作

我們要找乙個x使得x ^ a[i]的和最大,那我們就盡量使x與a[i]的相同位數異或後為1,這樣就最大

a[i]是乙個陣列,所以我們就求這個陣列裡每個數的二進位制狀態下,每一位0和1的個數,比如說,陣列有n個數,其中b個數二進位制狀態下第一位是0,剩下n-b個數二進位制狀態下第一位是1,如果b>n-b,那我們就使x二進位制的第一位是1,(就是和最多情況的數呈相反,這樣異或出來才是1)

然後是第二位,依次類推最後我們就得到x的二進位制狀態,轉化成十進位制輸出即可

因為有多輪詢問,所以我們可以用字首和來處理每一位為1的數

bool w=

((a[i]

>>j)&1

);//判斷第j位是0是1

sum[i]

[j]=

(sum[i-1]

[j]+w)

;//字首和進行累加

#include

using

namespace std;

const

int maxn=

1e5+4;

typedef

long

long ll;

ll a[maxn]

;int sum[maxn][40

];intmain()

for(

int i=

1;i<=n;i++)}

int q;

cin>>q;

int tot=0;

while

(q--

) cout<

}}

每日一題 4月7日題目精講 樹

樹 時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k 其他語言262144k 64bit io format lld 題目描述 shy有一顆樹,樹有n個結點。有k種不同顏色的染料給樹染色。乙個染色方案是合法的,當且僅當對於所有相同顏色的點對 x,y x到y的路徑上的所有點的顏色...

每日一題 7月1日題目精講 借教室

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 在大學期間,經常需要租借教室。大到院系舉辦活動,小到學習小組自習討論,都需要向學校申請借教室。教室的大小功能不同,借教室人的身份不同,借教室的手續也不一樣。面對海量...

每日一題 5月7日題目精講 火 皇家烈焰

火 皇家烈焰 時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld帕秋莉掌握了一種火屬性魔法 由於鍾愛掃雷遊戲,帕秋莉把自己圖書館前的走廊看作乙個一維的掃雷地圖,她製造了很多烈焰,排在這條走廊內 現在帕秋莉告訴你一部分...