日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

踩不出足迹(牛客练习赛88 )

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 踩不出足迹(牛客练习赛88 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

踩不出足跡(牛客練習賽88 )

題意:

長度為n的數組a,每個數是一個k位二進制
定義一下操作:
令第一次得到的結果為 a1a_1a1?。你需要從第二個數開始,每次可以選擇與上一次得到的結果異或或者同或起來。
問最大值是多少?

題集:

隊友盲猜結論正確,orz
考慮異或和同或的性質,異或和同或都是具有交換律的,可以任意調換順序。同或運算相當于和另一個數取反異或起來
所以有:a??b=?a?b,?a??b=a?ba?? b=?a? b,?a ??b=a?ba??b=?a?b,?a??b=a?b
也就是如果我們有若干同或操作,其實就是將這個數取反再異或。那就是若干個數取反后異或起來。根據上面寫的等式,兩個取反排在一起可以消除這兩個取反符號,那也就是最后有可能只剩一個取反,或者一個也沒有。又因為交換律,我們將取反符號轉移到最后一個數上。所以答案就是所有數異或和,或者前n-1個數異或,最后一個數同或
同或的操作就是與k位1異或,但是注意k<=64,如果直接1<<64再減1,ull也頂不住,可以通過1<<63+1<<63+1來實現
longlong范圍:[?263,263?1][-2^{63},2^{63}-1][?263,263?1]
ull范圍:[0,264?1][0,2^{64}-1][0,264?1]

代碼:

// Problem: 踩不出足跡 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/11178/C // Memory Limit: 1048576 MB // Time Limit: 2000 ms // By Jozky#include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b); using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> PII; clock_t startTime, endTime; //Fe~Jozky const ll INF_ll= 1e18; const int INF_int= 0x3f3f3f3f; void read(){}; template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar) {x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...); } template <typename T> inline void write(T x) {if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0'); } void rd_test() { #ifdef ONLINE_JUDGE #elsestartTime= clock();freopen("data.in", "r", stdin); #endif } void Time_test() { #ifdef ONLINE_JUDGE #elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); #endif } const int maxn= 1e6 + 9; ull a[maxn]; int main() {//rd_test();int n, k;cin >> n >> k;for (int i= 1; i <= n; i++) {cin >> a[i];}ull num= 0;for (int i= 1; i <= n; i++) {num= num ^ a[i];}// cout << num << endl;ull ans= max(num, ((num) ^ ((1ull << (k-1)) + ((1ull << (k-1))-1ull))));cout << ans;//Time_test(); }

總結

以上是生活随笔為你收集整理的踩不出足迹(牛客练习赛88 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。