3068: Find-the-Maximum-Sum-of-Node-Values
Hard
This problem is so cheese-ableā¦
Basically, realise that the entire graph has n
nodes and is connected with n-1
edges. Therefore,
since every node is connected (with a distance of 1
to n-1
edges) for any 2 nodes,
realise that if we want to XOR
any 2
nodes, we can just XOR
every pair
between the 2 nodes.
To run through an example, let us say the nodes 1
and 4
are connected together with the formation
1 -- 2 -- 3 -- 4
Then, if we wanted to XOR
both 1
and
4
ONLY, we can simply
XOR
:
1 -- 2
2 -- 3
3 -- 4
meaning, since we have XOR
ed 2
and
3
twice, they cancel out; leaving only nodes
1
and 4
XOR
ed once. We
could inductively prove that this holds between any 2 nodes that
are connected, but we leave that as an exercise for the
reader. :P
Therefore, if we simply find all the values where
XOR
ing it with k
would
INCREASE the total sum, we are effectively able
to XOR
them all GIVEN we have an
even number of target nodes.
If we do not have an even number of target nodes, we can either:
Code:
class Solution {
public:
long long maximumValueSum(vector<int>& nums, int k, vector<vector<int>>& edges) {
long long sum = 0;
bool even = true;
int minPositiveDiff = INT32_MAX;
int maxNegativeDiff = INT32_MIN;
for (int& num : nums) {
int difference = (num^k)-num;
if (difference > 0) {
+= num^k;
sum = min(minPositiveDiff, difference);
minPositiveDiff = !even;
even } else {
= max(maxNegativeDiff, difference);
maxNegativeDiff += num;
sum }
}
if (!even) {
return max(sum-minPositiveDiff, sum+maxNegativeDiff);
}
return sum;
}
};