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
AC × 1
AC × 31
AC × 61
AC × 96
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