Problem:
Score : 300 points

Problem Statement

You are given two integer sequences of length N: a_1,a_2,..,a_N and b_1,b_2,..,b_N.
Determine if we can repeat the following operation zero or more times so that the sequences a and b become equal.

Operation: Choose two integers i and j (possibly the same) between 1 and N (inclusive), then perform the following two actions simultaneously:

Add 2 to a_i.

Add 1 to b_j.

Constraints

1 ≤ N ≤ 10 000

0 ≤ a_i,b_i ≤ 10^9 (1 ≤ i ≤ N)

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 .. a_N
b_1 b_2 .. b_N

Output

If we can repeat the operation zero or more times so that the sequences a and b become equal, print Yes; otherwise, print No.

Sample Input 1

3
1 2 3
5 2 2

Sample Output 1

Yes

For example, we can perform three operations as follows to do our job:

First operation: i=1 and j=2. Now we have a = \{3,2,3\}, b = \{5,3,2\}.

Second operation: i=1 and j=2. Now we have a = \{5,2,3\}, b = \{5,4,2\}.

Third operation: i=2 and j=3. Now we have a = \{5,4,3\}, b = \{5,4,3\}.

Sample Input 2

5
3 1 4 1 5
2 7 1 8 2

Sample Output 2

No

Sample Input 3

5
2 7 1 8 2
3 1 4 1 5

Sample Output 3

No

Solution in C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Text;

public class Program
{

    public void Proc()
    {
        int itemCount = int.Parse(Reader.ReadLine());

        long[] arr1 = Reader.ReadLine().Split(' ').Select(a => long.Parse(a)).ToArray();
        long[] arr2 = Reader.ReadLine().Split(' ').Select(a => long.Parse(a)).ToArray();

        PriorityQueue pq = new PriorityQueue();

        for (int i = 0; i < itemCount; i++) {
            pq.Enqueue(arr2[i]-arr1[i]);
        }

        if(CanEven(pq)) {
            Console.WriteLine("Yes");
        } else {
            Console.WriteLine("No");
        }

    
    }

    private bool CanEven(PriorityQueue pq) {
        while (pq.Count > 0)
        {
            if(pq.Last()==0&&pq.First()!=0) {
                return false;
            }
            if(pq.First()==0&&pq.Last()==0) {
                return true;
            }
            if(pq.Last()<0) {
                return false;
            }
            long max = pq.Last();
            long min = pq.First();
            pq.Remove(max);
            if(max==1) {
                continue;
            }
            pq.Remove(min);
            max -= 2;
            min += 1;
            pq.Enqueue(max);
            pq.Enqueue(min);
        }
        return true;
    }

    private class PriorityQueue {
        private SortedDictionary<long, int> Dic = new SortedDictionary<long, int>();
        public void Enqueue(long num) {
            if(this.Dic.ContainsKey(num)) {
                this.Dic[num]++;
            } else {
                this.Dic[num] = 1;
            }
        }
        public int Count {
            get {
                return Dic.Count;
            }
        }
        public void Remove(long num)
        {
            if (!Dic.ContainsKey(num))
            {
                return;
            }
            Dic[num]--;
            if (Dic[num] <= 0)
            {
                Dic.Remove(num);
            }
        }
        public long First() {
            return Dic.Keys.First();
        }
        public long Last() {
            return Dic.Keys.Last();
        }
    }


    public class Reader
    {
        private static StringReader sr;
        public static bool IsDebug = false;
        public static string ReadLine()
        {
            if (IsDebug)
            {
                if (sr == null)
                {
                    sr = new StringReader(InputText.Trim());
                }
                return sr.ReadLine();
            }
            else
            {
                return Console.ReadLine();
            }
        }
        private static string InputText = @"

3
1 2 3
5 2 2


";
    }

    public static void Main(string[] args)
    {
#if DEBUG
        Reader.IsDebug = true;
#endif
        Program prg = new Program();
        prg.Proc();
    }
}