競プロをしながら、節約と株式投資でセミリタイアを目指す東大卒のブログ

東大卒でメーカー勤務の私がセミリタイアするために投資や競プロを頑張っていこうという趣旨で始めたブログです。独身男性です。火木土日に更新予定です。お金について考えています。

ABC181で書いたコード

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

namespace debug
{
    class main
    {
        static void Main(string args)
        {
            //問題クラスを展開
            ProgramE a = new ProgramE();
            a.main();//実行する

        }

    }
    //HHKB
    class ProgramA
    {
        public void main()
        {
            //入力
            int t = int.Parse(Console.ReadLine());
            //2で割り切れれば、White、そうでなければ、Black
            if (t % 2 == 0)
                Console.WriteLine("White");
            else
                Console.WriteLine("Black");

        }
    }

    class ProgramB
    {
        public void main()
        {
            //入力
            int N = int.Parse(Console.ReadLine());

            long ans = 0;
            //入力、メイン
            for (int i = 0i < Ni++)
            {
                string t = Console.ReadLine().Split(' ');
                long a = long.Parse(t[0]);
                long b = long.Parse(t[1]);
                ans += (a + b)  * (b - a + 1) / (long)2;//和を出して足す
            }

            //答を出力
            Console.WriteLine(ans);



        }
    }

    class ProgramC
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());

            int x = new int[n];
            int y = new int[n];

            for (int i = 0;i < n;i++)
            {
                string a = Console.ReadLine().Split(' ');
                x[i] = int.Parse(a[0]);
                y[i] = int.Parse(a[1]);

            }
            //全探索、10の-8乗以下の差であれば答を出す。
            for (int i = 0i < ni++)
                for (int j = i + 1j < nj++)
                    for (int k = j + 1k < nk++)
                    {
                        double AB = Math.Sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
                        double BC = Math.Sqrt((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j]) * (y[k] - y[j]));
                        double CA = Math.Sqrt((x[i] - x[k]) * (x[i] - x[k]) + (y[i] - y[k]) * (y[i] - y[k]));

                        if (AB + BC -CA < 0.0000000001)
                        {
                            Console.WriteLine("Yes");
                            return;
                        }

                        if (AB - BC + CA < 0.0000000001)
                        {
                            Console.WriteLine("Yes");
                            return;
                        }

                        if (-AB + BC + CA < 0.0000000001)
                        {
                            Console.WriteLine("Yes");
                            return;
                        }


                    }
            
            //それ以外ならNoである。
            Console.WriteLine("No");

        }

    }


    class ProgramD
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine();

            long count = new long[9];

            //文字列1文字のとき
            if(s.Length == 1)
            {
                if (int.Parse(s) == 8)
                    Console.WriteLine("Yes");
                else
                    Console.WriteLine("No");
                return;
            }

            //文字列2文字のとき
            if (s.Length == 2)
            {
                if (int.Parse(s) % 8 == 0)
                    Console.WriteLine("Yes");
                else if(((s[0] - '0') + (s[1] - '0') * 10) % 8 == 0)
                    Console.WriteLine("Yes");
                else
                    Console.WriteLine("No");
                return;
            }

            //文字列で1-9の数を数える
            for (int i = 0i < s.Lengthi++)
                count[s[i] - '1']++;

            //112から992までを数える
            for(int i = 112i < 1000;i = i + 8)
            {
                //百、十、一の桁を出す
                int num3 = i / 100;
                int num2 = i / 10 - 10 * num3;
                int num1 = i - 100 * num3 - 10 * num2;
                //もしどれかゼロなら条件外なので飛ばす
                if (num3 == 0 || num2 == 0 || num1 == 0
                    continue;

                //とりあえず、引いてみる
                count[num3 - 1]--;
                count[num2 - 1]--;
                count[num1 - 1]--;
                int flag = 0;

                //引いた後どれかがマイナスなら条件をみたさないので飛ばす
                for (int j =  0;j < 9;j++)
                {
                    if(count[j] < 0)
                    {
                        count[num3 - 1]++;
                        count[num2 - 1]++;
                        count[num1 - 1]++;
                        flag = 1;
                        break;

                    }
                }

                //もし条件満たすならYesで出力する
                if(flag == 0)
                {
                    Console.WriteLine("Yes");
                    return;
                }

            }

            //全部満たさないならNoを出す。
            Console.WriteLine("No");

        }


    }

    class ProgramE
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine().Split(' ');
            int N = int.Parse(s[0]);
            int M = int.Parse(s[1]);

            string t = Console.ReadLine().Split(' ');
            long h = new long[N];
            long odd = new long[(N -1)/2 + 1];
            long even = new long[(N - 1) / 2 + 1];
            //配列作成
            for (int i = 0i < Ni++)
                h[i] = long.Parse(t[i]);

            //ソートする
            Array.Sort(h);
            //初項はゼロで、0人選ばれたときを導入する。
            odd[0] = 0;
            even[0] = 0;

            //身長差を偶数番目と奇数番目で分ける
            for (int i = 1i < Ni++)
            {
                long sa = h[i] - h[i - 1];
                if (i % 2 == 1)
                    odd[(i + 1)/ 2] = sa + odd[(i + 1) / 2 - 1];
                else
                    even[i / 2] = sa + even[i / 2 - 1];
            }

            string w = Console.ReadLine().Split(' ');
            long ans = 10000000000000000;//初項は大きくしとく
            for (int i = 0iM;i++)
            {
                long sum = 0;
                long wn = long.Parse(w[i]);
                long min = -1;
                long max = N;
                //二分探索法。
                while (max != min + 1)
                {
                    long temp = (max + min) / 2;

                //身長が生徒より大きいときminを更新。
                    if (h[temp] < wn)
                        min = temp;
                    else
                        max = temp;

                }

                //先生より身長が低いときの和をもとめる
                sum += odd[(min + 1) / 2];
                //先生より身長が高いときの和を求める
                sum += even[(N - 1) /2] - even[(min + 1) / 2];
                //先生の偶奇の位置で足し合わせる
                if (min % 2 == 0)
                    sum += wn - h[min];
                else
                    sum += h[max] - wn;

                //和が最小かどうか見る
                ans = Math.Min(anssum);

            }

            //答え出力
            Console.WriteLine(ans);



        }
    }

}