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

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

ABC157で書いたコード

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

namespace Atcoder20190616
{
    class ProgramA
    {
        static void Main(string args)
        {
            //入力
            int n = int.Parse(Console.ReadLine());


            //奇数なら(n+1)/2、偶数ならn/2。intは切り捨てなのでこれで解答可能
            Console.WriteLine((n + 1) /2);
          
        }
    }

    class ProgramB
    {
        static void Main(string args)
        {
            
            //入力
            int[,] bingo = new int[3,3];
            int[,] hit = new int[3,3];

            //ビンゴ作成
            for(int i = 0i < 3;i++)
            {
                string input = Console.ReadLine().Split(' ');
                bingo[0,i] = int.Parse(input[0]);
                bingo[1,i] = int.Parse(input[1]);
                bingo[2,i] = int.Parse(input[2]);
            }
            
            int n = int.Parse(Console.ReadLine());


            //当たったかどうか確認
            for(int i = 0;i < n ;i++)
            {
                int num = int.Parse(Console.ReadLine());
                for(int i = 0;i < 3;i++)
                    for(int j = 0;j < 3;j++)
                    {
                        if(bingo[i,j] == num)
                        {
                            hit[i,j] = 1;
                            break;
                        }
                    }
            }

            //縦横のあたりを見る
            for(int i = 0;i < 3 ;i++)
            {
                if(hit[i,0] == 1 && hit[i,1] == 1 && hit[i,2] == 1)
                {
                    Console.WriteLine("Yes");
                    return;
                }

                if(hit[0,i] == 1 && hit[1,i] == 1 && hit[2,i] == 1)
                {
                    Console.WriteLine("Yes");
                    return;
                }
                    
            }

            //斜めのあたりを見る
            if(hit[0,0] == 1 && hit[1,1] == 1 && hit[2,2] == 1)
            {
                Console.WriteLine("Yes");
                return;
            }

            if(hit[2,0] == 1 && hit[1,1] == 1 && hit[0,2] == 1)
            {
                Console.WriteLine("Yes");
                return;
            }

            //ないならNo
            Console.WriteLine("No");
    
        }
    }

