AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC129-B Range Point Distance
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 3");
WillReturn.Add("2 4");
WillReturn.Add("5 6");
//0
//0
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("10");
WillReturn.Add("64 96");
WillReturn.Add("30 78");
WillReturn.Add("52 61");
WillReturn.Add("18 28");
WillReturn.Add("9 34");
WillReturn.Add("42 86");
WillReturn.Add("11 49");
WillReturn.Add("1 79");
WillReturn.Add("13 59");
WillReturn.Add("70 95");
//0
//0
//2
//18
//18
//18
//18
//18
//18
//21
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct LRInfoDef
{
internal int L;
internal int R;
}
static List<LRInfoDef> mLRInfoList = new List<LRInfoDef>();
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
LRInfoDef WillAdd;
WillAdd.L = wkArr[0];
WillAdd.R = wkArr[1];
mLRInfoList.Add(WillAdd);
}
int MergedRangeSta = mLRInfoList[0].L;
int MergedRangeEnd = mLRInfoList[0].R;
bool AllMerged = true;
int MinR = mLRInfoList[0].R;
int MaxL = mLRInfoList[0].L;
foreach (LRInfoDef EachLRInfo in mLRInfoList) {
int CurrL = EachLRInfo.L;
int CurrR = EachLRInfo.R;
MinR = Math.Min(MinR, CurrR);
MaxL = Math.Max(MaxL, CurrL);
if (AllMerged) {
if (CurrL <= MergedRangeEnd && MergedRangeSta <= CurrR) {
MergedRangeSta = Math.Max(MergedRangeSta, CurrL);
MergedRangeEnd = Math.Min(MergedRangeEnd, CurrR);
Console.WriteLine(0);
continue;
}
AllMerged = false;
}
int Diff = Math.Abs(MinR - MaxL);
int Answer = Diff / 2;
if (Diff % 2 == 1) Answer++;
Console.WriteLine(Answer);
}
}
}
解説
場合に分けて考えます。
場合1 全ての区間をマージ可能な場合
最大距離0を達成可能です。
場合2 全ての区間をマージできない場合
区間の中でRが最大のもの
区間の中でLが最小のもの
の2つの地点の中点が最適です。
中点に小数点は使えないので、距離が偶数かの判定も行う必要があります。