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# (Mono-csc 3.5.0) (judge verdict: Wrong Answer)

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

class Program
{
    static void Main(string[] args)
    {
        new Program();
    }

    class A
    {
        public int tani;
        public int h;

        public A(string s)
        {
            var min = 0;

            for (var i = 0; i < s.Length; i++)
            {
                if (s[i] == '(') { h++; }
                else { h--; min = Math.Min(h, min); }
            }

            if (h > 0)
            {
                tani = min;
            }
            else if (h < 0)
            {
                tani = min - h;
            }
            else
            {
                tani = min;
            }
        }
    }


    Program()
    {
        // Dictionary<谷の深さ,上昇率の降順>
        var n = long.Parse(Console.ReadLine());

        var dic = new Dictionary<long, List<A>>();
        var taniList = new List<int>();

        for (var i = 0; i < n; i++)
        {
            var a = new A(Console.ReadLine());
            var tani = a.tani;

            if (!dic.ContainsKey(tani))
            {
                dic.Add(tani, new List<A>());
                taniList.Add(tani);
            }

            dic[tani].Add(a);
        }

        taniList.Sort();

        foreach (var tani in taniList)
        {
            dic[tani].Sort((a, b) =>
            {
                return a.h - b.h;
            });
        }

        var hight = 0;

        for (var i = taniList.Count - 1; i >= 0; i--)
        {
            var list = dic[taniList[i]];

            foreach (var t in list)
            {
                if (t.h > 0)
                {
                    if (hight + t.tani < 0)
                    {
                        Console.WriteLine("No");
                        return;
                    }
                    hight += t.h;
                }
            }
        }

        for (var i = taniList.Count - 1; i >= 0; i--)
        {
            var list = dic[taniList[i]];

            foreach (var t in list)
            {
                if (t.h == 0)
                {
                    if (hight + t.tani < 0)
                    {
                        Console.WriteLine("No");
                        return;
                    }
                    hight += t.h;
                }
            }
        }

        for (var i = 0; i < taniList.Count; i++)
        {
            var list = dic[taniList[i]];

            for(var j=list.Count-1;j>=0;j--)
            {
                var t = list[j];

                if (t.h < 0)
                {
                    if (hight + t.tani < 0)
                    {
                        Console.WriteLine("No");
                        return;
                    }
                    hight += t.h;
                }
            }
        }

        Console.WriteLine(hight == 0 ? "Yes" : "No");
    }
}