洛谷 4310 絕世好題

2022-05-25 01:00:15 字數 1103 閱讀 8401

給定乙個長度為 \(n\) 的數列 \(a_i\),求 \(a_i\) 的子串行 \(b_i\) 的最長長度 \(k\),滿足 \(b_i \& b_ \ne 0\),其中 \(2\leq i\leq k\), $ &$ 表示位運算取與。

輸入檔案共 \(2\) 行。 第一行包括乙個整數 \(n\)。 第二行包括 \(n\) 個整數,第 \(i\) 個整數表示 \(a_i\)。

輸出檔案共一行。 包括乙個整數,表示子串行 \(b_i\) 的最長長度。

輸入 #1

3

1 2 3

輸出 #1

2
對於任意乙個數 \(b_i\) 要滿足條件 \(b_i\&b_ \ne 0\) ,\(namo\)

\(b_i\) 中存在二進位制為 \(1\) 的位置與 \(b_\) 中二進位制為 \(1\) 的位置存在交集

目前而言只知道 \(b_i\) 需要尋找交集,則就是去進行列舉每乙個位置,當 \(b_i\) 的這個位置二進位制為 \(1\) ,進行尋找最大值

\(b[i] = max(b[j]+1)\) 當 \(b_i\&b_j \ne 0\)

算到這裡時間複雜度是 \(o(n^2)\) ,需要進行優化,

\(namo\) 就是儲存一下記錄 \(i\) 最近的,當前位置的二進位制為 \(1\) 的位置。

也就是說使用乙個陣列 \(cnt\) ,\(cnt_j\) 表示距離當前位置最近並且 \(b_k\) 的第 \(j\) 的二進位制為 \(1\) 的位置

**

#include #include #include using namespace std;

typedef long long ll;

const int maxn = 1e5+55;

int cnt[80];

ll a[maxn];

int b[maxn];

int main()

} maxx=max(maxx,b[i]);

} printf("%d\n",maxx);

return 0;

}

luogu P4310 絕世好題

題面傳送門 這道d pdp dp還是比較水的 首先考慮設f if i fi 為以a ia i ai 結尾的最長長度,則向前迴圈列舉找到適合的轉移就可以了,時間複雜度o n 2 o n 2 o n2 估計80 8080 分正解也不是很難想,因為這是位運算,所以我們要找到位運算的性質,的性質就是兩個數至...

P4310 絕世好題

給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 輸入格式 輸入檔案共2行。第一行包括乙個整數n。第二行包括n個整數,第i個整數表示ai。輸出格式 輸出檔案共一行。包括乙個整數,表示子串行bi的最長長度。輸入樣例 1 3 1 2 3 輸出樣例 1 2 ...

P4310 絕世好題

題目描述 給定乙個長度為n的數列ai,求ai的子串行bi的最長長度,滿足bi bi 1 0 2 i len 說明對於100 的資料,1 n 100000,ai 10 9。錯誤日誌 沒搞清 每一位的dp值如何更新記錄陣列 乙個數 a 可以接在數 b 後面,當他們在二進位制下有相同位同為 1 時成立 這...