CF578B Or Game(貪心)題解

2022-03-06 12:53:26 字數 562 閱讀 4812

現在有n個數\(a_1,a_2,a_3,...,a_n\) 。你最多可以進行k次操作,每次操作你可以將其中乙個數乘以\(x\),使得\(a_1|a_2|...|a_n\) 最大。

貪心+字首字尾

首先明確:答案的這\(k\)次\(\times x\)操作用都會在同乙個數身上。因為\(x\)大於\(2\),所以每次相乘都會使得該數的二進位制為至少左移一位,或起來以後必然會使答案更優。

如何快速求出每乙個數操作之後的答案?

利用字首字尾思想,維護字首或與字尾或,這樣就可以在列舉出修改的數以後\(o(1)\)求出答案了。

#include #include #define ll long long

using namespace std;

const int maxn = 2e5 + 10;

int n,a[maxn],k,x;

ll pre[maxn],bac[maxn],ans;

int main()

printf("%lld\n", ans);

return 0;

}