トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
ABC-036-C 座圧
■■■問題■■■
N人の人が座っています。i番目の人の座圧はaiです。
すぬけ君は、大小関係を保存したまま座圧のデータを圧縮して保存することにしました。
以下の条件を満たす数列 b1 , ・・・ , bN を求めてください。
●biはすべて非負整数である。
●ai<aj ならば bi<bj である。
●ai=aj ならば bi=bj である。
●上の条件を満たす配列のうち、biの最大値が最小となる。
このような条件をみたすbは一意に定まることが知られています。
■■■入力■■■
N
a1
・
・
・
aN
●1 <= N <= 10万
●0 <= ai <= 10億
●aiは整数である。
■■■出力■■■
N行出力せよ。i行目にはbiを出力せよ。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("5");
WillReturn.Add("3");
WillReturn.Add("3");
WillReturn.Add("1");
WillReturn.Add("6");
WillReturn.Add("1");
//1
//1
//0
//2
//0
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
InputList.RemoveAt(0);
List<int> AList = new List<int>();
InputList.ForEach(X => AList.Add(int.Parse(X)));
//ソートしてDistinctした配列を作成
int[] wkArr = AList.OrderBy(X => X).Distinct().ToArray();
foreach (int EachA in AList) {
int wkInd = Array.BinarySearch(wkArr, EachA);
Console.WriteLine(wkInd);
}
}
}
解説
SQLの分析関数のdense_rankから1引いた値を求めてます。