AtCoderのPAST
次のPASTの問題へ
前のPASTの問題へ
第1回PAST H まとめ売り
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");
WillReturn.Add("5 3 3 5");
WillReturn.Add("6");
WillReturn.Add("1 2 1");
WillReturn.Add("2 2");
WillReturn.Add("2 2");
WillReturn.Add("3 100");
WillReturn.Add("3 1");
WillReturn.Add("1 1 3");
//9
}
else if (InputPattern == "Input2") {
WillReturn.Add("10");
WillReturn.Add("241 310 105 738 405 490 158 92 68 20");
WillReturn.Add("20");
WillReturn.Add("2 252");
WillReturn.Add("1 4 36");
WillReturn.Add("2 69");
WillReturn.Add("1 5 406");
WillReturn.Add("3 252");
WillReturn.Add("1 3 8");
WillReturn.Add("1 10 10");
WillReturn.Add("3 11");
WillReturn.Add("1 4 703");
WillReturn.Add("3 1");
WillReturn.Add("2 350");
WillReturn.Add("3 10");
WillReturn.Add("2 62");
WillReturn.Add("2 3");
WillReturn.Add("2 274");
WillReturn.Add("1 2 1");
WillReturn.Add("3 126");
WillReturn.Add("1 4 702");
WillReturn.Add("3 6");
WillReturn.Add("2 174");
//390
}
else if (InputPattern == "Input3") {
WillReturn.Add("2");
WillReturn.Add("3 4");
WillReturn.Add("3");
WillReturn.Add("1 2 9");
WillReturn.Add("2 4");
WillReturn.Add("3 4");
//0
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] CArr = InputList[1].Split(' ').Select(X => long.Parse(X)).ToArray();
string[] SArr = InputList.Skip(3).ToArray();
var Query1SellCntDict = new Dictionary<int, long>();
long Type2SellCnt = 0;
long Type3SellCnt = 0;
long MinAll = CArr.Min();
long MinOdd = long.MaxValue;
for (int I = 0; I <= CArr.GetUpperBound(0); I += 2) {
if (MinOdd > CArr[I])
MinOdd = CArr[I];
}
foreach (string EachStr in SArr) {
int[] SplitArr = EachStr.Split(' ').Select(X => int.Parse(X)).ToArray();
if (SplitArr[0] == 1) {
long wkCnt = 0;
if (Query1SellCntDict.ContainsKey(SplitArr[1])) {
wkCnt = Query1SellCntDict[SplitArr[1]];
}
if (SplitArr[1] % 2 == 1) {
wkCnt += Type2SellCnt;
}
wkCnt += Type3SellCnt;
wkCnt += SplitArr[2];
if (wkCnt <= CArr[SplitArr[1] - 1]) {
if (Query1SellCntDict.ContainsKey(SplitArr[1])) {
Query1SellCntDict[SplitArr[1]] += SplitArr[2];
}
else {
Query1SellCntDict[SplitArr[1]] = SplitArr[2];
}
long RestCnt = CArr[SplitArr[1] - 1] - wkCnt;
if (MinAll > RestCnt) MinAll = RestCnt;
if (MinOdd > RestCnt && SplitArr[1] % 2 == 1) MinOdd = RestCnt;
}
}
if (SplitArr[0] == 2) {
if (MinOdd >= SplitArr[1]) {
MinOdd -= SplitArr[1];
if (MinAll > MinOdd) MinAll = MinOdd;
Type2SellCnt += SplitArr[1];
}
}
if (SplitArr[0] == 3) {
if (MinAll >= SplitArr[1]) {
MinAll -= SplitArr[1];
MinOdd -= SplitArr[1];
Type3SellCnt += SplitArr[1];
}
}
}
long SellCnt = Query1SellCntDict.Values.Sum();
int OddCnt = CArr.Length % 2 == 0 ? CArr.Length / 2 : CArr.Length / 2 + 1;
SellCnt += OddCnt * Type2SellCnt;
SellCnt += CArr.Length * Type3SellCnt;
Console.WriteLine(SellCnt);
}
}
解説
タイプごとの販売回数や、最小枚数などを管理してます。
遅延セグ木2つを使う解もあります。