BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)
题意
略
分析
稍微yy一下可以感觉就是一个不同子树合并堆,然后考场上写了一发左偏树,以为100分美滋滋.然而发现自己傻逼了,两个堆一一对应合并后剩下的一坨直接一次合并进去就行了.然鹅我这个sb把所有元素pop一次再merge进去…然后就O(n2)O(n^2)O(n2) 60分滚粗了…
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
时间复杂度分析:
- 每个点只会被pop出去一次,pop的时候伴随了一次pop一次merge.
- 每一对父子关系merge了一次
所以时间复杂度是O(nlogn)O(nlogn)O(nlogn)的.
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
template<class T>inline void read(T &res) {
char ch; while(!isdigit(ch=getchar()));
for(res=ch-'0';isdigit(ch=getchar());res=res*10+ch-'0');
}
const int MAXN = 200005;
int n, w[MAXN], fir[MAXN], to[MAXN], nxt[MAXN], cnt;
inline void add(int u, int v) { to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; }
struct LT {
int ls, rs, dis;
}t[MAXN];
inline int merge(int x, int y) {
if(!x || !y) return x + y;
if(w[x] < w[y]) swap(x, y);
t[x].rs = merge(t[x].rs, y);
if(t[t[x].rs].dis > t[t[x].ls].dis)
swap(t[x].ls, t[x].rs);
t[x].dis = t[t[x].rs].dis + 1;
return x;
}
inline int pop(int x) {
int l = t[x].ls, r = t[x].rs;
t[x].dis = t[x].ls = t[x].rs = 0;
return merge(l, r);
}
inline int dfs(int x) {
int u = 0, tmp;
t[x].dis = t[x].ls = t[x].rs = 0;
for(int i = fir[x], v; i; i = nxt[i]) {
v = dfs(to[i]);
tmp = 0;
while(u && v) {
int tmp1 = u; u = pop(u);
int tmp2 = v; v = pop(v);
tmp = merge(tmp, w[tmp1] > w[tmp2] ? tmp1 : tmp2);
}
if(u) tmp = merge(tmp, u);//就是这里我 sb地 pop出来又 push进去
if(v) tmp = merge(tmp, v);
u = tmp;
}
return merge(u, x);
}
int main () {
read(n);
for(int i = 1; i <= n; ++i) read(w[i]);
for(int i = 2, x; i <= n; ++i) read(x), add(x, i);
t[0].dis = -1;
int rt = dfs(1);
LL ans = 0;
while(rt) ans += w[rt], rt = pop(rt);
printf("%lld\n", ans);
}
BZOJ 5494: [2019省队联测]春节十二响 (左偏树 可并堆)的更多相关文章
- bzoj 5499: [2019省队联测]春节十二响【堆】
首先看两条链怎么合并,贪心可得是从大到小取max,多条链同理 所以dfs合并子树的大根堆即可,注意为了保证复杂度,合并的时候要合并到最长链上,证明见长链剖分 #include<iostream& ...
- 【BZOJ5499】[2019省队联测]春节十二响(贪心)
[BZOJ5499][2019省队联测]春节十二响(贪心) 题面 BZOJ 洛谷 题解 如果是一条折链,显然维护两侧的值,每次两个堆分别弹出一个\(max\)然后合并一下,最后再放回去就可以了. 那么 ...
- P5290 [十二省联考2019]春节十二响
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...
- P5290 [十二省联考2019]春节十二响(堆+启发式合并)
P5290 [十二省联考2019]春节十二响 从特殊到一般 我们先看链的情况. 我们把点$1$左右的两条子链分别扔入堆里 每次取出两个堆的最大值,把答案累加上更大的那个(另一堆为空则直接加上去). 那 ...
- BZOJ 5495: [2019省队联测]异或粽子 (trie树)
这题果然是原题[BZOJ 3689 异或之].看了BZOJ原题题解,发现自己sb了,直接每个位置维护一个值保存找到了以这个位置为右端点的第几大,初始全部都是1,把每个位置作为右端点能够异或出来的最大值 ...
- bzoj 5498: [2019省队联测]皮配【dp】
是个神仙dp-- 参考:https://www.luogu.org/blog/xzz-233/solution-p5289 设f[i][j][k]是前i个有限制的城市,所有学校中选蓝色阵营有j人,有限 ...
- bzoj 5496: [2019省队联测]字符串问题【SAM+拓扑】
有一个想法就是暴力建图,把每个A向有和他相连的B前缀的A,然后拓扑一下,这样的图是n^2的: 考虑优化建图,因为大部分数据结构都是处理后缀的,所以把串反过来,题目中要求的前缀B就变成了后缀B 建立SA ...
- bzoj 5495: [2019省队联测]异或粽子【可持久化trie+大根堆】
和bzoj4504差不多,就是换了个数据结构 像超级钢琴一样把五元组放进大根堆,每次取一个出来拆开,(d,l,r,p,v)表示右端点为d,左端点区间为(l,r),最大区间和值为v左端点在p上 关于怎么 ...
- BZOJ 5495: [2019省队联测]异或粽子 可持久化trie+堆
和超级钢琴,异或之三倍经验 $?$ 堆+贪心素质三连 $?$ 好无聊...... code: #include <bits/stdc++.h> #define N 500006 #defi ...
随机推荐
- MVC-初识
RAZOR视图介绍 一个cshtml,主体是一个html文本,里面可以写前台和后台代码,混合编写(个人认为不太好,应该分离),这个文件最后会被会被编译为一个类(所以他可以像类一样写一些方法,其他的地方 ...
- ora00972标识符过长
oracle10G对于表名的长度限制是30个字节 表名超过30结果不能创建,提示ora00972-标识符过长. 需要将表名控制在30个字节以内
- C/C+面试题一:找出字符串中出现最多的字符和次数,时间复杂度小于O(n^2)
已知字符串"aabbbcddddeeffffghijklmnopqrst"编程找出出现最多的字符和次数,要求时间复杂度小于O(n^2) /********************* ...
- C语言 - cJSON解析特定格式 含有数组array类型的数据
在ESP32中使用了cJSON库,发现很好用.最近服务器端的JSON格式越来越多样,还是有些注意点,需要做下笔记记录下来. cJSON *MAC_arry = cJSON_GetObjectItem( ...
- Python print函数详解
1 """ 2 print(...) 3 print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fals ...
- Linux 系统下提取 ShellCode
未完待续 1.使用C语言编写一个获得系统Shell的小程序. #include <unistd.h> int main() { char * shell[2]; shell[0]=&quo ...
- Java 中的锁原理、锁优化、CAS、AQS 详解!
来源:jianshu.com/p/e674ee68fd3f 1.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 2.锁实现的基本原理 2.1.volatile Java编程语言允 ...
- tcpdump使用的心得
这个linux的抓包工具确实用的不多,这段时间由于处理现场的问题所以就需要这个工具,主要是要知道网卡的信息. 命令就是 tcpdump -i 网卡名
- C#projectPropertyGrid 显示结构(展开逗号分隔)
[TypeConverter(typeof(ExpandableObjectConverter))] public A MyA { get{..} set{..} }
- js监听audio播放完毕
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...