예제 #1
0
파일: 2009925.cs 프로젝트: qifanyyy/CLCDSA
    public void Proc()
    {
        int[] inpt       = Reader.ReadLine().Split(' ').Select(a => int.Parse(a)).ToArray();
        int   kibouCount = inpt[0];

        CheckLen           = inpt[1];
        this.KibouList     = new Kibou[kibouCount];
        this.KibouMap      = new int[CheckLen * 2, CheckLen * 2];
        this.KibouCountMap = new int[CheckLen * 2, CheckLen * 2];
        for (int i = 0; i < kibouCount; i++)
        {
            Kibou newKibou = new Kibou(Reader.ReadLine());
            this.KibouList[i] = newKibou;
            this.KibouMap[newKibou.X, newKibou.Y]++;
        }
        for (int i = 0; i < KibouMap.GetLength(0); i++)
        {
            for (int j = 0; j < KibouMap.GetLength(0); j++)
            {
                int num = this.KibouMap[i, j];
                if (i > 0)
                {
                    num += this.KibouCountMap[i - 1, j];
                }
                if (j > 0)
                {
                    num += this.KibouCountMap[i, j - 1];
                }
                if (i > 0 && j > 0)
                {
                    num -= this.KibouCountMap[i - 1, j - 1];
                }
                this.KibouCountMap[i, j] = num;
            }
        }
        int ans      = 0;
        int maxIndex = KibouCountMap.GetLength(0) - 1;

        for (int i = 0; i <= maxIndex; i++)
        {
            for (int j = 0; j <= maxIndex; j++)
            {
                int subAns = GetBlockCount(i, j);
                int subX   = i + CheckLen;
                int subY   = j + CheckLen;
                if (subX > maxIndex)
                {
                    subX -= this.KibouCountMap.GetLength(0);
                }
                if (subY > maxIndex)
                {
                    subY -= this.KibouCountMap.GetLength(0);
                }
                subAns += GetBlockCount(subX, subY);
                ans     = Math.Max(subAns, ans);
            }
        }
        Console.WriteLine(ans);
    }
예제 #2
0
파일: 2009925.cs 프로젝트: qifanyyy/CLCDSA
    private int GetBlockCount(int x, int y)
    {
        int maxIndex = KibouCountMap.GetLength(0) - 1;
        int toX      = x + CheckLen - 1;
        int toY      = y + CheckLen - 1;
        int tmp      = GetItemCount(x, y, Math.Min(toX, maxIndex), Math.Min(toY, maxIndex));

        if (toX > maxIndex)
        {
            int subToX = toX - maxIndex - 1;
            int subToY = Math.Min(toY, maxIndex);
            tmp += GetItemCount(0, y, subToX, subToY);
        }
        if (toY > maxIndex)
        {
            tmp += GetItemCount(x, 0, Math.Min(toX, maxIndex), toY - maxIndex - 1);
        }
        if (toX > maxIndex && toY > maxIndex)
        {
            tmp += GetItemCount(0, 0, toX - maxIndex - 1, toY - maxIndex - 1);
        }
        return(tmp);
    }