Manthan, Codefest 16D Fibonacci-ish

Problem - D - Codeforces

Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if You are given some sequence of integers . Your task is rearrange elements of this sequence in such a way that its longest possible prefix is Fibonacci-ish sequence.

やることは, 選び,シュミレーションする.本番中はpretest 3でTLEを出して,これじゃあ間に合わないと考えていたが,単純にを考慮していないためだった.
最初に をはじいて,全てのみのパターンか最初にをつけるパターンのみでいいと思っていたが,途中でを経由するパターンも普通にあってそこに気づかなかった.
またsetに突っ込んでその数があるかを確認していたけど,同じ数が出てくるパターンがあるので最初にどの数が何個あるかをmapで持たなければいけなかった.
stackに積んでおけば後に続く項の個数が分かるので

とかやるのかな思ったけど,(a, b)にいたるまでに使ってきた数が違えば後に続く項も違いダメだった.

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
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>
#include <stack>

#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);
  map<ll, int> m;
  set<int> st;

  rep(i, n) {
      cin >> v[i];
      m[v[i]]++;
      st.insert(v[i]);
  }

  int ans = m[0];
  rep(i, n) {
      rep(j, n) {
          ll a = v[i], b = v[j], c;

          if(i == j) continue;
          if(a == 0 && b == 0) continue;

          m[a]--;
          m[b]--;

          stack<ll> S;
          S.push(a);
          S.push(b);

          while(st.find(a + b) != st.end() && m[a + b] > 0) {
                  c = a + b;
                  a = b;
                  b = c;

                  m[c]--;
                  S.push(c);
          }

          ans = max(ans, (int)S.size());

          while(S.size()) {
              m[S.top()]++;
              S.pop();
          }
      }
  }

  cout << ans << endl;

  return 0;
}