SRM 538 DIV1 Easy EvenRoute

http://apps.topcoder.com/stat?c=problem_statement&pm=11808&rd=14729

問題

整数座標が何個か与えられる(1<=N<=50 /\ -1000000<=X_i,Y_i<=1000000 /\ (X_i,Y_i)<>(0,0) /\ (i <> j -> (X_i, Y_i) <> (X_j, Y_j)))。
上下左右の整数座標にのみ進むことが出来る。
このとき、点(0,0)から出発し、与えられた座標を全て通り(順番等は任意)、与えられた座標のどれかで終わるようなルートを考える。
ブール値wantedParityが与えられた時、このルートの長さのなかで、そのwantedParityとMOD 2で同値であるもの(偶数か奇数か)があるかを判定しろ

回答
■□■□■□■
□■□■□■□
■□■□■□■
□■□◎□■□
■□■□■□■
□■□■□■□
■□■□■□■

"◎"が(0,0)とすると、奇数の長さのルートで行けるのは"□"だけで、偶数の長さのルートで行けるのは"■"だけである。
これは(x+y)mod 2 で判定できるが、
負の座標の場合にC++の剰余では結果が-1になりうるので((x+y)%2+2)%2とでもしておけばよいだろう。
そして、つまり最終的にどこにいるか、のみが偶奇に影響すするのであって、与えられた座標のどこかで止まらなければいけないのだから、つまり、与えられた座標のどれかがwantedParityと偶奇が一致すればいいのである。

コメント

剰余でのマイナス値は注意。今回は注意できたけど、Exampleは通るようだから恐らく本番ではさぞ落とされたことだろう?
たしかここらへんの回は本番でやった気がする。その時は落ちてた気がする。忘れたけど。

コード
#include <string>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i))
#define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i))
#define aut(v, x) __typeof(x) v = (x)
#define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it)
#define all(o) (o).begin(), (o).end()
#define pb(x) push_back(x)
#define mp(x,y) make_pair((x),(y))
#define mset(m,v) memset(m,v,sizeof(m))
using namespace std;
typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pii; typedef vector<pii> vpii;
const int INF = 0x3f3f3f3f; const ll INFL = 0x3f3f3f3f3f3f3f3fLL;

struct EvenRoute {
	string isItPossible(vector <int> x, vector <int> y, int wantedParity) {
		int n = x.size();
		rep(i, n) {
			if(((x[i] + y[i]) % 2 + 2) % 2 == wantedParity) return "CAN";
		}
		return "CANNOT";
	}
};