CodeForces - 1270C Make Good(思维+构造)
題目鏈接:點擊查看
題目大意:給出一個由n個數字構成的數列,現在已知其累加和為sum,異或和為xor,現在允許我們向數列中添加0~3個數,以滿足sum=2*xor,構造出任意一種方案
題目分析:一開始我想分情況討論的,就是在求出sum和xor之后,討論一下其大小關系,如果sum小于2*xor的話,直接補齊兩個其差值的一半就好了,因為新補的兩個數對xor不做貢獻,而對sum的貢獻就是差值,可以滿足條件了,不過需要對奇偶討論一下,因為奇數的一半會出現小數,這個時候我們就可以用第三個數來補齊一下了,也就是先讓sum加一,再讓xor異或1,這個時候其差值就是偶數了,剩下的就是當sum大于2*xor的時候,這個時候我考慮到首先加上一個數,讓其回到第一種情況即可,不過這樣想下來構造所需要處理的細節就太多太多了。。很不可取,即使勉強寫出來了也耗費了不少時間,而且應該很難1A
這個時候我們就可以直接從公式出發,先將數字抽象出來,在輸入完成后我們只有sum和xor兩個數值,若想滿足sum=xor*2,因為不可控因素較多,我們不妨先把xor給消掉,也就是添加一個數,令其權值等于xor,這樣等式就變成了sum+xor=2*(xor^xor),也就是sum+xor=0,這有個什么好處呢,這個公式的等式右邊,也就是需要異或的地方變成了零,接下來我們無論添加的數為多少,會造成的貢獻就是等式兩邊都加上相同的數值,因為我們需要維持兩倍的關系,所以完全可以添加一個sum+xor,這樣等式兩邊就可以符合題意了
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);LL sum=0,_xor=0;for(int i=1;i<=n;i++){LL num;scanf("%lld",&num);sum+=num;_xor^=num;}printf("2\n");printf("%lld %lld\n",_xor,_xor+sum);}return 0; }?
總結
以上是生活随笔為你收集整理的CodeForces - 1270C Make Good(思维+构造)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1041 John's tr
- 下一篇: CodeForces - 1270D S