天天看点

codeforces1474C. Array Destruction

You found a useless array a of 2n positive integers. You have realized that you actually don’t need this array, so you decided to

throw out all elements of a.

It could have been an easy task, but it turned out that you should

follow some rules:

In the beginning, you select any positive integer x. Then you do the

following operation n times: select two elements of array with sum

equals x; remove them from a and replace x with maximum of that two

numbers. For example, if initially a=[3,5,1,2], you can select x=6.

Then you can select the second and the third elements of a with sum

5+1=6 and throw them out. After this operation, x equals 5 and there

are two elements in array: 3 and 2. You can throw them out on the next

operation.

Note, that you choose x before the start and can’t change it as you

want between the operations.

Determine how should you behave to throw out all elements of a.

Input The first line contains a single integer t (1≤t≤1000) — the

number of test cases.

The first line of each test case contains the single integer n

(1≤n≤1000).

The second line of each test case contains 2n integers a1,a2,…,a2n

(1≤ai≤106) — the initial array a.

It is guaranteed that the total sum of n over all test cases doesn’t

exceed 1000.

Output For each test case in the first line print YES if it is

possible to throw out all elements of the array and NO otherwise.

If it is possible to throw out all elements, print the initial value

of x you’ve chosen. Print description of n operations next. For each

operation, print the pair of integers you remove.

Example inputCopy 4 2 3 5 1 2 3 1 1 8 8 64 64 2 1 1 2 4 5 1 2 3 4 5 6

7 14 3 11 outputCopy YES 6 1 5 2 3 NO NO YES 21 14 7 3 11 5 6 2 4 3 1

Note The first test case was described in the statement.

In the second and third test cases, we can show that it is impossible

to throw out all elements of array a.

先排个序~

首先可以删掉数列中任意一项(除了最大项)。

可以发现就是要找到第二大的元素和某项的和等于最大的元素,然后删掉最大的元素。

(如果跳过找,显然就凑不出了)

记个数,数量够了就输出了。

//cyc
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
#include<bits/stdc++.h>
#define vector<int> VI
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define mst(a) memset(a,0,sizeof a)

using namespace std;
typedef pair<int, int> pii;
int a[2005];
int n;
map<int, int> mp1;
map<int, int> mp2;
int vis[2005];
int b[2005];
int loop;
bool judge(int res)
{
    int cnt = 1;
    int ed=n-1;
    mst(vis);
    while(true)
    {
    // if(loop==8)  cout<<res<<endl;

        if(cnt == n/2)return 1;
        if(cnt >n/2||ed==0)return 0;
        if(loop==ed||!mp1[a[ed]]){
            ed--;
            continue;
        }


        if(!mp1[res-a[ed]])return 0;
        mp1[res-a[ed]]--;
        if(!mp1[a[ed]])return 0;
        else {

            mp1[a[ed]]--;
            cnt++;
            b[cnt*2-1]=res-a[ed];
            b[cnt*2]=a[ed];
            res=a[ed];
            ed--;


        }
    }
}
void pt(int q)
{
    cout<<q<<endl;
    for(int i=1;i<=n/2;i++){
        cout<<b[i*2-1]<<" "<<b[i*2]<<endl;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int _;
    cin >> _;
    while(_--)
    {
        mp1.clear();
        mp2.clear();
        cin >> n;
        n *= 2;
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            mp1[a[i]]++;
        }
        mp2 = mp1;
        sort(a + 1, a + n + 1);
        int x, y;
        int flag = 0;
        for(int i = 1; i < n; i++)
        {
            loop = i;
            x = a[n];
            y = a[i];
            mp1[x]--;
            mp1[y]--;
            b[1]=x;
            b[2]=y;
            if(judge(x))
            {
                cout << "YES" << endl;
                flag = 1;
                pt(x+y);
                break;
            }
            mp1=mp2;
        }
        if(!flag)cout << "NO" << endl;

    }
}