時間限制: 1 sec
記憶體限制: 128 mb
提交: 18
解決: 6 [
提交][
狀態][
討論版]
給出n個不超過m的非負整數,將數劃分成兩個集合,記為1號集合和2號集合。x1為1號集合中所有數的異或和,x2為2號集合中所有數的異或和。在最大化x1+x2的前提下,最小化x1。
第一行n
第二行n個非負整數
一行兩個數,第乙個數是x1,第二個數是x2
71 1 2 2 2 3 3
1 3對於 30%的資料,n<=10
對於 60%的資料,n<=1000
對於 100%的資料,n≤105,m≤1018
2018山東冬令營
賽後補了線性基的相關知識,發現自己還是跟sb一樣不太懂線性基,但是大概懂了線性基的乙個用法。
題解:先求出所有數的異或和。從高位向低位列舉,若這一位是0,則考慮在劃分集合的時候能否使每個集合中這兩個數都是1。再從高位向低位列舉,若這一位是1,則考慮能否讓x1的這一位是0。
劃分為兩個集合,相當於選出x1。列舉到一位時,要將所有這一位是1的數都異或乙個出現過的這一位是1的數。這樣保證剩下的數都小於當前列舉到的那一位,便於求解。(線性基)
我感覺是求出來乙個線性基,盡量讓那些大的都給x2,然後在給x1,就像上邊說的那樣如果0對應2個1這樣的是肯定跑不了的。
long long a[100005];
long long b[100];
long long ans;
long long x1,x2;
int n;
void solve()}}
if(!flag)
continue;
//如果沒找到上邊的那種情況
for(int j=63;j>=0;j--)//去尋找那種 ans是1的而且當前也是1的 存一下}}
}x1=0;
x2=0;
for(int j=63;j>=0;j--)//先去尋找那些 ans==0 而且x2當前第j位是0的 然後看下當前b[j]是否有數 有的話就加上}}
for(int i=63;i>=0;i--)
}x1=ans^x2;
}int main()
solve();
printf("%lld %lld\n",x1,x2);
return 0;
}
2018山東冬令營 中國石油大學 運動會II
時間限制 1 sec 記憶體限制 128 mb 提交 56 解決 19 提交 狀態 討論版 你打算舉辦一場運動會。有n個運動員和m個可供選擇的運動專案,你要從m個專案中選出乙個非空的子集。第i個運動員第j喜歡的專案是ai,j,每個運動員會且僅會參加你選出的專案中他最喜歡的乙個。你不希望參加某個專案的...
道路重建 2018山東冬令營
時間限制 1 sec 記憶體限制 128 mb 提交 67 解決 24 提交 狀態 討論版 小l的家鄉最近遭遇了一場洪水,城市變得面目全非,道路也都被沖毀了。生活還要繼續,於是市 決定重建城市中的道路。在洪水到來前,城市中共有n個區域和m條連線這些區域的雙向道路,道路連通了所有的區域,為了方便人們的...
位元組跳動冬令營2018
給定一棵有根樹,邊有邊權,兩個人輪流操作,每次可以把一條邊的權值減少一,權值變為 0 表示把子樹砍掉,問先手第一輪操作哪些邊使得自己必勝。n 1 06 n leq 10 6 n 10 6之前的部落格,發現這道題本質上是圖的刪邊遊戲。把環縮掉,就變成了樹上刪邊遊戲了。結論是 葉子的 sg 為 0,非葉...