Submission #1180263


Source Code Expand

#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;

// #define DEBUG      1
#define REP(i,n)   for(int i=0; i<(int)(n); i++)
#define FOR(i,b,e) for(int i=(b); i<=(int)(e); i++)
#define DUMP(a, n) REP(i, n) printf("%d%c", a[i], i + 1 == n ? '\n' : ' ')

//------------------------------------------------------------------------------
typedef long long ll;

struct Node {
  Node *l, *r;
  int i, w;
  ll c;
  Node(int i, int w, ll c) : i(i), w(w), c(c) {
    l = r = (Node *)0;
  }
};

Node *meld(Node *a, Node *b) {
  if (!a) return b;
  if (!b) return a;

  if (a->w > b->w) swap(a, b);
  a->r = meld(a->r, b);
  swap(a->l, a->r);

  return a;
}

Node *push(Node *root, Node *x) {
  return meld(root, new Node(*x));
}

Node *pop(Node *root) {
  Node *p = root;
  root = meld(root->r, root->l);
  delete p;
  return root;
}

#ifdef DEBUG
void dump(Node *x) {
  if (!x) return;
  printf ("  Node[%d] : w = %d, c = %lld\n", x->i, x->w, x->c);
  dump(x->l);
  dump(x->r);
}
#endif

//------------------------------------------------------------------------------
const int N_MAX = 100000;

struct qe {
  int w, i, j;
  bool operator < (const qe &e) const {
    return w > e.w;
  }
};

int n;
int w[N_MAX];

Node *nodes[N_MAX];
Node *heaps[N_MAX];
int left[N_MAX];

int merge_weight(Node *a, Node *b) {
  return a->w + b->w;
}

ll merge_cost(Node *a, Node *b) {
  return a->c + b->c + a->w + b->w;
}

Node *merge_node(Node *a, Node *b) {
  return new Node(a->i, merge_weight(a, b), merge_cost(a, b));
}

int fetch(int k) {
  while (true) {
    if (!heaps[k]) return -1;
    Node *a = heaps[k];
    int i = a->i;
    Node *b = nodes[i];
    bool check = (b && b->w == a->w);
    heaps[k] = pop(heaps[k]);
    if (check) return i;
  }
}

int left_end(int i) {
  if (heaps[i]) return i;
  return left[i] = left_end(left[i]);
}

void solve() {
  priority_queue<qe> pq;

  // make nodes
  REP(i, n) nodes[i] = new Node(i, w[i], 0);
  // build heaps for each adjacent node pair
  REP(i, n - 1) {
    int j = i + 1;
    heaps[i] = push(heaps[i], nodes[i]);
    heaps[i] = push(heaps[i], nodes[j]);
    left[j] = i;
    pq.push((qe) { merge_weight(nodes[i], nodes[j]), i, j });
  }

  REP(s, n - 1) {
    int i, j;
    Node *a, *b;

    // find lowest cost node pair
    while (true) {
      qe p = pq.top(); pq.pop();
      i = p.i; j = p.j;
      a = nodes[i]; b = nodes[j];
      if (a && b && merge_weight(a, b) == p.w) break;
    }
    // merge destination
    int k = left_end(a->c ? i : left[i]);

#ifdef DEBUG
    printf("i: %d, j: %d, k: %d\n", i, j, k);
#endif

    // merge nodes
    nodes[i] = merge_node(a, b); nodes[j] = 0;
    delete a; delete b;

    // merge heaps
    if (heaps[i] && k != i) {      // i is leaf and left heap of i exists
      heaps[k] = meld(heaps[k], heaps[i]);
      heaps[i] = 0; left[i] = k;
    }
    if (heaps[j] && k != j) {      // j is leaf and right heap of j exists
      heaps[k] = meld(heaps[k], heaps[j]);
      heaps[j] = 0; left[j] = k;
    }

    // add merged node
    heaps[k] = push(heaps[k], nodes[i]);

    // choose new heap's top 2 lowest cost nodes
    i = fetch(k);
    do { j = fetch(k); } while (j == i);
    if (j < 0) break;
    if (i > j) swap(i, j);
    a = nodes[i]; b = nodes[j];
    pq.push((qe) { merge_weight(a, b), i, j });
    heaps[k] = push(heaps[k], a);
    heaps[k] = push(heaps[k], b);
#ifdef DEBUG
    puts("Nodes:"); REP(r, n) dump(nodes[r]);
    REP(r, n) if (heaps[r]) { printf("heap[%d]:\n", r); dump(heaps[r]); }
#endif
  }

  // output final node's cost
  printf("%lld\n", nodes[0]->c);
}

void input() {
  scanf("%d", &n);
  REP(i, n) scanf("%d", w + i);
}

int main() {
  input();
  solve();
  return 0;
}

Submission Info

Submission Time
Task C - 最適二分探索木
User nejiko96
Language C++14 (GCC 5.4.1)
Score 101
Code Size 3710 Byte
Status AC
Exec Time 126 ms
Memory 17844 KB

