[bzoj4003][JLOI2015]城池攻占_左偏树】的更多相关文章

城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城池的奖励增加自己的战斗力.具体地:每一个城池有一个flag和一个val,表示成功到达这个城市的骑士的战斗力会乘上val还是加上val.每个骑士都只会向根节点进攻.输出每个骑士败北的城市编号.如果这个骑士成功到达根节点,输出0. 注释:$1\le n,m \le 3\cdot 10^5$,$-10^{…
左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子  或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+1. 本题就是对于每个节点都建立一颗左偏树(小根堆),存的是在当前节点的骑士,从下往上模拟题意就行了. 1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int N = 3e5 + 10; 5 int n, m;…
传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的骑士的攻击力都大于等于当前城池的生命值,同时维护城池和骑士的答案 然后修改的话在堆顶打一个标记,需要的时候下传即可 //minamoto #include<bits/stdc++.h> #define ll long long using namespace std; #define getc()…
题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城池…
BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么…
用左偏树模拟攻占的过程,维护最小值,最多入和出m次,每次log复杂度. #include<bits/stdc++.h> using namespace std; ; typedef long long ll; ll w[N],v[N],mul[N],add[N],h[N]; int l[N],r[N],dis[N],flag[N],c[N],rt[N],head[N],f[N],d[N],die[N],a[N],n,m,cnt; struct edge { int to,nex; }e[N&l…
罗马游戏 bzoj-1455 题目大意:给你n个人,2种操作,m次操作:1.将i号士兵所在的集合的最小值删除 2.合并i和j两个士兵所在的团体 注释:$1\le n\le 10^6$,$1\le m \le 10^5$. 想法:又是GXZlegend讲课,可并堆中的左偏树.了解一下: 一个具有堆性质的二叉树满足任意一个节点x中,dis[lson[x]]>=dis[rson[x]],其中,dis表示当前节点一直走右儿子的最长步数.合并是递归合并,我们通过递归处理一两个节点为根节点的左偏树的合并,显…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池…
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到splay每次实际上只需要取出最小的元素判断是否牺牲,这显然可以用堆维护. 关于可并堆打标记:和线段树打标记一样,维护乘法标记a和加法标记b,所有元素表示为ax+b,用同样的方法下传. 注意merge前要先push. #include<cstdio> #include<algorithm&g…
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可 以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城…
这题有两种做法来着... 第一种就是一开始想到的比较不靠谱,不过貌似可以过掉: 看从$1$号节点开始到$p$号节点最大需要的体力,记录单调上升的体力,询问的时候二分跳着走就可以了 不过精度问题还有可能爆double什么的QAQ 于是写了一半果断弃疗...结果有人说他过了[摔 第二种是正解,对于每个点我们可以先把下面的骑士都先做完然后还活着的全部搞到这个点上来,然后再看有谁死在这个点上了 所以我们要维护能都删除/查询最小值,合并,允许打标记的数据结构 貌似是可并堆喵![完结撒花~ /*******…
看着百度文库学习了一个. 总的来说,左偏树这个可并堆满足 堆的性质 和 左偏 性质. bzoj2809: [Apio2012]dispatching 把每个忍者先放到节点上,然后从下往上合并,假设到了这个点 总值 大于 预算,那么我们把这个 大根堆 的堆顶弹掉就好了,剩下的就是可合并堆. 感谢prey :) #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define drep(i,…
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城池以后,…
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领…
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺…
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦.没事,那接下来我来完全把这道题搞透. 左偏树总结 Part 1 理解题目 至少我一开始不知道为什么要用左偏树,甚至我看题解一开始也都没弄懂,所以先把题目弄清楚. 首先我们由题可以知道,这要求我们从建好的树的叶子节点开始往上推,有些骑士到特定的点才会出现,check一下骑士能否攻占城池,再记录进答案…
目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown 思路 类似线段树2的pushdown,不过是套在了左偏树 其他也就没啥了 ans1直接删除统计 ans2就初始深度-死亡深度(树的路径唯一嘛) ps:深度可以在dfs的时候顺便求出来 就这样 错误&&反思 一开始20,死活不对 最后又是手贱n写成m 还是20 又经过漫长debug(不会造树da…
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始终保持右边堆的深度比左边堆的小一些以保证复杂度,大概因为这个所以也叫左偏树吧. 这个题我最开始看错题目了所以看板子的时候一头雾水满脑子都是“这个实现有问题吧”,然后又看了一遍题目发现没问题骑士就是往上走的. 这道题是把每个点建一个堆然后从叶子到根向上传递+去掉没法再往上的,复杂度大概是O(nlogn…
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/stdc++.h> using namespace std; 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+…
原来左偏树还可以打tag,get了 和线段树打tag一样,时不时Push_Down就好了 然后这里显然也是要先乘法后加法的 tag打上了之后还是其他一般左偏树差不多,有些细节注意一下 然后开 long long!!! #include<bits/stdc++.h> #define int long long #define writeln(x) write(x),puts("") #define writep(x) write(x),putchar(' ') using n…
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\(v_i>0\) 上面这句话很重要(或者说去掉这句话就可以出成一道新题) 我们考虑在每个节点上都维护一个最小堆 每次移动时我们让在堆中的所有骑士一起移动 这样我们知道:如果堆顶的骑士可以占领成功 那么这个堆里剩下的所有骑士都一定能够占领成功 如果堆顶元素无法占领我们就删去这个堆顶的元素,这样我们最多…
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为…
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可…
[题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h,则可攻破这个城市,并前往它的管辖地(即树上的父亲),同时,战斗力s发生如下变化: ①如被攻占城市a=0,则s+=v: ②如果a=0,s*=v. 输出:每个骑士能够攻占的城市数量,以及每个城市有多少个骑士牺牲了. [思路] 昨天写了一遍这道题,当时用的是DFS,今天用拓扑重写一遍.思路如下: 从下往…
左偏树打个标记,没了. #include <cstdio> #include <vector> using namespace std; typedef long long ll; ; int n,m,e,x,tt,c[N],d[N],a[N],hd[N],nxt[N],to[N],rt[N],f[N],g[N]; ll h[N],v[N],s[N]; vector<int> vc[N]; struct nd {int l,r,d,id; ll w,ad,mu;}t[N…
浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4003 从下往上合并左偏树然后把战斗力低的踢掉.做完之后打标记.因为不会乘负数所以小根堆的性质不会被破坏. 不知道为什么用\(struct\)封装左偏树会\(RE\),改成\(namespace\)之后才\(AC\). 时间复杂度:\(O(nlogn)\) 空间复杂度:\(O(n)\) 代码…
题意:有n座城池,m个人: 每座城池有一个耐久度: 每座城池有一个父亲城池(肯定会形成一棵树),还有flag base (这个看题意) 每个人有一个战力值和一个开始进攻的城池序号: 问:1.每个城池能够使将领死亡的死亡数 2.每个将领能够攻占的城池数量: 思路,这道题是一颗树,所以自然而然的想到用dfs传到根节点,再传回去这种做法: 那么在这种做法下,我们建立最小堆,对每一个节点建立一个最小堆,然后遍历的时候,将小于limit[]的将领弹出: 这个时候需要更新答案, 这个城池的将领死亡数量+1:…
题目 小铭铭最近获得了一副新的桌游,游戏中需要用 \(m\) 个骑士攻占 \(n\) 个城池.这 \(n\) 个城池用 \(1\) 到 \(n\) 的整数表示.除 \(1\) 号城池外,城池 \(i\) 会受到另一座城池 \(f_i\) 的管辖,其中 \(f_i < i\).也就是说,所有城池构成了一棵有根树.这 \(m\) 个骑士用 \(1\) 到 \(m\) 的整数表示,其中第 \(i\) 个骑士的初始战斗力为 \(s_i\),第一个攻击的城池为 \(c_i\). 每个城池有一个防御值 \(…
我觉得我要改一下签名了……怎么会有窝这么啰嗦的人呢? 做这题需要先学习左偏树<左偏树的特点及其应用> 然后做一下POJ3666,这题的简单版. 思路: 考虑一下维护中位数的过程原数组为A,找到的不降数列为B当对于A的前n个数已经找好了最优解B[1…n],可知此时A被分成很多块,并被一些大顶堆记录,假设第i块有num个数,那么第i个堆维护这一块的最小的(num+1)/2个数,堆顶即为中位数.假设已经处理好前7个数,被分为两块 ([a,b],c,d) ([h,e],f) (每一块按升序排列,[]中…
PS:参考了黄源河的论文<左偏树的特点及其应用> 题目描述:给定一个整数序列\(a_1, a_2, - , a_n\),求一个递增序列\(b_1 < b_2 < - < b_n\),使得序列\(a_i\)和\(b_i\)的各项之差的绝对值之和 \(|a_1 - b_1| + |a_2 - b_2| + - + |a_n - b_n|\) 最小. 不难发现两条性质: ①:若原序列a满足\(a_1 < a_2 < - < a_n\),显然最优情况为\(b_i=a…