AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC037-C 億マス計算
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("2 3");
WillReturn.Add("2 3");
WillReturn.Add("3 5");
//10
}
else if (InputPattern == "Input2") {
WillReturn.Add("3 7");
WillReturn.Add("1 2 1");
WillReturn.Add("2 1 2");
//2
}
else if (InputPattern == "Input3") {
WillReturn.Add("4 8");
WillReturn.Add("701687787 500872619 516391519 599949380");
WillReturn.Add("458299111 633119409 377269575 717229869");
//317112176525562171
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static long mK;
static long[] mAArr;
static long[] mBArr;
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
mK = wkArr[1];
mAArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
mBArr = InputList[2].Split(' ').Select(pX => long.Parse(pX)).ToArray();
Array.Sort(mAArr);
Array.Sort(mBArr);
long L = 0;
long R = mAArr.Max() * mBArr.Max();
while (L + 1 < R) {
long Mid = (L + R) / 2;
if (IsUpperOrEqual(Mid)) {
R = Mid;
}
else {
L = Mid;
}
}
Console.WriteLine(R);
}
// Valを引数として、順位がK位、または、K位より悪いか判定
static bool IsUpperOrEqual(long pVal)
{
// 引数と同じか、良い順位の値の件数
long LowerOrEqualCntSum = 0;
foreach (long EachA in mAArr) {
long CurrLowerOrEqualCnt = DeriveLowerOrEqualCnt(pVal, EachA);
LowerOrEqualCntSum += CurrLowerOrEqualCnt;
if (LowerOrEqualCntSum >= mK) return true;
}
return LowerOrEqualCntSum >= mK;
}
// ValとAArrの要素を引数として、BArrとの積がVal以下になる件数を返す
static long DeriveLowerOrEqualCnt(long pVal, long pA)
{
// 初項がpVal超えの特殊ケース
if (mBArr[0] * pA > pVal) {
return 0;
}
// 末項がpVal以下の特殊ケース
if (mBArr.Last() * pA <= pVal) {
return mBArr.Length;
}
long L = 0;
long R = mBArr.GetUpperBound(0);
while (L + 1 < R) {
long Mid = (L + R) / 2;
long MidVal = mBArr[Mid] * pA;
if (MidVal <= pVal) {
L = Mid;
}
else {
R = Mid;
}
}
return L + 1;
}
}
解説
値に対する順位の単調性をふまえて、二分探索してます。
類題