[BZOJ5312]冒险】的更多相关文章

题目链接 BZOJ5312: 冒险 题解 如果一次操作对区间& 和 区间| 产生的影响是相同的,那么该操作对整个区间的影响都是相同的 对于每次操作,在某些位上的值,对于整个区间影响是相同的,对相同影响的操作直接打标记 否则递归子树 复杂度证明: https://csacademy.com/contest/round-70/task/and-or-max/solution/ 代码 #include<cstdio> #include<algorithm> inline int…
记录区间and/or,修改时如果对整个区间影响都相同就打标记,否则递归.复杂度不太会证. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long #define N 200010 ')) c=g…
Description Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题, 只有答对了问题才能进入,守护神给出了一个自然数序列a,每次有一下三种操作. 1,给出l,r,x,将序列l,r之间的所有数都 and x 2,给出l,r,x,将序列l,r之间的所有数都 or x 3,给出l,r,询问l,r之间的最大值 Input 第一行包含两个整数 n,m 接下来一行包含 n 个整数, 表示a序列,接下来 m 行, 每行描述了一…
BZOJ题目传送门 表示蒟蒻并不能一眼看出来这是个势能线段树. 不过仔细想想也并非难以理解,感性理解一下,在一个区间里又与又或,那么本来不相同的位也会渐渐相同,线段树每个叶子节点最多修改\(\log a\)次(\(a\)为值域). 那么,我们做区间修改的时候,进行判断:如果这一次修改对区间里所有数的影响都是一样的,那么直接在当前位置放懒标记. 如何判断呢?又是一个位运算技巧:维护区间与和区间或,两者的异或即为区间内存在不同的位集.那么只有这些位集不会被与上0.或上1,才可以放懒标记. 至于又与又…
bzoj CSAcademy description 一个序列\(a_i\),支持区间与一个数,区间或一个数,求区间最大值. \(n,m\le2\times10^5\) sol 线段树每个节点上维护区间与.区间或和区间最大值. 如果一次操作对区间与的影响和对区间或的影响相同,那么就说明对这整个区间的影响都是相同的,就是加上或减去同一个值,直接打标记即可,否则递归下去处理. 复杂度是\(O(nK\log n)\)的,\(K\)是二进制位数. 如果对复杂度证明感兴趣的话可以去这里. code #in…
算导: 核算法 给每种操作一个摊还代价(是手工定义的),给数据结构中某些东西一个“信用”值(不是手动定义的,是被动产生的),摊还代价等于实际代价+信用变化量. 当实际代价小于摊还代价时,增加等于差额的信用: 当实际代价大于摊还代价时,减少等于差额的信用. 显然总摊还代价等于总实际代价+总信用变化量. 如果信用变化量始终>=0,那么总摊还代价给出总实际代价的一个上界:设法证明信用变化量始终>=0 势能法 对整个数据结构定义一个“势”函数$\Phi$ 定义一个操作的摊还代价为实际代价加上势的变化量…
传送门 区间位赋值.区间求最大值似乎是不能够像一般的线段树一样直接打标记的,但是直接暴力也太没有面子了. 我们考虑优化一下暴力:如果说线段树的一段区间内在当前修改的所有位置上所有数都是相同的,那么这个最大值就是可以直接维护的,在上面打上标记:如果这个条件不满足就暴力向下递归. 然后交一发发现过了!然而这并不是数据水. 考虑势能分析计算复杂度.设每一个节点的势能函数为当前区间的所有数在位置上不全相同的位置个数.每一次在找到覆盖区间之后暴力向下递归,则势能函数必定减小至少\(1\),而势能的增加量最…
题意: 已知\(n\)个数字,进行以下操作: \(1.\)区间\([L,R]\) 按位与\(x\) \(2.\)区间\([L,R]\) 按位或\(x\) \(3.\)区间\([L,R]\) 询问最大值 思路: 吉司机线段树. 我们按位考虑,维护区间或\(\_or\)和区间与\(\_and\),那么得到区间非公有的\(1\)为\((\_or \oplus \_and)\),那么如果对所有的非公有的\(1\)影响都一样就不会对最大值有影响,那么就直接打标机,否则继续往下更新.即 \[[(\_or[r…
线段树分裂 以某个键值为中点将线段树分裂成左右两部分,应该类似Treap的分裂吧(我菜不会Treap).一般应用于区间排序. 方法很简单,就是把分裂之后的两棵树的重复的\(\log\)个节点新建出来,单次时间复杂度严格\(O(\log n)\). 至于又有合并又有分裂的复杂度,蒟蒻一直不会比较有说服力的证明,直到看见SovietPower巨佬的题解 对于只有合并:合并两棵线段树的过程,是找到它们\(x\)个重合的节点的位置,并将它们合并,而对于不重合的节点会跳过. 注意到合并与分裂类似互逆过程,…
https://www.lydsy.com/JudgeOnline/problem.php?id=5312 Kaiser终于成为冒险协会的一员,这次冒险协会派他去冒险,他来到一处古墓,却被大门上的守护神挡住了去路,守护神给出了一个问题,只有答对了问题才能进入,守护神给出了一个自然数序列a,每次有一下三种操作. 1,给出l,r,x,将序列l,r之间的所有数都 and x 2,给出l,r,x,将序列l,r之间的所有数都 or x 3,给出l,r,询问l,r之间的最大值 (下划线以前都是废话) 没有什…