#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int MOD = 1000000007; struct Node { int lastUpdate; queue<int> *values; Node() : lastUpdate(-1), values(nullptr) { } }; inline void extendNodes(vector<Node> &v, int index) { if (index >= v.size()) for (int i = v.size(); i <= index; i++) v.emplace_back(Node()); } inline int getPrevValue(vector<Node> &v, int index, int updatedAt) { if (index >= v.size()) { return 0; } Node &n = v[index]; if (n.values == nullptr || n.values->empty() || (n.values->size() == 1 && n.lastUpdate == updatedAt)) return 0; if (n.values->size() == 1 || n.lastUpdate == updatedAt) return n.values->front(); return n.values->back(); } inline void updateNode(vector<Node> &v, int index, int value, int updatedAt) { int prevValue = getPrevValue(v, index, updatedAt); int newValue = (prevValue + value) % MOD; if (index >= v.size()) { extendNodes(v, index); } Node &n = v[index]; if (n.values == nullptr) { n.values = new queue<int>; } n.values->push(newValue); n.lastUpdate = updatedAt; if (n.values->size() == 3) { n.values->pop(); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int num; cin >> num; int MAX = 5000; vector<int> values; values.reserve(num); int val; for (int i = 0; i < num; i++) { cin >> val; values.push_back(val); } sort(values.begin(), values.end()); if (values[0] != 1) { cout << 0 << endl; return 0; } vector<Node> nodes; nodes.reserve(MAX * MAX); updateNode(nodes, 0, 1, 0); int maxIndex = 1; for (int i = 1; i < num; i++) { int value = values[i]; int valueIndex = value - 1; int newMaxIndex = maxIndex; for (int j = max(0, valueIndex - 1); j <= maxIndex; j++) { int prevSum = getPrevValue(nodes, j, i); if (prevSum > 0) { updateNode(nodes, valueIndex + j + 1, prevSum, i); newMaxIndex = max(newMaxIndex, valueIndex + j + 1); } } maxIndex = newMaxIndex; } int result = 0; for (int i = 0; i <= maxIndex; i++) { result = (result + getPrevValue(nodes, i, num + 1)) % MOD; } cout << result << endl; return 0; }
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int MOD = 1000000007; struct Node { int lastUpdate; queue<int> *values; Node() : lastUpdate(-1), values(nullptr) { } }; inline void extendNodes(vector<Node> &v, int index) { if (index >= v.size()) for (int i = v.size(); i <= index; i++) v.emplace_back(Node()); } inline int getPrevValue(vector<Node> &v, int index, int updatedAt) { if (index >= v.size()) { return 0; } Node &n = v[index]; if (n.values == nullptr || n.values->empty() || (n.values->size() == 1 && n.lastUpdate == updatedAt)) return 0; if (n.values->size() == 1 || n.lastUpdate == updatedAt) return n.values->front(); return n.values->back(); } inline void updateNode(vector<Node> &v, int index, int value, int updatedAt) { int prevValue = getPrevValue(v, index, updatedAt); int newValue = (prevValue + value) % MOD; if (index >= v.size()) { extendNodes(v, index); } Node &n = v[index]; if (n.values == nullptr) { n.values = new queue<int>; } n.values->push(newValue); n.lastUpdate = updatedAt; if (n.values->size() == 3) { n.values->pop(); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int num; cin >> num; int MAX = 5000; vector<int> values; values.reserve(num); int val; for (int i = 0; i < num; i++) { cin >> val; values.push_back(val); } sort(values.begin(), values.end()); if (values[0] != 1) { cout << 0 << endl; return 0; } vector<Node> nodes; nodes.reserve(MAX * MAX); updateNode(nodes, 0, 1, 0); int maxIndex = 1; for (int i = 1; i < num; i++) { int value = values[i]; int valueIndex = value - 1; int newMaxIndex = maxIndex; for (int j = max(0, valueIndex - 1); j <= maxIndex; j++) { int prevSum = getPrevValue(nodes, j, i); if (prevSum > 0) { updateNode(nodes, valueIndex + j + 1, prevSum, i); newMaxIndex = max(newMaxIndex, valueIndex + j + 1); } } maxIndex = newMaxIndex; } int result = 0; for (int i = 0; i <= maxIndex; i++) { result = (result + getPrevValue(nodes, i, num + 1)) % MOD; } cout << result << endl; return 0; } |