2018 山東冬令營 中國石油 劃分

2021-08-15 22:32:02 字數 1263 閱讀 3420

時間限制: 1 sec  

記憶體限制: 128 mb

提交: 18  

解決: 6 [

提交][

狀態][

討論版]

給出n個不超過m的非負整數,將數劃分成兩個集合,記為1號集合和2號集合。x1為1號集合中所有數的異或和,x2為2號集合中所有數的異或和。在最大化x1+x2的前提下,最小化x1。

第一行n

第二行n個非負整數

一行兩個數,第乙個數是x1,第二個數是x2

7

1 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,非葉...