SRM 474 250pt: RouteIntersection

問題概要

N(<10^9)次元空間の原点にいる。順に、A[i]次元の値をinc(or dec)していく(命令長<50)。途中に同じ点を通ったかどうか求める問題。

考えたこと

  • (何か見たことはあるけどもはや通したかどうかとか覚えていない)
  • vectorをセットに突っ込んでいく?でもNがでかいから無理っぽい。
  • どうせほとんど0なんだから座標圧縮すれば良い。
  • 一番実装が楽なのはmapをsetに突っ込むことだろう。
  • 無事通った。

practiceで通ったコード

#include <string>
#include <vector>
#include <map>
#include <set>
using namespace std;

struct RouteIntersection {

	string isValid(int N, vector <int> coords, string moves) {
		map<int,int> dict;
		set<map<int,int> > ss;

		//touch
		for(int i=0; i<(int)coords.size(); i++){
			dict[coords[i]] = 0;
		}

		ss.insert(dict);
		for(int i=0; i<(int)coords.size(); i++){
			dict[coords[i]] += moves[i] == '+' ? 1 : -1;
			ss.insert(dict);
		}

		return ss.size() == coords.size() + 1 ? "VALID" : "NOT VALID";
	}

};