題目鏈結
題意:
給定乙個長度為 n 的非負整數序列 a[1..n],你需要求有多少個非負整數 s 滿足以下兩個條件:
(1).0 ≤ s
< 260
(2).對於所有 1 ≤ i
< n ,有 (a[i] xor s) ≤ (a[i+1] xor s)
思路:這個題目不是很難想,因為我們一看到異或啊啥的跟二進位制有關係的東西,都會去想它的每一位的01關係,這個是肯定的,
對大部分都適用。
那麼對於這個題目我們能想到的就是,要想ai^s<=ai+1 ^s,那麼對於ai和ai+1,從高位到低位,如果兩個數的二進位制相同,
那麼無論對s取什麼值,結果都是一樣的,對於二進位制不同的位,我們要想滿足等式的關係就必須使不同的這一位在ai+1中為1,
在ai中為0,否則不可能滿足條件.只要確定了這一位,其餘的不會影響結果.
所以我們只需要對每一對都找到二進位制不同的最高位使其滿足條件,如果矛盾,直接輸出0,不矛盾,最後的結果就是
2^x (x為沒有限制的位數)
#include#define ri(a) scanf("%d", &a)
#define rl(a) scanf("%lld", &a)
#define rf(a) scanf("%lf", &a)
#define rs(a) scanf("%s", a)
#define pi(a) printf("%d\n", (a))
#define pf(a) printf("%lf\n", (a))
#define pl(a) printf("%lld\n", (a))
#define ps(a) printf("%s\n", (a))
#define w(a) while(a--)
#define clr(a, b) memset(a, (b), sizeof(a))
#define mod 1000000007
#define inf 0x3f3f3f3f
#define exp 0.00000001
#define pii pair#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[111];
ll n;
int cnt[66];//記錄每一位的情況
int main()
{ rl(n);
clr(cnt,-1);
for(int i=1;i<=n;i++)
rl(a[i]);
for(int i=1;i=0;j--)
{ if((x^y)&(1ll<
HIHOCODER 1509 異或排序
給定乙個長度為 n 的非負整數序列 a 1.n 你需要求有多少個非負整數 s 滿足以下兩個條件 1 0 s 260 2 對於所有 1 i n 有 a i xor s a i 1 xor s 第一行乙個正整數 n 第二行 n 個非負整數表示序列 a 1.n 1 n 50 0 a i 260 乙個非負正...
hihocoder1693 逆序異或和
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 給定長度為n的序列a1,a2,an,求 其中xor是按位異或運算。第一行包含乙個整數n。第二行包含n個整數a1,a2,an。對於60 的資料,1 n 5000 對於100 的資料,1 n 100000,1 ai 100000 ...
hihoCoder挑戰賽28 A 異或排序
題目鏈結 題意 題解 每次找到相鄰兩個數的二進位制形式中 不同的最高位 顯然s在這一位必然是確定的 必須在這一位確定數字讓a i a i 1 至於更高位的,它們的數字是相同的,以及更低位的 它們都任意 因為要對於所有的i 1.n 1 都滿足要求 所以看看哪些位置最後是確定的 或者發生了牴觸 直接輸出...