AOJ0600 Baumkuchen

Baumkuchen | Aizu Online Judge

Introduction to Programming Introduction to Algorithms and Data Structures Library of Data Structures Library of Graph Algorithms Library of Computational Geometry Library of Dynamic Programming Library of Number Theory

円環を切って2つ繋げて表現する.未満の切り込み間の大きさの和として持っておく.区間ピースに分けた時の最小値,もう1つの切れ込みを入れる場所を と置くと,

ピースに分けることになる.区間を最小にしたいので,その区間の大きさを初めて超える場所をlower_boundで取ってくる.後は取ってきた場所からまでの和がよりも大きければ良い.もしをこれを満たすようなら,右端を伸ばしてみて,ダメだったら左端を縮める.

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int main() {
  int n;
  cin >> n;

  vector<ll> v(n);
  rep(i, n) cin >> v[i];

  vector<ll> sum(2*n + 1);
  rep(i, n) {
      sum[i+1] += sum[i] + v[i];
  }

  rep(i, n) {
      sum[n+i+1] += sum[n + i] + v[i];
  }

  ll ans = 0;
  int s = 0, t = 0,cnt = 0;
  bool flag = true, first = true;

  while(true) {
      if(flag) t++;
      else s++;

      if(s + n >= sum.size()) break;

      ll d = sum[t] - sum[s];
      int id = lower_bound(sum.begin(), sum.end(), sum[t]  + (sum[t] - sum[s])) - sum.begin();

      if(s + n > id && d < sum[s+n] - sum[id]) {
          ans = max(ans, d);
          flag = true;
      } else {
          flag = false;
      }
  }

  cout << ans << endl;

  return 0;
}
Mar 10th, 2016