備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 2242

さっき1つ問題を解きました。

Era Name | Aizu Online Judge

西暦を昭和○○年というように元号を用いて表示しなおしましょうという問題。
元号、それが何年間続いたか、それが終わったのは何年かが入力で与えられます。

解答はこちら。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
   
using namespace std;
 
int main()
{
    int n, q;
    while(1){
        cin >> n >> q;
        if(n == 0 && q == 0) break;
        map<string, pair<long long int, long long int> > era;
        string inputs[1000];
        long long int by, wy;
        for(int i = 0; i < n; i++){
            cin >> inputs[i] >> by >> wy;
            era[inputs[i]] = make_pair<long long int, long long int>(wy - (by - 1), wy);
        }
        long long int query;
        for(int i = 0; i < q; i++){
            cin >> query;
            for(int j = 0; j < n; j++){
                if(era[inputs[j]].first <= query && era[inputs[j]].second >= query){
                    cout << inputs[j] << " " << query - era[inputs[j]].first + 1 << endl;
                    break;
                } else if(j == n - 1){
                    cout << "Unknown" << endl;
                }
            }
        }
    }
    return 0;
}

mapとpairを用いました。mapのキーを元号にし、値をその元号が始まった年と終わった年のpairにしました。元号はinputsにも保存されています。
ある元号において、queryが始まった年以上終わった年以下であった場合はその元号と何年なのかを表示します。n個探しても見つからなかった時にはUnknownを表示するようにしています。

途中long long int型にするのを忘れていたりiとjを書き間違えていたりでちょこちょこつまりましたがけっこうスッと解けました。
ただ単純な作りなのでCPU timeがかなり長くなりました。年を昇順とかに並び替えておいたらもっと早くできたかも。