    class ProgramC
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);
            
            //初期設定
            int keta1 = 10;
            int keta2 = 10;
            int keta3 = 10;

            if(n == 1)
            {  //n=1のとき
                for(int i = 0;i < m;i++)
                {
                    string input = Console.ReadLine().Split(' ');
                    int keta = int.Parse(input[0]);
                    int m_i = int.Parse(input[1]);

                    if(keta1 != m_i && keta1 != 10) //1桁目に2つの数が入ったらあり得ない
                    {
                        Console.WriteLine("-1");
                        return;
                    }

                    keta1 = m_i;
                }
                //候補がないなら0になる
                if(keta1 == 10)
                    keta1 = 0;
                Console.WriteLine(keta1);
                
            }
            else if(n == 2)
            {
                //n=2のとき
                for(int i = 0;i < m;i++)
                {
                string input = Console.ReadLine().Split(' ');
                int keta = int.Parse(input[0]);
                int m_i = int.Parse(input[1]);

                if(keta == 1 && m_i == 0)
                {
                    Console.WriteLine("-1");
                    return;
                }

                if(keta == 1)
                {
                    if(keta1 != m_i && keta1 != 10)
                    {
                        Console.WriteLine("-1");
                        return;
                    }

                    keta1 = m_i;
                }
                else
                {

                    if(keta2 != m_i && keta2 != 10)
                    {
                        Console.WriteLine("-1");
                        return;
                    }

                    keta2 = m_i;
                }
                }
                if(keta1 == 10)
                    keta1 = 1;
                if(keta2 == 10)
                    keta2 = 0;
                Console.WriteLine(keta1*10 + keta2);
                
            }
            else
            {
                //n=3のとき
                for(int i = 0;i < m;i++)
                {
                    string input = Console.ReadLine().Split(' ');
                    int keta = int.Parse(input[0]);
                    int m_i = int.Parse(input[1]);

                    if(keta == 1 && m_i == 0)
                    {
                        Console.WriteLine("-1");
                        return;
                    }

                    if(keta == 1)
                    {
                        if(keta1 != m_i && keta1 != 10)
                        {
                            Console.WriteLine("-1");
                            return;
                        }

                        keta1 = m_i;
                    }
                    else if(keta == 2)
                    {

                        if(keta2 != m_i && keta2 != 10)
                        {
                            Console.WriteLine("-1");
                            return;
                        }

                        keta2 = m_i;
                    }
                    else
                    {

                        if(keta3 != m_i && keta3 != 10)
                        {
                            Console.WriteLine("-1");
                            return;
                        }

                        keta3 = m_i;
                    }

                }
                if(keta1 == 10)
                    keta1 = 1;
                if(keta2 == 10)
                    keta2 = 0;
                if(keta3 == 10)
                    keta3 = 0;
                Console.WriteLine(keta1*100 + keta2*10 + keta3);
            }

        } 
    }  

    class ProgramD
    {
        static void Main(string args)
        {
            
            //入力
            string input = Console.ReadLine().Split(' ');
            int n = int.Parse(input[0]);
            int m = int.Parse(input[1]);
            int k = int.Parse(input[2]);
 
            int count = new int[n];
 
            UnionFind tree = new UnionFind();//UnionFindクラスを設定
            tree.par = new int[n];
            tree.temp = new int[n];
            tree.reset(n);

            //友だちの輪をUnion-find法で決める
            for(int i = 0;i < m;i++)
            {
                string input2 = Console.ReadLine().Split(' ');
                int x = int.Parse(input2[0]);
                int y = int.Parse(input2[1]);
                tree.unite(x-1y-1); // xの木とyの木を併合する

                //友だち同士は候補にならないので引く
                count[x-1]--;
                count[y-1]--;
            }

            //要素数-1を足し合わせる。(前のところで友だちは除いているので友だち候補のみ残る)
            for(int i0;in;i++)
              count[i] += tree.size(i) - 1;


            //ブロック関係を洗い出す。もし友だち候補でブロック関係なら引く
            for(int i = 0;i < k;i++)
            {
                string input3 = Console.ReadLine().Split(' ');
                int x = int.Parse(input3[0]);
                int y = int.Parse(input3[1]);
                if(tree.same(x-1,y-1) == true)
                {
                    count[x-1]--;
                    count[y-1]--;
                }
            }
 
            //答え出力
            for(int i = 0;i < n;i++)
            {
                Console.Write(count[i]);
                Console.Write(" ");
            }
        }
    }

    /*UnionFind法のクラス*/
    class UnionFind
    {
 
        public int par;
        public int[] temp;


        //マイナスは根を示す。
        public void reset(int n)
        {
            for(int i = 0;i < n;i++)
                par[i] = -1;
        }

        //マイナスならそれはまだ属していないので根である。そうでないならさかのぼる
        public int root(int x)
        {
            if(par[x] < 0)
                return x;
            else
                return root(par[x]);
        }

        //根の併合を行い、根には要素数を足す(マイナスの値)
        public void unite(int xint y)
        { // xとyの木を併合
            int rx = root(x); //xの根をrx
            int ry = root(y); //yの根をry
            if (rx == ry
                 return//xとyの根が同じ(=同じ木にある)時はそのまま
            if(par[ry] > par[rx])
            {
                 int temp = ry;
                 ry = rx;
                 rx = temp;
            }
            par[ry] += par[rx];
            par[rx] = ry//xとyの根が同じでない(=同じ木にない)時:xの根rxをyの根ryにつける
        }

        // 2つのデータx, yが属する木が同じならtrueを返す
        public bool same(int xint y
        { 
            int rx = root(x);
            int ry = root(y);
            return rx == ry;
        }
        

        //根の元に入っている
        public int size(int x)
        {
            return -par[root(x)];
        }
    }
    
}