Gobble up pudding

プログラミングの記事がメインのブログです。

MENU

競技プログラミング メモ

スポンサードリンク

f:id:fa11enprince:20150730082309j:plain
まだまだ競技プログラミングは初心者です(´・ω・`)。
とりあえずテンプレがあったほうがいいのでテンプレをメモります。
すごいのになるとマクロの嵐ですよね…あれはすごい。

とりあえずテンプレ

using namespace std;
namespace patch
{
    const int Failed = -1;

    template <typename T>
    string to_string(const T &n)
    {
        ostringstream stm;
        stm << n;
        return stm.str();
    }

    int stoi(const string &str)
    {
        int ret;
        istringstream iss(str);
        iss >> ret;
        if (iss.fail())
        {
            throw Failed;
        }
        return ret;
    }
    vector<string> split(const string &str)
    {
        istringstream iss(str);
        vector<string> ret;
        copy(
            istream_iterator<string>(iss),
            istream_iterator<string>(),
            back_inserter(ret));
        return ret;
    }
    vector<string> split(const string &str, char delim)
    {
        istringstream iss(str);
        string tmp;
        vector<string> res;
        while (getline(iss, tmp, delim))
        {
            res.push_back(tmp);
        }
        return res; 
    }
}

int main()
{
    ios::sync_with_stdio(false);

    return 0;
}

あとは今日覚えたやつで便利なやつ。
ちょっと速度稼ぎたいためにvectorの2次元の場合で
最初から必要な分を確保する書き方…これは便利(*´Д`)
もちろん中身が構造体とかでも問題ない。

vectorで多次元の初期化方法

#include <iostream>
#include <vector>

using namespace std;

enum MKind
{
    Road = 0,
    Wall = 1
};

struct Maze
{
    MKind kind;
    int state;
};

int main()
{
    const int X = 5;
    const int Y = 10;
    // 10 x 5の二次元のvectorを作成
    vector<vector<Maze>> m(X, vector<Maze>(Y, {MKind::Road, 0}));
    
    for (int y = 0; y < Y; y++)
    {
        for (int x = 0; x < X; x++)
        {
            if (y == 0 || y == Y - 1) m[x][y].kind = MKind::Wall;
            if (x == 0 || x == X - 1) m[x][y].kind = MKind::Wall;
            cout << m[x][y].kind << " ";
        }
        cout << '\n';
    }
    return 0;    
}

vectorで多次元配列を作る場合の初期化 - naoya_t@topcoder - TopCoder部
に書いてありました。