首页 > TAG信息列表 > P3261
[堆][启发式合并]luogu P3261 [JLOI2015]城池攻占
题面 https://www.luogu.com.cn/problem/P3261 分析 考虑对于每个点开堆维护子树中到达这里的所有人的攻击力 对于攻击力改变可以用标记数组给堆打上标记 自下向上合并时,选择较小的堆合并给较大的堆,注意修改每个节点对应的堆编号 当一个值要合并入一个有标记的堆时,直接给这个值除P3261 [JLOI2015]城池攻占 可并堆
题意: 戳这里 分析: 又是一道巨佬秒切了的题 我们以每个城市作为一个小根堆,把骑士作为元素,每次弹出不符合的元素之后 向自己的 \(fa\) 进行合并,同时更新堆内的每一个元素 注意特判堆是否为空 代码: #include<bits/stdc++.h> #define lc t[rt].ls #define rc t[rt].rs #define pb pushP3261 [JLOI2015]城池攻占 题解
题目 小铭铭最近获得了一副新的桌游,游戏中需要用 \(m\) 个骑士攻占 \(n\) 个城池。这 \(n\) 个城池用 \(1\) 到 \(n\) 的整数表示。除 \(1\) 号城池外,城池 \(i\) 会受到另一座城池 \(f_i\) 的管辖,其中 \(f_i < i\)。也就是说,所有城池构成了一棵有根树。这 \(m\) 个骑士用 \(1\) 到P3261 [JLOI2015]城池攻占 [贪心,左偏树]
板子吧,左偏树合并是 1log 的,按照深度合并,而且可以打 tag,pushdown。 // by Isaunoya #include<bits/stdc++.h> #define int long long using namespace std; struct io { char buf[1 << 27 | 3], *s; int f; io() { f = 0, buf[fread(s = buf, 1, 1 << 27, stdin)] = '「Luogu P3261 && LOJ 2107」城池攻占
小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池。这 n 个城池用 1 到 n 的整数表示。除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i。也就是说,所有城池构成了一棵有根树。这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个