제출 #122884

#제출 시각아이디문제언어결과실행 시간메모리
122884diamond_dukeFireworks (APIO16_fireworks)C++11
100 / 100
469 ms21368 KiB
#include <algorithm>
#include <cstdio>
using ll = long long;
int lson[1200005], rson[1200005], dep[1200005], t_cnt;
ll val[1200005];
int merge(int u, int v)
{
	if (!u || !v)
		return u | v;
	if (val[u] < val[v])
		std::swap(u, v);
	rson[u] = merge(rson[u], v);
	if (dep[lson[u]] < dep[rson[u]])
		std::swap(lson[u], rson[u]);
	dep[u] = rson[u] ? dep[rson[u]] + 1 : 0;
	return u;
}
inline int new_node(ll x) { val[++t_cnt] = x; return t_cnt; }
void pop(int &u) { u = merge(lson[u], rson[u]); }
int fa[600005], faw[600005], son[600005], rt[600005];
int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	ll ans = 0;
	for (int i = 1; i < n + m; i++)
	{
		scanf("%d%d", fa + i, faw + i);
		son[--fa[i]]++;
		ans += faw[i];
	}
	for (int u = n + m - 1; u; u--)
	{
		ll x = 0, y = 0;
		if (u < n)
		{
			while (--son[u])
				pop(rt[u]);
			y = val[rt[u]];
			pop(rt[u]);
			x = val[rt[u]];
			pop(rt[u]);
		}
		rt[u] = merge(rt[u], merge(new_node(x + faw[u]), new_node(y + faw[u])));
		rt[fa[u]] = merge(rt[fa[u]], rt[u]);
	}
	while (son[0]--)
		pop(rt[0]);
	while (rt[0])
	{
		ans -= val[rt[0]];
		pop(rt[0]);
	}
	printf("%lld\n", ans);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

fireworks.cpp: In function 'int main()':
fireworks.cpp:24:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
fireworks.cpp:28:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", fa + i, faw + i);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...