Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

極秘調査

秘密の組織アイヅアナリティクス(AiZu AnalyticS)は、極秘の調査を開始した。ターゲットになっている人物は N 人いて、1 から N の識別番号が付けられている。AZAS 情報戦略調査員であるあなたは、
ターゲットの中から、以下の条件を少なくとも一つ満たす人物の数を割り出すことにした。

組織 $A$ に属さず、かつ、商品 $C$ を所持している者。

組織 $B$ に属し、かつ、商品 $C$ を所持している者。

組織 $A$ に属している者、組織 $B$ に属している者、商品 $C$ を所持している者の識別番号が入力として与えられたとき、条件を満たす人物の数を割り出すプログラムを作成せよ。ただし、どちらの条件も満たす人物を重複して数えないように注意せよ。

（補足：上記の条件について）

1 から $N$ までの自然数の集合から、いくつかの要素を選んだ集合を $A$，$B$，$C$ とする。条件を満たす人物の数は、$(\bar{A} \cap C) \cup (B \cap C)$ (図の塗られた部分) を満たす要素の個数である。ただし、$\bar{A}$ は集合 $A$ の補集合とする。

Input

入力は以下の形式で与えられる。

N
X a1 a2 ... aX
Y b1 b2 ... bY
Z c1 c2 ... cZ

入力は４行であり、１行目に調査対象の人数 N (1 ≤ N ≤ 100) が与えられる。２行目に、組織 $A$ に属している者の数 X (0 ≤ X ≤ N)と、それに続いて組織 $A$ に属している者の識別番号 ai (1 ≤ ai ≤ N) が与えられる。３行目に、組織 $B$ に属している者の数 Y (0 ≤ Y ≤ N) と、それに続いて組織 $B$ に属している者の識別番号 bi (1 ≤ bi ≤ N) が与えられる。４行目に、商品 $C$ を所持している者の数 Z (0 ≤ Z ≤ N) と、それに続いて商品 $C$ を所持している者の識別番号 ci (1 ≤ ci ≤ N) が与えられる。

Output

条件を満たす人物の数を１行に出力する。

Sample Input 1

5
3 1 2 3
2 4 5
2 3 4

Sample Output 1

1

Sample Input 2

100
3 1 100 4
0
2 2 3

Sample Output 2

2

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections;
public class Program {
  public static void Main() {
    int N = ReadInt();
    int[] A = SpecialRead(), B = SpecialRead(), C = SpecialRead();
    Console.WriteLine(Complement(A, 1, N).Intersect(C).Union(B.Intersect(C)).Distinct().Count());
  }

  private static int[] SpecialRead() {
    return Console.ReadLine().Split(' ').Select(int.Parse).Skip(1).ToArray();
  }

  private static int[] Complement(int[] A, int a, int b) {
    int[] notA = new int[(b-a+1) - A.Length];
    for (int i = a, j = 0; i <= b; i++) {
      if (!A.Contains(i)) {
        notA[j] = i;
        j++;
      }
    }
    return notA;
  }

  private static int ReadInt() { return int.Parse(Console.ReadLine()); }
  private static double ReadDouble() { return double.Parse(Console.ReadLine()); }
  private static long ReadLong() { return long.Parse(Console.ReadLine()); }
  private static char ReadChar() { return Console.ReadLine()[0]; }
  private static string[] ReadStringArray() { return Console.ReadLine().Split(' '); }
  private static int[] ReadIntArray() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
  private static double[] ReadDoubleArray() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
  private static long[] ReadLongArray() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
  private static char[] ReadCharArray() { return Console.ReadLine().ToArray(); }
}