Subsequence Addition (Hard Version) (Codeforces 1807G2)
Tags: Greedy, bitmasks

The only difference between the two versions is that in this version, the constraints are higher.Initially, array $$$a$$$ contains just the number $$$1$$$. You can perform several operations in order to change the array. In an operation, you can select some subsequence$$$^{\dagger}$$$ of $$$a$$$ and add into $$$a$$$ an element equal to the sum of all elements of the subsequence. You are given a final array $$$c$$$. Check if $$$c$$$ can be obtained from the initial array $$$a$$$ by performing some number (possibly 0) of operations on the initial array.$$$^{\dagger}$$$ A sequence $$$b$$$ is a subsequence of a sequence $$$a$$$ if $$$b$$$ can be obtained from $$$a$$$ by the deletion of several (possibly zero, but not all) elements. In other words, select $$$k$$$ ($$$1 \leq k \leq |a|$$$) distinct indices $$$i_1, i_2, \dots, i_k$$$ and insert anywhere into $$$a$$$ a new element with the value equal to $$$a_{i_1} + a_{i_2} + \dots + a_{i_k}$$$.

Input: The first line of the input contains an integer $$$t$$$ ($$$1 \leq t \leq 1000$$$) — the number of test cases. The description of the test cases follows.The first line of each test case contains a single integer $$$n$$$ ($$$1 \leq n \leq 2 \cdot 10^5$$$)  — the number of elements the final array $$$c$$$ should have.The second line of each test case contains $$$n$$$ space-separated integers $$$c_i$$$ ($$$1 \leq c_i \leq 2 \cdot 10^5$$$)  — the elements of the final array $$$c$$$ that should be obtained from the initial array $$$a$$$.It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, output "YES" (without quotes) if such a sequence of operations exists, and "NO" (without quotes) otherwise.You can output the answer in any case (for example, the strings "yEs", "yes", "Yes" and "YES" will be recognized as a positive answer).

Note: For the first test case, the initial array $$$a$$$ is already equal to $$$[1]$$$, so the answer is "YES".For the second test case, performing any amount of operations will change $$$a$$$ to an array of size at least two which doesn't only have the element $$$2$$$, thus obtaining the array $$$[2]$$$ is impossible and the answer is "NO".For the third test case, we can perform the following operations in order to obtain the final given array $$$c$$$: Initially, $$$a = [1]$$$.  By choosing the subsequence $$$[1]$$$, and inserting $$$1$$$ in the array, $$$a$$$ changes to $$$[1, 1]$$$.  By choosing the subsequence $$$[1, 1]$$$, and inserting $$$1+1=2$$$ in the middle of the array, $$$a$$$ changes to $$$[1, 2, 1]$$$. By choosing the subsequence $$$[1, 2]$$$, and inserting $$$1+2=3$$$ after the first $$$1$$$ of the array, $$$a$$$ changes to $$$[1, 3, 2, 1]$$$. By choosing the subsequence $$$[1, 3, 1]$$$ and inserting $$$1+3+1=5$$$ at the beginning of the array, $$$a$$$ changes to $$$[5, 1, 3, 2, 1]$$$ (which is the array we needed to obtain).

Sample Inputs:
6
1
1
1
2
5
5 1 3 2 1
5
7 1 5 2 1
3
1 1 1
5
1 1 4 2 1

Sample Outputs:
YES
NO
YES
NO
YES
YES

Solution (Python):
def solve():
    t = int(input().strip())
    for _ in range(t):
        n = int(input().strip())
        c = list(map(int, input().strip().split()))
        c.sort()
        if c[0] != 1:
            print('NO')
            continue
        max_sum = 1
        for i in range(1, n):
            if max_sum < c[i]:
                print('NO')
                break
            max_sum += c[i]
        else:
            print('YES')
solve()

Solution (Python):
import sys
import math
import heapq as hp
from collections import deque
input = sys.stdin.readline
m = 1000000007
M = 998244353
INF = float('inf')

def inp():
    return int(input())

def minp():
    return map(int, input().split())

def strinp():
    S = input().rstrip()
    return S

def lst():
    return list(map(int, input().split()))

def solve():
    for _ in range(inp()):
        n = inp()
        a = lst()
        a.sort()
        sum = 1
        if a[0] != 1:
            print('NO')
            continue
        flag = True
        for i in range(1, n):
            if a[i] > sum:
                flag = False
                break
            sum += a[i]
        if flag == True:
            print('YES')
        else:
            print('NO')
solve()

Solution (Python):
def solve():
    n = int(input())
    a = list(map(int, input().split()))
    if n == 1 and a[0] == 1:
        return 'YES'
    a.sort()
    if a[0] != 1 or a[1] != 1:
        return 'NO'
    present_sum = 2
    for i in range(2, n):
        if a[i] <= present_sum:
            present_sum += a[i]
        else:
            return 'NO'
    return 'YES'
if __name__ == '__main__':
    t = int(input())
    for _ in range(t):
        print(solve())