ferinの競プロ帳

競プロについてのメモ

SRM689 div1 easy ColorfulGarden

考えたこと

  • 互い違いにおいていくのが一色を多く置く方法っぽい
  • 一色でn個より多くあるのを条件を満たすようには置けない
  • 逆に全部n個以下なら適当に互い違いにおいていくだけで構成できる

割とすぐ思いつけた

ソースコード

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using VI = vector<int>;
using VVI = vector<VI>;
using PII = pair<int, int>;

#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
#define PB push_back

const ll LLINF = (1LL<<60);
const int INF = (1LL<<30);
const int MOD = 1000000007;

template <typename T> T &chmin(T &a, const T &b) { return a = min(a, b); }
template <typename T> T &chmax(T &a, const T &b) { return a = max(a, b); }
template <typename T> bool IN(T a, T b, T x) { return a<=x&&x<b; }
template<typename T> T ceil(T a, T b) { return a/b + !!(a%b); }

ll cnt[30];
class ColorfulGarden {
   public:
   vector <string> rearrange(vector <string> g)
  {
    ll n = g[0].size();
    memset(cnt, 0, sizeof(cnt));
    REP(i, 2) REP(j, n) cnt[g[i][j]-'a']++;

    vector<PII> p;
    REP(i, 26) {
      if(cnt[i] > n) return {};
      p.PB({cnt[i], i});
    }
    sort(ALL(p), greater<PII>());

    vector<PII> v;
    int turn = 0;
    REP(i, n) {v.PB({turn, i}); turn = !turn;}
    turn = 1;
    REP(i, n) {v.PB({turn, i}); turn = !turn;}

    vector<string> ret(2, string(n, 'a'));
    int idx = 0;
    REP(i, 26) {
      while(p[i].first) {
        ret[v[idx].first][v[idx].second] = (char)(p[i].second+'a');
        p[i].first--; idx++;
      }
    }

    return ret;
  }
};