Problem:
Score : 600 points

Problem Statement

A bracket sequence is a string that is one of the following:

An empty string;

The concatenation of (, A, and ) in this order, for some bracket sequence A ;

The concatenation of A and B in this order, for some non-empty bracket sequences A and B /

Given are N strings S_i. Can a bracket sequence be formed by concatenating all the N strings in some order?

Constraints

1 \leq N \leq 10^6

The total length of the strings S_i is at most 10^6.

S_i is a non-empty string consisting of ( and ).

Input

Input is given from Standard Input in the following format:

N
S_1
:
S_N

Output

If a bracket sequence can be formed by concatenating all the N strings in some order, print Yes; otherwise, print No.

Sample Input 1

2
)
(()

Sample Output 1

Yes

Concatenating (() and ) in this order forms a bracket sequence.

Sample Input 2

2
)(
()

Sample Output 2

No

Sample Input 3

4
((()))
((((((
))))))
()()()

Sample Output 3

Yes

Sample Input 4

3
(((
)
)

Sample Output 4

No

Solution in C# (.NET Core 3.1.201) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

namespace AtCoder
{
    class Abc167F
    {
        struct Bracket
        {
            public long BraN;
            public long KetN;
        }

        public static void Main()
        {
            var n = int.Parse(Console.ReadLine());

            long braN = 0;
            long ketN = 0;

            long m = 0;
            var bra = new List<Bracket>();
            var ket = new List<Bracket>();

            for (int i = 0; i < n; i++)
            {
                var s = Console.ReadLine();
                m += s.Length;
                var x = new Bracket { BraN = 0, KetN = 0 };
                for (int j = 0; j < s.Length; j++)
                {
                    x.BraN += s[j] == '(' ? 1 : -1;
                    if (x.KetN > x.BraN)
                        x.KetN = x.BraN;
                }
                x.KetN = -x.KetN;
                x.BraN += x.KetN;
                if (x.BraN == 0)
                    ketN += x.KetN;
                else if (x.KetN == 0)
                    braN += x.BraN;
                else if (x.BraN >= x.KetN)
                    bra.Add(x);
                else
                    ket.Add(x);
            }
            foreach (var item in bra.OrderBy(x => x.KetN))
            {
                braN -= item.KetN;
                if (braN < 0)
                {
                    Console.WriteLine("No");
                    return;
                }
                braN += item.BraN;
            }
            foreach (var item in ket.OrderBy(x => x.BraN))
            {
                ketN -= item.BraN;
                if (ketN < 0)
                {
                    Console.WriteLine("No");
                    return;
                }
                ketN += item.KetN;
            }
            Console.WriteLine(braN == ketN ? "Yes" : "No");
        }
    }
}