Submission #4544120


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*112315631) << 32) + (y*162351877);
                            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 chokudai
Language C# (Mono 4.6.2.0)
Score 400
Code Size 7878 Byte
Status
Exec Time 309 ms
Memory 58932 KB

Test Cases

Set Name Score / Max Score Test Cases
Sample 0 / 0
All 400 / 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 197 ms 24388 KB
02.txt 255 ms 40436 KB
03.txt 73 ms 18652 KB
04.txt 24 ms 13280 KB
05.txt 173 ms 27856 KB
06.txt 178 ms 30416 KB
07.txt 297 ms 57912 KB
08.txt 309 ms 56244 KB
09.txt 306 ms 58932 KB
10.txt 24 ms 11232 KB
11.txt 264 ms 35828 KB
12.txt 288 ms 57528 KB
13.txt 25 ms 9256 KB
14.txt 288 ms 56880 KB
15.txt 270 ms 35824 KB
empty.txt 23 ms 11232 KB
sample_01.txt 25 ms 11232 KB
sample_02.txt 24 ms 9184 KB
sample_03.txt 23 ms 11232 KB