bzoj3159决战 码农题 树剖套splay】的更多相关文章

最近沉迷码农题无法自拔 首先有一个暴力的想法:对于每个重链维护一个splay,需要翻转的连起来,翻转,接回去 然后发现这样没问题... 一条链只能跨log个重链,也就只有log个splay的子树参与重排,所以一次翻转只要log^2的时间 需要维护的东西有点多 头一次在splay上维护这么多乱七八糟的东西,写错了好几遍 感觉学到不少debug技巧,也纠正了之前splay写法的一个小漏洞 话说极限数据好像和miaom拍不过啊...但是我们都A了啊 好烦啊不知道谁出锅了 #include <bits/…
前提:用树剖套线段树优化树链连边.例题:bzoj4699 我们说树剖的时间复杂度是 $O(n\times log(n))$,是因为访问一条链时需要经过 $log(n)$ 级别条重链,对于每条重链还需要 $O(log(n))$ 的时间来区间查询. 但不难发现每次访问一条链时,只有两端的两条重链只被覆盖了其中一段,必须要用线段树找到那一段.每次查询只有常数条必须要用线段树的重链. 而中间一堆重链都被完全覆盖了.我们可以给每条重链建一个点,这个点连向重链在线段树上的对应区间,这样访问这些重链整体时就只…
好烦啊,调了半天 线段树部分标记比较多,手抖打错了一个 剩下的都是取模的问题 我自己瞎jb推的公式里保留了abs,但是在模意义下是gg的,所以必须把正负区分开 调试的时候一定要注意构造各种形状的树,不要只做随机树 随机树深度只有log,很难体现一些链上的性质 我用随机树拍了一下午没出错,一掏出直链就秒秒钟出错 最后找到了那个该死的abs 还是逻辑不够严谨啊 #include <bits/stdc++.h> #define DEBUG 0 #define mid (l+r>>1) #…
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v经过的边的权值最小值. 基于边权的树链剖分,放在线段树上变成了区间维护问题了,线段树维护4个量min,max,sum,tag就可以了. # include <cstdio> # include <cstring> # include <cstdlib> # include…
传送门 woc这该死的码农题…… 把每一条边转化为它连接的两点中深度较深的那一个,然后就可以用树剖+线段树对路径进行修改了 然后顺便注意在上面这种转化之后,树剖的时候不能搞$LCA$ 然后是几个注意点 1.线段树记两个标记,一个区间覆盖,一个区间加和 2.区间覆盖的标记更新后要把区间加和的标记删除,因为覆盖后之前的加和相当于都废了 3.因为上面那个原因,pushdown的时候先下传区间覆盖标记再下传区间加和标记 4.标记更新的时候记得把答案也一起更新 5.数组开大一点!!! //minamoto…
传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然后再取反 单点修改的时候忘记pushdown结果调了好久…… //minamoto #include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; template<:;} template<:;} inline…
传送门 据说正解是树剖套堆???然而代码看着稍微有那么一点点长…… 考虑一下整体二分,设当前二分到的答案为$mid$,如果所有大于$mid$的边都经过当前点$x$,那么此时$x$的答案必定小于等于$mid$ 然后考虑怎么判断是否所有边都经过某一个点.我们可以用树状数组+树上差分来维护,把每一条边的两个端点的值加1,他们LCA的值减1,LCA父亲的值减1,那么如果这条边经过某一个点,那么这个点子树的和必定为1 于是我们可以把所有大于mid的边都处理出来,然后判断子树的和是否等于路径条数就行了.这个…
我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排名,查询区间某个值值前驱.后继.查询第k小值是log^3(n)的,其他都是log^2(n)的 #include <cstdio> using namespace std; ,inf=; ],root[],left,right,tot,son[maxn][]; int mmin(int x,int…
$ \color{#0066ff}{ 题目描述 }$ M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的…
原题链接 对于以u为根的子树,后代节点的dfn显然比他的dfn大,我们可以记录一下回溯到u的dfn,显然这两个dfn构成了一个连续区间,代表u及u的子树 剩下的就和树剖一样了 #include<cstdio> #include<algorithm> #include<cstring> #define N 100010 typedef long long ll; using namespace std; int ecnt,head[N],son[N],fa[N],sz[N…