TopCoder SRM 620 Div1 Easy PairGame [1人競技プログラミング Advent Calendar 2016 19日目]
遅れを取り戻した…。
この記事は1人競技プログラミング Advent Calendar 2016 19日目の記事です。
問題概要:
TopCoder Statistics - Problem Statement
解いた方法:
逆から戻していき、一致する初期座標を探す。
#include<bits/stdc++.h> #define MP make_pair #define PB push_back #define ALL(x) (x).begin(),(x).end() #define REP(i,n) for(int i=0;i<(n);i++) #define REP1(i,n) for(int i=1;i<(n);i++) #define REP2(i,d,n) for(int i=(d);i<(n);i++) #define RREP(i,n) for(int i=(n);i>=0;i--) #define CLR(a) memset((a),0,sizeof(a)) #define MCLR(a) memset((a),-1,sizeof(a)) #define RANGE(x,y,maxX,maxY) (0 <= (x) && 0 <= (y) && (x) < (maxX) && (y) < (maxY)) using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef vector<int> VI; typedef vector<VI> VVI; typedef vector<string> VS; typedef vector<LL> VLL; typedef pair<int,int> PII; const int INF = 0x3f3f3f3f; const LL INFL = 0x3f3f3f3f3f3f3f3fLL; const double EPS = 1e-9; const int DX[]={1,0,-1,0},DY[]={0,-1,0,1}; class PairGame { public: int a; int b; int c; int d; int maxSum(int _aa, int _bb, int _cc, int _dd) { a = _aa, b = _bb, c = _cc, d = _dd; if(a == b && b == c && c == d) return a*2; if(a == b && c == d) return -1; vector<PII> ab; while(0 < a && 0 < b){ ab.PB(MP(a, b)); if(a < b){ b -= a; }else{ a -= b; } } set<PII> cd; while(0 < c && 0 < d){ cd.insert(MP(c, d)); if(c < d){ d -= c; }else{ c -= d; } } REP(i, ab.size()){ if(cd.count(ab[i]) == 0) continue; return ab[i].first + ab[i].second; } return -1; } };