城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城池的奖励增加自己的战斗力.具体地:每一个城池有一个flag和一个val,表示成功到达这个城市的骑士的战斗力会乘上val还是加上val.每个骑士都只会向根节点进攻.输出每个骑士败北的城市编号.如果这个骑士成功到达根节点,输出0. 注释:$1\le n,m \le 3\cdot 10^5$,$-10^{…
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 个骑士的初始战斗力为…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池…
题目 小铭铭最近获得了一副新的桌游,游戏中需要用 \(m\) 个骑士攻占 \(n\) 个城池.这 \(n\) 个城池用 \(1\) 到 \(n\) 的整数表示.除 \(1\) 号城池外,城池 \(i\) 会受到另一座城池 \(f_i\) 的管辖,其中 \(f_i < i\).也就是说,所有城池构成了一棵有根树.这 \(m\) 个骑士用 \(1\) 到 \(m\) 的整数表示,其中第 \(i\) 个骑士的初始战斗力为 \(s_i\),第一个攻击的城池为 \(c_i\). 每个城池有一个防御值 \(…
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可 以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城…
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到splay每次实际上只需要取出最小的元素判断是否牺牲,这显然可以用堆维护. 关于可并堆打标记:和线段树打标记一样,维护乘法标记a和加法标记b,所有元素表示为ax+b,用同样的方法下传. 注意merge前要先push. #include<cstdio> #include<algorithm&g…
用左偏树模拟攻占的过程,维护最小值,最多入和出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…
这题有两种做法来着... 第一种就是一开始想到的比较不靠谱,不过貌似可以过掉: 看从$1$号节点开始到$p$号节点最大需要的体力,记录单调上升的体力,询问的时候二分跳着走就可以了 不过精度问题还有可能爆double什么的QAQ 于是写了一半果断弃疗...结果有人说他过了[摔 第二种是正解,对于每个点我们可以先把下面的骑士都先做完然后还活着的全部搞到这个点上来,然后再看有谁死在这个点上了 所以我们要维护能都删除/查询最小值,合并,允许打标记的数据结构 貌似是可并堆喵![完结撒花~ /*******…
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 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,如果一个骑士的战斗力大于等于城池的生命值,那么…
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦.没事,那接下来我来完全把这道题搞透. 左偏树总结 Part 1 理解题目 至少我一开始不知道为什么要用左偏树,甚至我看题解一开始也都没弄懂,所以先把题目弄清楚. 首先我们由题可以知道,这要求我们从建好的树的叶子节点开始往上推,有些骑士到特定的点才会出现,check一下骑士能否攻占城池,再记录进答案…
浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4003 从下往上合并左偏树然后把战斗力低的踢掉.做完之后打标记.因为不会乘负数所以小根堆的性质不会被破坏. 不知道为什么用\(struct\)封装左偏树会\(RE\),改成\(namespace\)之后才\(AC\). 时间复杂度:\(O(nlogn)\) 空间复杂度:\(O(n)\) 代码…
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城池以后,…
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 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,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领…
BZOJ 4003 需要实现一个可并堆. 每个点维护一个小根堆,然后一开始把所有骑士加入到它所在的点的小根堆当中,实际上空间是$O(m)$的,然后我们从上到下不断合并这个小根堆,合并完之后如果遇到堆顶小于当前城市的防御值就弹掉堆顶顺便记录答案. 对于那些攻占掉城池对骑士的贡献的处理,可以采用打标记的方式实现,在合并的时候$down$一下就好了.注意$down$要写在$merge$函数的最上面,因为有一些点还没有下传标记就被$merge$掉了. 要注意弹出堆顶元素之前要先$down$一下 . 最后…
小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 到 n 的整数表示.除 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 到 m 的整数表示,其 中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可 以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城池以后,骑士的战斗力…
传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始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,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺牲.占领一个城池以后,…
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi <i.也就是说,所有城池构成了一棵有根树.这 m 个骑士用 1 到 m 的整数表示,其中第 i 个骑士的初始战斗力为 si,第一个攻击的城池为 ci. 每个城池有一个防御值 hi,如果一个骑士的战斗力大于等于城池的生命值,那么骑士就可以占领这座城池:否则占领失败,骑士将在这座城池牺…
目录 题目 思路 错误&&反思 代码 题目 luogu 原来左偏树真的能懒惰下放 那这篇博客应该要咕咕了 一开始我按照那篇博客想了一下,感觉emm,还是瞄了一眼看到了pushdown 思路 类似线段树2的pushdown,不过是套在了左偏树 其他也就没啥了 ans1直接删除统计 ans2就初始深度-死亡深度(树的路径唯一嘛) ps:深度可以在dfs的时候顺便求出来 就这样 错误&&反思 一开始20,死活不对 最后又是手贱n写成m 还是20 又经过漫长debug(不会造树da…
题目大意:有$n$个点的树,第$i$个节点有一个权值$h_i$,$m$个骑士,第$i$个骑士攻击力为$v_i$,一个骑士可以把从它开始的连续的父亲中比它小的节点攻破,攻破一个节点可以把攻击力加或乘一个数(乘的数大于$0$)(每个骑士独立),问每个骑士可以攻破多少个点,每个点会阻挡住多少个骑士. 题解:可以把所有骑士一起考虑,建一个小根堆,存可以攻打到这个点的骑士,每个若堆顶小于该点,就弹出,写一个打标记的可并堆就行了. 卡点:快读中读入$long\;long$的部分返回值变成$int$ C++…
题意 有一棵树\(n\)个节点,每个节点有一个防御值,以及两个属性,表示一个骑士占领该节点后攻击值是加还是乘,有\(m\)个骑士,有初始位置和初始攻击值,如果攻击值大于该节点的防御值,就能占领该节点,然后更新攻击值,走到父节点,如果攻击值小于防御值,骑士就会死在该节点. 问每个骑士能占领多少个节点,以及每个节点分别有多少个骑士死在那里. 分析 第一个问题,考虑对每一个节点,如果我们能知道所有能到达该节点的骑士以及他们的攻击力,显然攻击力小于该节点防御值的就是死在这个节点的骑士. 这部分骑士分为两…
左偏树还是满足堆的性质,节点距离就是离最近的外节点(无左或者右儿子  或者二者都没有)的距离,左偏性质就是一个节点左儿子的距离不小于右儿子,由此得:节点距离等于右儿子的距离+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;…
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在需要遍历到这个点之前push_down就可以了 #include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> using nam…
思路 左偏树维护每个骑士的战斗力和加入的深度(因为只能向上跳) 注意做乘法的时候加法tag会受到影响 代码 #include <cstdio> #include <algorithm> #include <cstring> #define int long long using namespace std; struct Node{ int lson,rson,dis,num,mul,add,add_dep,sz,fa,id; }LT[300100]; int n,m,…
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始终保持右边堆的深度比左边堆的小一些以保证复杂度,大概因为这个所以也叫左偏树吧. 这个题我最开始看错题目了所以看板子的时候一头雾水满脑子都是“这个实现有问题吧”,然后又看了一遍题目发现没问题骑士就是往上走的. 这道题是把每个点建一个堆然后从叶子到根向上传递+去掉没法再往上的,复杂度大概是O(nlogn…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子树信息: 先乘后加,和带乘法的线段树一个方法: 如果秒 WA 的话,把读入全写成 %lld 就好了... 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm>…
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就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…