AtCoderのARC
前のARCの問題へ
ARC182-A Chmax Rush!
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("8 3");
WillReturn.Add("1 8");
WillReturn.Add("8 1");
WillReturn.Add("2 1");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("8 3");
WillReturn.Add("8 1");
WillReturn.Add("1 8");
WillReturn.Add("1 2");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("241 82");
WillReturn.Add("190 3207371");
WillReturn.Add("229 3639088");
WillReturn.Add("61 4428925");
WillReturn.Add("84 17258698");
WillReturn.Add("34 42692503");
WillReturn.Add("207 59753183");
WillReturn.Add("180 67198566");
WillReturn.Add("78 99285033");
WillReturn.Add("60 102449991");
WillReturn.Add("234 122146510");
WillReturn.Add("111 126959145");
WillReturn.Add("141 152331579");
WillReturn.Add("78 159855439");
WillReturn.Add("11 169658471");
WillReturn.Add("22 189991287");
WillReturn.Add("37 204602946");
WillReturn.Add("73 209329065");
WillReturn.Add("72 215363269");
WillReturn.Add("152 236450854");
WillReturn.Add("175 237822921");
WillReturn.Add("22 261431608");
WillReturn.Add("144 252550201");
WillReturn.Add("54 268889550");
WillReturn.Add("238 276997357");
WillReturn.Add("69 313065279");
WillReturn.Add("226 330144323");
WillReturn.Add("6 335788783");
WillReturn.Add("126 345410019");
WillReturn.Add("220 348318997");
WillReturn.Add("166 365778763");
WillReturn.Add("142 382251905");
WillReturn.Add("200 406191336");
WillReturn.Add("234 392702679");
WillReturn.Add("83 409660987");
WillReturn.Add("183 410908761");
WillReturn.Add("142 445707116");
WillReturn.Add("205 470279207");
WillReturn.Add("230 486436406");
WillReturn.Add("156 494269002");
WillReturn.Add("113 495687706");
WillReturn.Add("200 500005738");
WillReturn.Add("162 505246499");
WillReturn.Add("201 548652987");
WillReturn.Add("86 449551554");
WillReturn.Add("62 459527873");
WillReturn.Add("32 574001635");
WillReturn.Add("230 601073337");
WillReturn.Add("175 610244315");
WillReturn.Add("174 613857555");
WillReturn.Add("181 637452273");
WillReturn.Add("158 637866397");
WillReturn.Add("148 648101378");
WillReturn.Add("172 646898076");
WillReturn.Add("144 682578257");
WillReturn.Add("239 703460335");
WillReturn.Add("192 713255331");
WillReturn.Add("28 727075136");
WillReturn.Add("196 730768166");
WillReturn.Add("111 751850547");
WillReturn.Add("90 762445737");
WillReturn.Add("204 762552166");
WillReturn.Add("72 773170159");
WillReturn.Add("240 803415865");
WillReturn.Add("32 798873367");
WillReturn.Add("195 814999380");
WillReturn.Add("72 842641864");
WillReturn.Add("125 851815348");
WillReturn.Add("116 858041919");
WillReturn.Add("200 869948671");
WillReturn.Add("195 873324903");
WillReturn.Add("5 877767414");
WillReturn.Add("105 877710280");
WillReturn.Add("150 877719360");
WillReturn.Add("9 884707717");
WillReturn.Add("230 880263190");
WillReturn.Add("88 967344715");
WillReturn.Add("49 977643789");
WillReturn.Add("167 979463984");
WillReturn.Add("70 981400941");
WillReturn.Add("114 991068035");
WillReturn.Add("94 991951735");
WillReturn.Add("141 995762200");
//682155965
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct PVInfoDef
{
internal long Pivot;
internal long Value;
internal HashSet<char> OKSet;
}
static List<PVInfoDef> mPVInfoList = new List<PVInfoDef>();
const long Hou = 998244353;
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => long.Parse(pX)).ToArray();
SplitAct(InputList[0]);
long N = wkArr[1];
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
PVInfoDef WillAdd;
WillAdd.Pivot = wkArr[0];
WillAdd.Value = wkArr[1];
WillAdd.OKSet = new HashSet<char> { 'L', 'R' };
mPVInfoList.Add(WillAdd);
}
int UB = mPVInfoList.Count - 1;
for (int I = 0; I <= UB; I++) {
long CurrPivot = mPVInfoList[I].Pivot;
long CurrValue = mPVInfoList[I].Value;
// LをRemove
for (int J = I + 1; J <= UB; J++) {
if (CurrValue <= mPVInfoList[J].Value) continue;
if (CurrPivot >= mPVInfoList[J].Pivot) {
mPVInfoList[I].OKSet.Remove('L');
mPVInfoList[J].OKSet.Remove('R');
}
}
// RをRemove
for (int J = I + 1; J <= UB; J++) {
if (CurrValue <= mPVInfoList[J].Value) continue;
if (CurrPivot <= mPVInfoList[J].Pivot) {
mPVInfoList[I].OKSet.Remove('R');
mPVInfoList[J].OKSet.Remove('L');
}
}
}
long Answer = 1;
foreach (PVInfoDef EachPVInfo in mPVInfoList) {
Answer *= EachPVInfo.OKSet.Count;
Answer %= Hou;
}
Console.WriteLine(Answer);
}
}
解説
問題を要約すると、
[1,軸] または [軸,UB]まで
の2つの区間の、どっちかを区間更新することの選択の繰り返しが
何通りかを調べる問題になります。
後続の更新値が、自分以上なら無視してよいですが
後続の更新値が、自分未満の場合は、
更新できる区間に縛りがかかります。
後は、最後に積の法則を使えば良いです。