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を加減してます。