AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC207-C Many Segments


問題へのリンク


C#のソース

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

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("3");
            WillReturn.Add("1 1 2");
            WillReturn.Add("2 2 3");
            WillReturn.Add("3 2 4");
            //2
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("19");
            WillReturn.Add("4 210068409 221208102");
            WillReturn.Add("4 16698200 910945203");
            WillReturn.Add("4 76268400 259148323");
            WillReturn.Add("4 370943597 566244098");
            WillReturn.Add("1 428897569 509621647");
            WillReturn.Add("4 250946752 823720939");
            WillReturn.Add("1 642505376 868415584");
            WillReturn.Add("2 619091266 868230936");
            WillReturn.Add("2 306543999 654038915");
            WillReturn.Add("4 486033777 715789416");
            WillReturn.Add("1 527225177 583184546");
            WillReturn.Add("2 885292456 900938599");
            WillReturn.Add("3 264004185 486613484");
            WillReturn.Add("2 345310564 818091848");
            WillReturn.Add("1 152544274 521564293");
            WillReturn.Add("4 13819154 555218434");
            WillReturn.Add("3 507364086 545932412");
            WillReturn.Add("4 797872271 935850549");
            WillReturn.Add("2 415488246 685203817");
            //102
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct RangeInfoDef
    {
        internal decimal L;
        internal decimal R;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        decimal[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(pX => decimal.Parse(pX)).ToArray();

        var RangeInfoList = new List<RangeInfoDef>();
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            RangeInfoDef WillAdd;
            WillAdd.L = wkArr[1];
            WillAdd.R = wkArr[2];

            if (wkArr[0] == 2) {
                WillAdd.R -= 0.5M;
            }
            if (wkArr[0] == 3) {
                WillAdd.L += 0.5M;
            }
            if (wkArr[0] == 4) {
                WillAdd.R -= 0.5M;
                WillAdd.L += 0.5M;
            }

            RangeInfoList.Add(WillAdd);
        }

        long Answer = 0;
        for (int I = 0; I <= RangeInfoList.Count - 1; I++) {
            for (int J = I + 1; J <= RangeInfoList.Count - 1; J++) {
                if (RangeInfoList[I].L <= RangeInfoList[J].R
                 && RangeInfoList[J].L <= RangeInfoList[I].R) {
                    Answer++;
                }
            }
        }
        Console.WriteLine(Answer);
    }
}


解説

半開区間の場合は、0.5を加減してます。