いがメモ

プログラミング関連についてやったことの記録を書いていきます。

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;
    }
};