P5280 [ZJOI2019]线段树】的更多相关文章

  https://www.luogu.org/problemnew/show/P5280 省选的时候后一半时间开这题,想了接近两个小时的各种假做法,之后想的做法已经接近正解了,但是有一些细节问题理不清楚(事实证明出来后再给我2个小时也还是没理清楚,只能说自己naive),而且也码不完,打了个20分暴力 参考资料:题解 首先,可以分开考虑各个点 对于每个点,考虑对于t次修改,每一次标记为启用或不启用(共有$2^t$种标记方案),其中有多少种标记方案使得这个点最后有tag 询问的答案就是每个点的答…
送我退役的神题,但不得不说是ZJOIDay1最可做的一题了 先说一下考场的ZZ想法以及出来后YY的优化版吧 首先发现每次操作其实就是统计出增加的节点个数(原来的不会消失) 所以我们只要统计出线段树上每个节点在进行了\(t\)次操作(有\(2^t\)棵树)是某个点为\(1\)的总个数,令这个值为\(f_x\) 然后考场上用了一种记录该节点+左儿子+右儿子状态的方法,这样可以把答案的贡献全部算到这个点上 但是这样细节巨多且容易算重(漏),所以考场上码了\(200+\)行最后没调出大样例 后来想了一种…
题目链接:洛谷 题目描述:[比较复杂,建议看原题] 这道题太神仙了,线段树上做树形dp. 根据树形dp的套路,都是按照转移的不同情况给节点分类.这里每次modify的时候对于节点的影响也不同,所以我们考虑分类. (这里借用一张图,%%%sooke大佬) 我们发现每次modify的时候对节点的影响有这5种节点.(因为每棵线段树的形态一致,所以我们只用一棵线段树) 一类点(白色):在 modify 操作中,被半覆盖的点. 二类点(深灰):在 modify 操作中,被全覆盖的点,并且能被遍历到. 三类…
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树分裂成两棵线段树",我们事实上大可不必真的把线段树一分为二,可以看作对于操作集合 \(S\) 的所有子集 \(S'\subseteq S\) 计算出执行 \(S'\) 中的操作后线段树上有多少个节点 tag 为 \(1\). 其次建好线段树,我们考虑一次操作 \([l,r]\) 会对哪些节点产生影响…
传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\)函数入手,寻找一些性质. (盗一张Sooke的图) 可以发现每次\(modify\)之中,所有节点都可以被分成5类: 白色:经过而且标记全都被下传的点. 黑色:打上标记的点. 灰色:在修改区域内但不会被经过的点. 橙色:可以享受到来自上方标记的滋润的点. 黄色:半毛钱关系都没有的点-- 分类之后,…
题面 传送门 题解 考场上就这么一道会做的其它连暴力都没打--活该爆炸-- 首先我们得看出问题的本质:有\(m\)个操作,总共\(2^m\)种情况分别对应每个操作是否执行,求这\(2^m\)棵线段树上\(tag\)为\(1\)的节点个数 那么很明显得转化为每个节点在多少种情况里\(tag\)为\(1\) 对于一个操作\([ql,qr]\),我们把线段树上所有节点分成四类考虑 1.如果\(ql\leq l\&\&qr\geq r\),且该节点被访问到,那么不管之前操作序列怎么样,只要执行了当…
题目大意 一开始有一棵线段树,然后有一个操作序列,问执行这个操作序列的所有子集时线段树上有标记的节点个数和. 题解 其实我们把它除以\(2^m\)后发现就是有标记节点的期望个数. 然后套路的根据期望的线性性,我们要统计所有点有标记的概率和. 然后我们来讨论一些情况: 1.当前节点和修改区间没有交且当前节点的父亲节点也没有交,那么这个点的标记就不会动. 2.当前节点被修改区间包含且父亲节点也被包含,那根本碰不到这个节点,也不会动. 3.当前节点被修改区间包含且父亲节点没有被包含,那么这个节点一定会…
容易发现相当于求2m种操作序列所得的每种线段树tag数量之和.显然考虑每个点的贡献,也即有多少种方案会使该点上有tag.可以将点分为四类: 1.修改时被经过且有儿子被修改的节点 2.修改时被经过且没有儿子被修改的节点 3.修改时未被经过且有兄弟被修改的节点 4.修改时未被经过且没有兄弟被修改的节点 考虑一次修改对这些点的影响.设该次操作之前已进行p次修改.易得: 1.方案数不变 2.方案数+2p 3.方案数+修改前该点到根路径(包括该点自身)上有tag的方案数 4.方案数*2 只要考虑维护3类点…
点此看题面 大致题意: 给你一棵线段树,两种操作.一种操作将每棵线段树复制成两个,然后在这两个线段树中的一个上面进行\(Modify(l,r)\).另一种操作询问所有线段树的\(tag\)总和. 大力分类讨论 我们考虑用线段树来进行维护. 定义一个\(f_{rt}\),表示在当前所有线段树中编号为\(rt\)的节点上的\(tag\)之和. 然后对于每次修改,就需要大力分类讨论,来计算新增加的\(2^{t-1}\)棵树对\(f_x\)的贡献. 当这个节点未被访问到 显然,就相当于此次操作对该节点没…
题目分析: 这题除了分类讨论就没啥了... 容易发现问题实际就是所有操作选和不选按顺序执行的所有答案和.考虑每个点在多少种情况下会有tag. 那么,考虑新插入一个[l,r],所有有交集的点都会被清空,所以这些点答案不变. 然后考虑有交集的点中间[l',r']是子集关系的点,这些点答案并不是不变,而是答案加了$2^{cnt-1}$,$cnt$为已执行的1操作数. 然后没被遍历到的点答案*2. 然后遍历到的点中间没有任何交集的点,答案数加的就是前面的操作方案中他到根的路径中间有tag的这个点的数量.…