Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
4068K 235MS 1A 要写静態树不然可能T(没试过)#include <iostream> #include <stdio.h> #include <queue> using namespace std; struct node{ node *left, *right; int weight; } pool[200002]; struct push_node{ int bh; int weight; }; bool operator<(const node &n1, const node &n2){ return n1.weight > n2.weight; } bool operator<(const push_node &pn1, const push_node &pn2){ return pn1.weight > pn2.weight; } int getSum(node *root, int depth){ if(root->left){ return getSum(root->left, depth+1) + getSum(root->right, depth+1); } return root->weight * depth; } int main() { int T; scanf("%d", &T); for(int ii = 0; ii < T; ii++){ int n; scanf("%d", &n); int poolCnt = 0; priority_queue<push_node> pq; for(int i = 0; i < n; i++){ int temp; scanf("%d", &temp); pool[poolCnt].weight = temp; pool[poolCnt].left = NULL; pool[poolCnt].right = NULL; push_node pn; pn.bh = poolCnt; pn.weight = temp; pq.push(pn); poolCnt++; } node *root; for(int i = 0; i < n-1; i++){ push_node pn1 = pq.top(); pq.pop(); push_node pn2 = pq.top(); pq.pop(); pool[poolCnt].weight = pn1.weight + pn2.weight; pool[poolCnt].left = &pool[pn1.bh]; pool[poolCnt].right = &pool[pn2.bh]; if(i == n-2){ root = &pool[poolCnt]; } else{ push_node pn; pn.bh = poolCnt; pn.weight = pool[poolCnt].weight; pq.push(pn); } poolCnt++; } printf("%d\n", getSum(root, 0)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator