Submission #4543737


Source Code Expand

Copy
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace Practice
{
    class Program
    {
        static void Main(string[] args)
        {
            Solve();
        }
        private const int MOD = 1000000007;
        private const int INF = 100000000;
        private struct Square
        {
            public long y;
            public long x;
            public Square(long x, long y)
            {
                this.x = x;
                this.y = y;
            }
        }
        static void Solve()
        {
            var o = ReadAndParseLongArr();
            var h = o[0];
            var w = o[1];
            var n = o[2];
            var dic = new Dictionary<long, int>();
            for(int i=0;i<n;++i)
            {
                o = ReadAndParseLongArr();
                var a = o[0]-1;
                var b = o[1]-1;
                for(int k=0;k<=2;++k)
                {
                    for(int l=0;l<=2;++l)
                    {
                        var x = b - k;
                        var y = a - l;
                        if(0<=x && x < w-2 && 0<= y && y < h-2)
                        {
                            var key = (x << 32) + y;
                            if( !dic.ContainsKey(key))
                            {
                                dic.Add(key, 0);
                            }
                            dic[key]++;
                        }
                    }
                }
            }

            var ans = new long[10];
            foreach(var kv in dic)
            {
                ans[kv.Value]++;
            }
            long without0 = ans.Sum();
            ans[0] = (h - 2) * (w - 2) - without0;
            foreach(var ans0 in ans)
            {
                Console.WriteLine(ans0);
            }
        }

        #region よく使う便利関数
        private static bool isPrime(long x)
        {
            if (x == 2) { return true; }
            if (x < 2 || x % 2 == 0) { return false; }
            long i = 3;
            while (i * i <= x)
            {
                if (x % i == 0) { return false; }
                i = i + 2;
            }
            return true;
        }
        private static long lcm(long x, long y)
        {
            return x / gcd(x, y) * y;
        }
        private static long gcd(long x, long y)
        {
            return y > 0 ? gcd(y, x % y) : x;
        }
        private static long pow(long x, long n)
        {
            if (n == 0) { return 1; }
            long res = pow(x * x % MOD, n / 2);
            if (n % 2 == 1)
            {
                res = res * x % MOD;
            }
            return res;
        }
        private static int ReadAndParseInt()
        {
            return int.Parse(Console.ReadLine());
        }
        private static int[] ReadAndParseIntArr()
        {
            return Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
        }
        private static long ReadAndParseLong()
        {
            return long.Parse(Console.ReadLine());
        }
        private static long[] ReadAndParseLongArr()
        {
            return Array.ConvertAll(Console.ReadLine().Split(' '), long.Parse);
        }

        private static void Swap<T>(ref T x, ref T y)
        {
            T t = x;
            x = y;
            y = t;
        }

        /// <summary>
        /// 指定した値以上の先頭のインデクスを返す
        /// </summary>
        /// <typeparam name="T">比較する値の型</typeparam>
        /// <param name="arr">対象の配列(※ソート済みであること)</param>
        /// <param name="start">開始インデクス [inclusive]</param>
        /// <param name="end">終了インデクス [exclusive]</param>
        /// <param name="value">検索する値</param>
        /// <param name="comparer">比較関数(インターフェイス)</param>
        /// <returns>指定した値以上の先頭のインデクス</returns>
        public static int LowerBound<T>(IReadOnlyList<T> arr, int start, int end, T value, IComparer<T> comparer)
        {
            int low = start;
            int high = end;
            int mid;
            while (low < high)
            {
                mid = ((high - low) >> 1) + low;
                if (comparer.Compare(arr[mid], value) < 0)
                    low = mid + 1;
                else
                    high = mid;
            }
            return low;
        }

        //引数省略のオーバーロード
        public static int LowerBound<T>(IReadOnlyList<T> arr, T value) where T : IComparable
        {
            return LowerBound(arr, 0, arr.Count, value, Comparer<T>.Default);
        }

        /// <summary>
        /// 指定した値より大きい先頭のインデクスを返す
        /// </summary>
        /// <typeparam name="T">比較する値の型</typeparam>
        /// <param name="arr">対象の配列(※ソート済みであること)</param>
        /// <param name="start">開始インデクス [inclusive]</param>
        /// <param name="end">終了インデクス [exclusive]</param>
        /// <param name="value">検索する値</param>
        /// <param name="comparer">比較関数(インターフェイス)</param>
        /// <returns>指定した値より大きい先頭のインデクス</returns>
        public static int UpperBound<T>(IReadOnlyList<T> arr, int start, int end, T value, IComparer<T> comparer)
        {
            int low = start;
            int high = end;
            int mid;
            while (low < high)
            {
                mid = ((high - low) >> 1) + low;
                if (comparer.Compare(arr[mid], value) <= 0)
                    low = mid + 1;
                else
                    high = mid;
            }
            return low;
        }

        //引数省略のオーバーロード
        public static int UpperBound<T>(IReadOnlyList<T> arr, T value)
        {
            return UpperBound(arr, 0, arr.Count, value, Comparer<T>.Default);
        }
        #endregion
    }

    public class DisjointSet
    {
        private int[] rank;
        private int[] p;
        private int[] size;
        public DisjointSet(int n)
        {
            rank = new int[n];
            p = new int[n];
            size = new int[n];
            for (int i = 0; i < n; ++i)
            {
                MakeSet(i);
            }
        }
        public void MakeSet(int x)
        {
            p[x] = x;
            rank[x] = 0;
            size[x] = 1;
        }
        public bool IsSame(int x, int y)
        {
            return FindSet(x) == FindSet(y);
        }
        public void Unite(int x, int y)
        {
            Link(FindSet(x), FindSet(y));
        }
        public void Link(int x, int y)
        {
            if (rank[x] > rank[y])
            {
                p[y] = x;
                size[x] += size[y];
                size[y] = 0;
            }
            else
            {
                p[x] = y;
                size[y] += size[x];
                size[x] = 0;
                if (rank[x] == rank[y])
                {
                    rank[y]++;
                }
            }
        }
        public int FindSet(int x)
        {
            if (x != p[x])
            {
                p[x] = FindSet(p[x]);
            }
            return p[x];
        }
        public int Size(int x)
        {
            int root = FindSet(x);
            return size[root];
        }
    }
}

Submission Info

Submission Time
Task D - すぬけ君の塗り絵 / Snuke's Coloring
User masakam1
Language C# (Mono 4.6.2.0)
Score 0
Code Size 7852 Byte
Status

Test Cases

Set Name Score / Max Score Test Cases
Sample 0 / 0
All 0 / 400 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, empty.txt, sample_01.txt, sample_02.txt, sample_03.txt
Case Name Status Exec Time Memory
01.txt 1213 ms 23620 KB
02.txt
03.txt 299 ms 18652 KB
04.txt 26 ms 11232 KB
05.txt 178 ms 27856 KB
06.txt 172 ms 29904 KB
07.txt 299 ms 55352 KB
08.txt 304 ms 56884 KB
09.txt 308 ms 56884 KB
10.txt 26 ms 11232 KB
11.txt 2872 ms 35316 KB
12.txt 666 ms 57528 KB
13.txt 28 ms 13280 KB
14.txt 975 ms 57520 KB
15.txt
empty.txt 25 ms 11232 KB
sample_01.txt 26 ms 11232 KB
sample_02.txt 26 ms 9184 KB
sample_03.txt 24 ms 11232 KB