トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

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引いた値を求めてます。