AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC130-B Colorful Lines
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("4 5 6 5");
WillReturn.Add("1 1 6");
WillReturn.Add("1 3 3");
WillReturn.Add("2 2 4");
WillReturn.Add("2 4 2");
WillReturn.Add("1 1 2");
//0 8 3 3 0 0
}
else if (InputPattern == "Input2") {
WillReturn.Add("1000000000 1000000000 3 5");
WillReturn.Add("1 1 2");
WillReturn.Add("1 2 2");
WillReturn.Add("1 3 2");
WillReturn.Add("1 4 2");
WillReturn.Add("1 5 2");
//0 5000000000 0
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static int mH;
static int mW;
static int mC;
struct QueryInfoDef
{
internal int T;
internal int N;
internal int C;
}
static List<QueryInfoDef> mQueryInfoList = new List<QueryInfoDef>();
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => int.Parse(pX)).ToArray();
SplitAct(InputList[0]);
mH = wkArr[0];
mW = wkArr[1];
mC = wkArr[2];
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
QueryInfoDef WillAdd;
WillAdd.T = wkArr[0];
WillAdd.N = wkArr[1];
WillAdd.C = wkArr[2];
mQueryInfoList.Add(WillAdd);
}
var YokoSet = new HashSet<int>();
var TateSet = new HashSet<int>();
var AnswerDict = new Dictionary<int, long>();
for (int I = 1; I <= mC; I++) {
AnswerDict[I] = 0;
}
// クエリを逆から走査する
for (int I = mQueryInfoList.Count - 1; 0 <= I; I--) {
int T = mQueryInfoList[I].T;
int N = mQueryInfoList[I].N;
int C = mQueryInfoList[I].C;
// 横に塗る場合
if (T == 1) {
if (YokoSet.Add(N) == false) continue;
AnswerDict[C] += mW - TateSet.Count;
}
// 縦に塗る場合
if (T == 2) {
if (TateSet.Add(N) == false) continue;
AnswerDict[C] += mH - YokoSet.Count;
}
}
Console.WriteLine(LongEnumJoin(" ", AnswerDict.Values));
}
// セパレータとLong型の列挙を引数として、結合したstringを返す
static string LongEnumJoin(string pSeparater, IEnumerable<long> pEnum)
{
string[] StrArr = Array.ConvertAll(pEnum.ToArray(), pX => pX.ToString());
return string.Join(pSeparater, StrArr);
}
}
解説
クエリを逆から走査すれば、
今まで塗ってないマスに塗れると考えることができます。
既に塗ったマスは、HashSetで管理できます。