Submission #691178
Source Code Expand
#include <string> #include <vector> #include <algorithm> #include <numeric> #include <set> #include <map> #include <queue> #include <iostream> #include <sstream> #include <cstdio> #include <cmath> #include <ctime> #include <cstring> #include <cctype> #include <cassert> #include <limits> #include <functional> #define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i)) #define rer(i,l,u) for(int (i)=(int)(l);(i)<=(int)(u);++(i)) #define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i)) #if defined(_MSC_VER) || __cplusplus > 199711L #define aut(r,v) auto r = (v) #else #define aut(r,v) typeof(v) r = (v) #endif #define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it) #define all(o) (o).begin(), (o).end() #define pb(x) push_back(x) #define mp(x,y) make_pair((x),(y)) #define mset(m,v) memset(m,v,sizeof(m)) #define INF 0x3f3f3f3f #define INFL 0x3f3f3f3f3f3f3f3fLL using namespace std; typedef vector<int> vi; typedef pair<int, int> pii; typedef vector<pair<int, int> > vpii; typedef long long ll; typedef vector<long long> vl; typedef pair<long long, long long> pll; typedef vector<pair<long long, long long> > vpll; typedef vector<string> vs; typedef long double ld; template<typename T, typename U> inline void amin(T &x, U y) { if(y < x) x = y; } template<typename T, typename U> inline void amax(T &x, U y) { if(x < y) x = y; } namespace leftist_heap { typedef long long Val; typedef less<Val> Cmp; Cmp cmp = Cmp(); struct Node { Val val; Node *left, *right; int height; Node() {} Node(const Val &val_) : val(val_), left(NULL), right(NULL), height(0) {} }; Node *meld(Node *x, Node *y) { if(!x || !y) return x ? x : y; if(cmp(y->val, x->val)) swap(x, y); x->right = meld(x->right, y); if(!x->left || x->left->height < x->right->height) swap(x->left, x->right); x->height = (x->right ? x->right->height : 0) + 1; return x; } Node *pop(Node *x) { return meld(x->left, x->right); } } //参照: <http://www.cs.rit.edu/~std3246/thesis/> //参考: iwiwi氏のコード namespace hu_tacker { namespace heap = leftist_heap; typedef heap::Val Val; const Val InfVal = numeric_limits<Val>::max() / 2; Val fst(const heap::Node *t) { if(!t) return InfVal; return t->val; } Val snd(const heap::Node *t) { if(!t || (!t->left && !t->right)) return InfVal; if(!t->left) return t->right->val; if(!t->right) return t->left->val; return min(t->left->val, t->right->val); } Val optimalBinarySearchTree(vector<Val> w) { typedef pair<Val, int> P; int n = w.size(); vector<heap::Node> nodes(n - 1); vector<heap::Node*> hpq(n, NULL); vector<int> left(n), right(n); //番兵がある vector<Val> cost(n - 1); priority_queue<P, vector<P>, greater<P> > mpq; rep(i, n - 1) { left[i] = i - 1; right[i] = i + 1; mpq.push(make_pair(cost[i] = w[i] + w[i + 1], i)); } Val ans = 0; rep(k, n - 1) { Val c; int i; do { c = mpq.top().first; i = mpq.top().second; mpq.pop(); } while(right[i] == -1 || cost[i] != c); //ヒープでのdeleteに対応 bool ml = false, mr = false; if(w[i] + fst(hpq[i]) == c) { hpq[i] = heap::pop(hpq[i]); ml = true; } else if(w[i] + w[right[i]] == c) { ml = mr = true; } else if(fst(hpq[i]) + snd(hpq[i]) == c) { hpq[i] = heap::pop(heap::pop(hpq[i])); } else { hpq[i] = heap::pop(hpq[i]); mr = true; } ans += c; nodes[k] = heap::Node(c); hpq[i] = heap::meld(hpq[i], &nodes[k]); if(ml) w[i] = InfVal; if(mr) w[right[i]] = InfVal; if(ml && i > 0) { int j = left[i]; hpq[j] = heap::meld(hpq[j], hpq[i]); left[right[j] = right[i]] = j; right[i] = -1; i = j; } if(mr && right[i] + 1 < n) { int j = right[i]; hpq[i] = heap::meld(hpq[i], hpq[j]); left[right[i] = right[j]] = i; right[j] = -1; } Val v = w[i] + w[right[i]]; v = min(v, min(w[i], w[right[i]]) + fst(hpq[i])); v = min(v, fst(hpq[i]) + snd(hpq[i])); mpq.push(make_pair(cost[i] = v, i)); } return ans; } } int main() { int N; while(~scanf("%d", &N)) { vector<long long> w(N); rep(i, N) scanf("%lld", &w[i]); long long ans = hu_tacker::optimalBinarySearchTree(w); printf("%lld\n", ans); } return 0; }
Submission Info
Submission Time | |
---|---|
Task | C - 最適二分探索木 |
User | anta |
Language | C++14 (GCC 5.4.1) |
Score | 101 |
Code Size | 4275 Byte |
Status | AC |
Exec Time | 133 ms |
Memory | 8944 KB |
Compile Error
./Main.cpp: In function ‘int main()’: ./Main.cpp:155:33: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result] rep(i, N) scanf("%lld", &w[i]); ^
Judge Result
Set Name | Sample | Dataset1 | Dataset2 | Dataset3 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 50 / 50 | 50 / 50 | 1 / 1 | ||||||||
Status |
|
|
|
|
Set Name | Test Cases |
---|---|
Sample | 00_sample_01.txt |
Dataset1 | 00_sample_01.txt, 01_00.txt, 01_01.txt, 01_02.txt, 01_03.txt, 01_04.txt, 01_05.txt, 01_06.txt, 01_07.txt, 01_08.txt, 01_09.txt, 01_10.txt, 01_11.txt, 01_12.txt, 01_13.txt, 01_14.txt, 01_15.txt, 01_16.txt, 01_17.txt, 01_18.txt, 01_19.txt, 01_20.txt, 01_21.txt, 01_22.txt, 01_23.txt, 01_24.txt, 01_25.txt, 01_26.txt, 01_27.txt, 01_28.txt, 01_29.txt |
Dataset2 | 00_sample_01.txt, 01_00.txt, 01_01.txt, 01_02.txt, 01_03.txt, 01_04.txt, 01_05.txt, 01_06.txt, 01_07.txt, 01_08.txt, 01_09.txt, 01_10.txt, 01_11.txt, 01_12.txt, 01_13.txt, 01_14.txt, 01_15.txt, 01_16.txt, 01_17.txt, 01_18.txt, 01_19.txt, 01_20.txt, 01_21.txt, 01_22.txt, 01_23.txt, 01_24.txt, 01_25.txt, 01_26.txt, 01_27.txt, 01_28.txt, 01_29.txt, 02_00.txt, 02_01.txt, 02_02.txt, 02_03.txt, 02_04.txt, 02_05.txt, 02_06.txt, 02_07.txt, 02_08.txt, 02_09.txt, 02_10.txt, 02_11.txt, 02_12.txt, 02_13.txt, 02_14.txt, 02_15.txt, 02_16.txt, 02_17.txt, 02_18.txt, 02_19.txt, 02_20.txt, 02_21.txt, 02_22.txt, 02_23.txt, 02_24.txt, 02_25.txt, 02_26.txt, 02_27.txt, 02_28.txt, 02_29.txt |
Dataset3 | 00_sample_01.txt, 01_00.txt, 01_01.txt, 01_02.txt, 01_03.txt, 01_04.txt, 01_05.txt, 01_06.txt, 01_07.txt, 01_08.txt, 01_09.txt, 01_10.txt, 01_11.txt, 01_12.txt, 01_13.txt, 01_14.txt, 01_15.txt, 01_16.txt, 01_17.txt, 01_18.txt, 01_19.txt, 01_20.txt, 01_21.txt, 01_22.txt, 01_23.txt, 01_24.txt, 01_25.txt, 01_26.txt, 01_27.txt, 01_28.txt, 01_29.txt, 02_00.txt, 02_01.txt, 02_02.txt, 02_03.txt, 02_04.txt, 02_05.txt, 02_06.txt, 02_07.txt, 02_08.txt, 02_09.txt, 02_10.txt, 02_11.txt, 02_12.txt, 02_13.txt, 02_14.txt, 02_15.txt, 02_16.txt, 02_17.txt, 02_18.txt, 02_19.txt, 02_20.txt, 02_21.txt, 02_22.txt, 02_23.txt, 02_24.txt, 02_25.txt, 02_26.txt, 02_27.txt, 02_28.txt, 02_29.txt, 03_00.txt, 03_01.txt, 03_02.txt, 03_03.txt, 03_04.txt, 03_05.txt, 03_06.txt, 03_07.txt, 03_08.txt, 03_09.txt, 03_10.txt, 03_11.txt, 03_12.txt, 03_13.txt, 03_14.txt, 03_15.txt, 03_16.txt, 03_17.txt, 03_18.txt, 03_19.txt, 03_20.txt, 03_21.txt, 03_22.txt, 03_23.txt, 03_24.txt, 03_25.txt, 03_26.txt, 03_27.txt, 03_28.txt, 03_29.txt, 03_30.txt, 03_31.txt, 03_32.txt, 03_33.txt, 03_34.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
00_sample_01.txt | AC | 133 ms | 764 KB |
01_00.txt | AC | 4 ms | 256 KB |
01_01.txt | AC | 4 ms | 256 KB |
01_02.txt | AC | 4 ms | 256 KB |
01_03.txt | AC | 4 ms | 256 KB |
01_04.txt | AC | 5 ms | 256 KB |
01_05.txt | AC | 6 ms | 256 KB |
01_06.txt | AC | 4 ms | 256 KB |
01_07.txt | AC | 4 ms | 256 KB |
01_08.txt | AC | 6 ms | 256 KB |
01_09.txt | AC | 5 ms | 256 KB |
01_10.txt | AC | 4 ms | 256 KB |
01_11.txt | AC | 4 ms | 256 KB |
01_12.txt | AC | 4 ms | 256 KB |
01_13.txt | AC | 4 ms | 256 KB |
01_14.txt | AC | 4 ms | 256 KB |
01_15.txt | AC | 4 ms | 256 KB |
01_16.txt | AC | 4 ms | 256 KB |
01_17.txt | AC | 4 ms | 256 KB |
01_18.txt | AC | 4 ms | 256 KB |
01_19.txt | AC | 4 ms | 256 KB |
01_20.txt | AC | 4 ms | 256 KB |
01_21.txt | AC | 4 ms | 256 KB |
01_22.txt | AC | 4 ms | 256 KB |
01_23.txt | AC | 4 ms | 256 KB |
01_24.txt | AC | 4 ms | 256 KB |
01_25.txt | AC | 4 ms | 256 KB |
01_26.txt | AC | 4 ms | 256 KB |
01_27.txt | AC | 4 ms | 256 KB |
01_28.txt | AC | 5 ms | 256 KB |
01_29.txt | AC | 4 ms | 256 KB |
02_00.txt | AC | 6 ms | 512 KB |
02_01.txt | AC | 6 ms | 512 KB |
02_02.txt | AC | 7 ms | 512 KB |
02_03.txt | AC | 7 ms | 512 KB |
02_04.txt | AC | 8 ms | 512 KB |
02_05.txt | AC | 7 ms | 512 KB |
02_06.txt | AC | 10 ms | 512 KB |
02_07.txt | AC | 7 ms | 512 KB |
02_08.txt | AC | 7 ms | 512 KB |
02_09.txt | AC | 7 ms | 512 KB |
02_10.txt | AC | 7 ms | 512 KB |
02_11.txt | AC | 7 ms | 512 KB |
02_12.txt | AC | 7 ms | 512 KB |
02_13.txt | AC | 6 ms | 512 KB |
02_14.txt | AC | 7 ms | 512 KB |
02_15.txt | AC | 7 ms | 512 KB |
02_16.txt | AC | 6 ms | 512 KB |
02_17.txt | AC | 6 ms | 512 KB |
02_18.txt | AC | 6 ms | 512 KB |
02_19.txt | AC | 7 ms | 512 KB |
02_20.txt | AC | 6 ms | 512 KB |
02_21.txt | AC | 7 ms | 512 KB |
02_22.txt | AC | 6 ms | 512 KB |
02_23.txt | AC | 6 ms | 512 KB |
02_24.txt | AC | 7 ms | 512 KB |
02_25.txt | AC | 6 ms | 512 KB |
02_26.txt | AC | 7 ms | 512 KB |
02_27.txt | AC | 7 ms | 512 KB |
02_28.txt | AC | 6 ms | 512 KB |
02_29.txt | AC | 6 ms | 512 KB |
03_00.txt | AC | 118 ms | 8944 KB |
03_01.txt | AC | 115 ms | 8944 KB |
03_02.txt | AC | 119 ms | 8944 KB |
03_03.txt | AC | 115 ms | 8944 KB |
03_04.txt | AC | 115 ms | 8944 KB |
03_05.txt | AC | 99 ms | 8944 KB |
03_06.txt | AC | 114 ms | 8944 KB |
03_07.txt | AC | 122 ms | 8944 KB |
03_08.txt | AC | 120 ms | 8944 KB |
03_09.txt | AC | 116 ms | 8944 KB |
03_10.txt | AC | 113 ms | 8944 KB |
03_11.txt | AC | 118 ms | 8944 KB |
03_12.txt | AC | 123 ms | 8944 KB |
03_13.txt | AC | 125 ms | 8944 KB |
03_14.txt | AC | 119 ms | 8944 KB |
03_15.txt | AC | 119 ms | 8944 KB |
03_16.txt | AC | 117 ms | 8944 KB |
03_17.txt | AC | 131 ms | 8944 KB |
03_18.txt | AC | 116 ms | 8944 KB |
03_19.txt | AC | 123 ms | 8944 KB |
03_20.txt | AC | 122 ms | 8944 KB |
03_21.txt | AC | 118 ms | 8944 KB |
03_22.txt | AC | 115 ms | 8944 KB |
03_23.txt | AC | 133 ms | 8944 KB |
03_24.txt | AC | 118 ms | 8944 KB |
03_25.txt | AC | 125 ms | 8944 KB |
03_26.txt | AC | 126 ms | 8944 KB |
03_27.txt | AC | 123 ms | 8944 KB |
03_28.txt | AC | 118 ms | 8944 KB |
03_29.txt | AC | 133 ms | 8944 KB |
03_30.txt | AC | 128 ms | 8944 KB |
03_31.txt | AC | 121 ms | 8944 KB |
03_32.txt | AC | 123 ms | 8944 KB |
03_33.txt | AC | 120 ms | 8944 KB |
03_34.txt | AC | 116 ms | 8944 KB |