解いた問題

7/12/2012

Codeforces Round #129 (Div. 2)

ABCDを解いた。

A: やるだけ
B: どういう数列に変化させるのが最適かは簡単に分かる。1ステップでは出来る限り範囲をインクリメントするべき。
C: dp[ n桁目 ][ 最後に使った数字 ][ 小さくなったか ][ 最初の非 0 の数字 ]
D: やるだけ

以下、本番で投げたコード



A
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

int main(int argc, char *argv[])
{
  int n;
  while (cin >> n) {
    int m[n];
    for (int i = 0; i < n; ++i) {
      cin >> m[i];
    }

    const string S = "Still Rozdil";

    const int *mn = min_element(m, m + n);
    if (count(m, m + n, *mn) == 1) cout << mn - m + 1 << endl;
    else cout << S << endl;
  }
  return 0;
}

B
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

int main(int argc, char *argv[])
{
  lli n;
  while (cin >> n) {
    lli m[n];
    for (int i = 0; i < n; ++i) {
      cin >> m[i];
    }

    lli x[n];
    x[0] = m[0];
    for (int i = 1; i < n; ++i) {
      x[i] = max(x[i - 1], m[i]);
    }

    lli diff[n];
    for (int i = 0; i < n; ++i) {
      diff[i] = x[i] - m[i];
    }

    lli sum = 0;

    lli y = 0;
    for (int i = 0; i < n; ++i) {
      if (diff[i] <= y) y = diff[i];
      else {
        sum += diff[i] - y;
        y = diff[i];
      }
    }

    cout << sum << endl;
  }
  return 0;
}


C
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

const int D = 20;

vector<int> v;

lli memo[D][11][11][12];
lli rec(int d, int last, bool small, int first)
{
  lli &ret = memo[d][last][small][first];
  if (ret != -1) return ret;
  if (v.size() == d) return ret = (last == first);

  lli sum = 0;

  if (small) {
    for (int i = 0; i <= 9; ++i) {
      sum += rec(d + 1, i, true, (first == 11 && i ? i : first));
    }
  } else {
    for (int i = 0; i <= v[d]; ++i) {
      sum += rec(d + 1, i, i < v[d], (first == 11 && i ? i : first));
    }
  }

  return ret = sum;
}

lli f(lli n)
{
  v.clear();
  while (n) {
    v.push_back(n % 10LL);
    n /= 10LL;
  }
  reverse(v.begin(), v.end());

  fill(&memo[0][0][0][0], &memo[D][0][0][0], -1);
  return rec(0, 10, false, 11);
}

int main(int argc, char *argv[])
{
  lli small, large;
  while (cin >> small >> large) {
    cout << f(large) - f(small - 1) << endl;
  }
  return 0;
}


D
#include <algorithm>
#include <complex>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <deque>
#include <set>
#include <sstream>
#include <stack>
#include <vector>

#include <cassert>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define REP(i, n) for(int i=0; i<(int)n; ++i)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define ALL(c) (c).begin(),(c).end()
#define each(i, c) FOR(i, c)

typedef long long int lli;

using namespace std;

int main(int argc, char *argv[])
{
  int n;
  while (cin >> n) {
    map<lli, lli> F, B;
    pair<lli, lli> p[n];

    for (int i = 0; i < n; ++i) {
      cin >> p[i].first >> p[i].second;
      ++F[p[i].first];
      if (p[i].first != p[i].second) ++B[p[i].second];
    }

    const lli H = (n + 1) / 2;

    const lli inf = 1LL << 60;
    lli mn = inf;

    for (int i = 0; i < n; ++i) {
      if (H <= F[p[i].first] + B[p[i].first]) {
        lli cost = (H - F[p[i].first]);
        mn = min(mn, cost);
      }
      if (H <= F[p[i].second] + B[p[i].second]) {
        lli cost = (H - F[p[i].second]);
        mn = min(mn, cost);
      }
    }
    mn = max(mn, 0LL);
    cout << (mn == inf ? -1 : mn) << endl;
  }
  return 0;
}