| 记录编号 |
259804 |
评测结果 |
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
2300.[APIO 2016] 烟花表演 |
最终得分 |
100 |
| 用户昵称 |
APIO棒子出题人 |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
5.622 s |
| 提交时间 |
2016-05-11 17:36:24 |
内存使用 |
7.17 MiB |
显示代码纯文本
/*
* Author: Gyeonggeun Kim(kriii)
* Time Complexity: O(N lg^2 N)
*/
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 300003;
priority_queue<long long> *Q[maxn];
int N,M,V,P[maxn],C[maxn],D[maxn]; long long E[maxn];
int main()
{
freopen("fireworks.in","r",stdin);
freopen("fireworks.out","w",stdout);
scanf ("%d %d",&N,&M);
V = N + M;
for (int i=2;i<=V;i++) scanf ("%d %d",&P[i],&C[i]);
for (int i=1;i<=V;i++) Q[i] = new priority_queue<long long>;
for (int i=V;i>=2;i--){
long long p = 0, q = 0;
if (D[i]){
for (int j=1;j<D[i];j++){
E[i] += Q[i]->top(); Q[i]->pop();
}
p = Q[i]->top(); Q[i]->pop();
q = Q[i]->top(); Q[i]->pop();
}
Q[i]->push(p+C[i]);
Q[i]->push(q+C[i]);
E[i] -= C[i];
priority_queue<long long> *&a = Q[i], *&b = Q[P[i]];
if (a->size() > b->size()) swap(a,b);
while (!a->empty()){
b->push(a->top()); a->pop();
}
E[P[i]] += E[i];
D[P[i]]++;
}
long long ans = E[1];
for (int i=0;i<D[1];i++){
ans += Q[1]->top(); Q[1]->pop();
}
printf ("%lld\n",ans);
return 0;
}