<p>You are given an integer array <code>nums</code> of <strong>even</strong> length <code>n</code> and an integer <code>limit</code>. In one move, you can replace any integer from <code>nums</code> with another integer between <code>1</code> and <code>limit</code>, inclusive.</p>

<p>The array <code>nums</code> is <strong>complementary</strong> if for all indices <code>i</code> (<strong>0-indexed</strong>), <code>nums[i] + nums[n - 1 - i]</code> equals the same number. For example, the array <code>[1,2,3,4]</code> is complementary because for all indices <code>i</code>, <code>nums[i] + nums[n - 1 - i] = 5</code>.</p>

<p>Return the <em><strong>minimum</strong> number of moves required to make </em><code>nums</code><em> <strong>complementary</strong></em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,4,3], limit = 4
<strong>Output:</strong> 1
<strong>Explanation:</strong> In 1 move, you can change nums to [1,2,<u>2</u>,3] (underlined elements are changed).
nums[0] + nums[3] = 1 + 3 = 4.
nums[1] + nums[2] = 2 + 2 = 4.
nums[2] + nums[1] = 2 + 2 = 4.
nums[3] + nums[0] = 3 + 1 = 4.
Therefore, nums[i] + nums[n-1-i] = 4 for every i, so nums is complementary.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,2,1], limit = 2
<strong>Output:</strong> 2
<strong>Explanation:</strong> In 2 moves, you can change nums to [<u>2</u>,2,2,<u>2</u>]. You cannot change any number to 3 since 3 &gt; limit.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,1,2], limit = 2
<strong>Output:</strong> 0
<strong>Explanation:</strong> nums is already complementary.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>n == nums.length</code></li>
	<li><code>2 &lt;= n&nbsp;&lt;=&nbsp;10<sup>5</sup></code></li>
	<li><code>1 &lt;= nums[i]&nbsp;&lt;= limit &lt;=&nbsp;10<sup>5</sup></code></li>
	<li><code>n</code> is even.</li>
</ul>

class Solution {
public:
    int minMoves(vector<int>& nums, int limit) {
        int n=nums.size();
        vector<int> maxi,mini;
        int ans=INT_MAX;
        map<int,int> mp;
        for(int i=0;i<n/2;i++){
            mp[nums[i]+nums[n-1-i]]++;
            maxi.push_back(max(nums[i],nums[n-1-i])+limit);
            mini.push_back(min(nums[i],nums[n-1-i])+1);
        }
        sort(maxi.begin(),maxi.end());
        sort(mini.begin(),mini.end());
        for(int i=2;i<=2*limit;i++){
            int low=0,high=n/2-1;
            int ind1=-1,ind2=n/2;
            while(low<=high){
                int mid=(low+high)/2;
                if(i>=mini[mid]){
                    ind1=mid;
                    low=mid+1;
                }
                else{
                    high=mid-1;
                }
            }
            low=0;high=n/2-1;
            while(low<=high){
                int mid=(low+high)/2;
                if(i<=maxi[mid]){
                    ind2=mid;
                    high=mid-1;
                }
                else{
                    low=mid+1;
                }
            }
            int cnt=(n/2-(ind1+1))+(ind2);
            int te=n/2-cnt;
            cnt*=2;
            te-=mp[i];
            ans=min(ans,cnt+te);
        }
        return ans;


    }
};
227400