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.Collections.Generic;
using System.Linq;
using static System.Math;
using System;

public class P
{
    public int mdown { get; set; }
    public int Last { get; set; }
    public int mdown2 { get; set; }
}

public class Hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        var ps0 = new List<P>();
        var ps1 = new List<P>();
        for (int i = 0; i < n; i++)
        {
            var s = Console.ReadLine().Trim();
            var t = getP(s);
            if (t.Last > 0) ps0.Add(t);
            else ps1.Add(t);
        }
        var c = check(ps0,ps1);
        Console.WriteLine(c? "Yes":"No");
    }
    static bool check (List<P> ps2, List<P> ps3)
    {
        var ps = ps2.OrderByDescending(x => x.mdown).ToList();
        var ps1 = ps3.OrderBy(x => x.mdown2).ToList();
        ps.AddRange(ps1);
        var psc = ps.Count();
        var L = 0;
        var mdown = 0;
        for (int i = 0; i < psc; i++)
        {
            mdown = L + ps[i].mdown;
            if (mdown < 0) return false;
            L += ps[i].Last;
        }
        return L == 0;
    }
    static P getP (string s)
    {
        var sL = s.Length;
        var mmin = 0;
        var w = 0;
        for (int i = 0; i < sL; i++)
        {
            if (s[i] == '(') { w++; }
            else { w--; mmin = Min(mmin, w); }
        }
        if (w > 0) return new P { mdown = mmin, Last = w };
        else
        {
            var tt = getMdown(s);
            return new P { mdown = mmin, Last = w ,mdown2  = tt};
        }
    }
    static int getMdown (string s)
    {
        var s2 = s.ToCharArray();
        var sL = s2.Length;
        for (int i = 0; i < sL; i++)
        {
            if (s2[i] == '(') s2[i] = ')';
            else s2[i] = '(';
        }
        Array.Reverse(s2);
        var s3 = new string(s2);
        var mmin = 0;
        var w = 0;
        for (int i = 0; i < sL; i++)
        {
            if (s3[i] == '(') { w++; }
            else { w--; mmin = Min(mmin, w); }
        }
        return mmin;
    }
}