Compile Error

./Main.cpp: In function ‘void input()’:
./Main.cpp:170:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &n);
                  ^
./Main.cpp:171:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   REP(i, n) scanf("%d", 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 1 ms 256 KB
01_00.txt AC 1 ms 256 KB
01_01.txt AC 1 ms 256 KB
01_02.txt AC 1 ms 256 KB
01_03.txt AC 1 ms 256 KB
01_04.txt AC 1 ms 256 KB
01_05.txt AC 1 ms 256 KB
01_06.txt AC 1 ms 256 KB
01_07.txt AC 1 ms 256 KB
01_08.txt AC 1 ms 256 KB
01_09.txt AC 1 ms 256 KB
01_10.txt AC 1 ms 256 KB
01_11.txt AC 1 ms 256 KB
01_12.txt AC 1 ms 256 KB
01_13.txt AC 1 ms 256 KB
01_14.txt AC 1 ms 256 KB
01_15.txt AC 1 ms 256 KB
01_16.txt AC 1 ms 256 KB
01_17.txt AC 1 ms 256 KB
01_18.txt AC 1 ms 256 KB
01_19.txt AC 1 ms 256 KB
01_20.txt AC 1 ms 256 KB
01_21.txt AC 1 ms 256 KB
01_22.txt AC 1 ms 256 KB
01_23.txt AC 1 ms 256 KB
01_24.txt AC 1 ms 256 KB
01_25.txt AC 1 ms 256 KB
01_26.txt AC 1 ms 256 KB
01_27.txt AC 1 ms 256 KB
01_28.txt AC 1 ms 256 KB
01_29.txt AC 1 ms 256 KB
02_00.txt AC 3 ms 768 KB
02_01.txt AC 3 ms 768 KB
02_02.txt AC 3 ms 768 KB
02_03.txt AC 3 ms 768 KB
02_04.txt AC 3 ms 768 KB
02_05.txt AC 3 ms 768 KB
02_06.txt AC 3 ms 768 KB
02_07.txt AC 3 ms 768 KB
02_08.txt AC 3 ms 768 KB
02_09.txt AC 3 ms 768 KB
02_10.txt AC 3 ms 768 KB
02_11.txt AC 3 ms 768 KB
02_12.txt AC 3 ms 768 KB
02_13.txt AC 3 ms 768 KB
02_14.txt AC 3 ms 768 KB
02_15.txt AC 3 ms 768 KB
02_16.txt AC 3 ms 768 KB
02_17.txt AC 3 ms 768 KB
02_18.txt AC 3 ms 768 KB
02_19.txt AC 3 ms 768 KB
02_20.txt AC 3 ms 768 KB
02_21.txt AC 3 ms 768 KB
02_22.txt AC 3 ms 768 KB
02_23.txt AC 3 ms 768 KB
02_24.txt AC 3 ms 768 KB
02_25.txt AC 3 ms 768 KB
02_26.txt AC 3 ms 768 KB
02_27.txt AC 3 ms 768 KB
02_28.txt AC 3 ms 768 KB
02_29.txt AC 3 ms 768 KB
03_00.txt AC 108 ms 17844 KB
03_01.txt AC 123 ms 17844 KB
03_02.txt AC 117 ms 17844 KB
03_03.txt AC 126 ms 17844 KB
03_04.txt AC 113 ms 17844 KB
03_05.txt AC 97 ms 17844 KB
03_06.txt AC 111 ms 17844 KB
03_07.txt AC 111 ms 17844 KB
03_08.txt AC 110 ms 17844 KB
03_09.txt AC 107 ms 17844 KB
03_10.txt AC 102 ms 17844 KB
03_11.txt AC 109 ms 17844 KB
03_12.txt AC 113 ms 17844 KB
03_13.txt AC 111 ms 17844 KB
03_14.txt AC 110 ms 17844 KB
03_15.txt AC 105 ms 17844 KB
03_16.txt AC 109 ms 17844 KB
03_17.txt AC 121 ms 17844 KB
03_18.txt AC 108 ms 17844 KB
03_19.txt AC 113 ms 17844 KB
03_20.txt AC 112 ms 17844 KB
03_21.txt AC 113 ms 17844 KB
03_22.txt AC 105 ms 17844 KB
03_23.txt AC 120 ms 17844 KB
03_24.txt AC 108 ms 17844 KB
03_25.txt AC 116 ms 17844 KB
03_26.txt AC 111 ms 17844 KB
03_27.txt AC 113 ms 17844 KB
03_28.txt AC 110 ms 17844 KB
03_29.txt AC 124 ms 17844 KB
03_30.txt AC 122 ms 17844 KB
03_31.txt AC 109 ms 17844 KB
03_32.txt AC 111 ms 17844 KB
03_33.txt AC 107 ms 17844 KB
03_34.txt AC 105 ms 17844 KB