传送门 解题思路 用平衡树维护摧毁的房屋。 摧毁等于insert,修复等于delete,询问等于查询前驱后继。 为了方便先扔进一个0点和n+1点。 注意查询时先进行判断当前房屋是否已经摧毁。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algori
传送门 解题思路 Splay如何维护序列呢? 以序列下标作为val值,扔到Splay中。 因为有区间翻转操作,所以实际上并不能保证绝对的按照val值排序,也就是说Splay的中序遍历结果是真正的序列,而val值对应的是当前序列的每个元素原来的位置。 与普通的Splay的区别在于多了一个区间翻转操作,可以
字典树Trie 大概是老师讲完后的无聊产物。 和第二天发现自己记不得垂死病中惊坐起颓废的话。 Trie是用来存字符串的, 其基本思想是将相同前缀的字符串放在一起, 建成一棵树, 又称字典树 可以看下面的图片理解怎么存的。 请原谅这张图我自己都看不下去。 然后就喜闻乐见的代码qaq voi
DNA 序列 题目链接:ybtoj高效进阶 21175 题目大意 给你一个由四种字符组成的字符串,然后问你长度为 k 的子串中出现次数最多的串的出现次数。 1<=k<=10 思路 其实因为 1 ⩽ k
题目链接 对树的路径进行操作,不难想到树的路径是唯一的,离不开LCA 添加一条新边后,答案有两种可能,一是走原树上路径,二是通过这条边走到 对于后者,其实答案就是dis(a,x)+1+dis(y,b)或者dis(a,y)+1+dis(x,b) 均是树上原有的,LCA可求 但是有个特殊情况,可以反复横跳(恶心心 但是反复横跳的
树上启发式合并 作用 主要解决树上对每个根节点的影响,复杂度最好O(nlog n),最差O(N*N) #include <bits/stdc++.h> using namespace std; #define ll long long const ll N = 1e5 + 10; ll dep[N], sze[N], son[N]; ll dian[N]; ll lev[N]; ll max_len; ll ans[N]; ll flag; ll
\(n\le 10^5\) 首先森林的每个连通块肯定是独立的,算出 \(SG\) 异或一下就行了 对于 \(SG(u)\) 的计算,如果只是从子树中的节点 \(v\) 的 SG 值转移来,式子将会很复杂,也不太能优化 因为 \(SG(u)\) 最后的形式是对一个集合取 \(\operatorname{mex}\),考虑直接维护这个集合 找出 \(\ope
题面 给定一棵 \(N\) 个节点的西瓜树,第 \(i\) 个点有一个权值 。 对每个点 \(i\) ,其答案为不在以它为根的子树中(子树包括它自己)的所有点中,选两个点异或后的最大值,如果选不出两个点,则认为的答案是0。 求每个点的答案。 \(N\le 5\times 10^5\) 解法 一道01tire好题(写起来其实也不难)
[SCOI2016]幸运数字 \(\text{Solution:}\) 这题是个板子。显然的思路就是直接用树剖线段树维护合并线性基,这样就可以做到 \(O(n\log ^4 n)\) 的复杂度。 这东西 十分卡常 ,所以代码里用了 fread,fwrite 等优化,以及: 合并线性基的时候,我们会发现,一个位置只会往比它低的位置合并。 加
传送门 解题思路 关键点:根据线性基的性质,若序列数字个数大于等于30,则一定有异或值为0的两个集合。 所以对于每个询问,先判断两个点之间的路径长度是否大于等于30,若小于30,直接暴力找,线性基判断,否则直接判断。 对于每次修改,可以用线段树维护树剖。 AC代码 #include<iostream> #inclu
JS继承 1.传统形式 ==> 原型链 问题:过多的继承了没用的属性 Grand.prototype.lastName = 'Ji'; function Grand() { } var grand = new Grand(); Father.prototype = grand; function Father() { this.name = 'hehe'; } var father = new Father(); Son.prototype =
>Link luogu P3391 >Description 给你一个初始为 1 ~ n 的序列 不断对一些区间进行翻转操作 输出最终的序列 >解题思路 放放其他大佬的Splay讲解 orz 这里简单说一下Splay: 相对于treap,不用用随机数(大家都知道随机数这种东西就是看rp的嘛);两者都是二叉查找树(好像是废话 然后
三只企鹅 题目链接:ybtoj高效进阶 21270 题目大意 给你一棵树,然后要你支持一些操作。 给一个点的权值加一(一开始都是 0),计算所有点到一个点的距离乘各自点的权值。 思路 考虑把每个距离拆成 \(deg_x+deg_y-2deg_{lca}\)。 然后不难发现就第三项比较难搞。 考虑这么一种计算方法,在放
面向对象三大特征 1、封装 把属性和方法封装成一个对像 2、继承 inherit ES5继承写法 可以更改指向来继承其他对象的属性和方法 // 【ES5继承】 //爷 function Ye(money) { this.money = money; }; let Y1 = new Ye(1200); Fu.prototype = Y1;//父辈继承爷爷辈 // Object
LOJ #3166. 「CEOI2019」魔法树 首先可以列出一个 \(\text{dp}\) 状态: 设 \(f_{u,t}\) 表示恰好在 \(t\) 时刻剪断节点 \(u\) 与其父亲的边可获得的最大收益. 这显然是一个树上背包. 先不考虑节点 \(u\) 自身的贡献, 在合并两个儿子 \(u,v\) 时的状态转移方程应为: \[f'_{u,t}=\m
[HAOI2015]树上操作 T19 D71 [HAOI2015]树上操作 树剖模板题 #include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define fi first #define se second #define pb push_back #define si size() #define ls (p<<1) #define rs ((p<<1)|1) #
题目链接 解题思路 题目的问法很明显是虚树题的问法。根据询问点建虚树,因为虚树不止有询问的点,还有他们的lca,所以先对建出来的虚树预处理出来虚树上每个点离他最近的议事处的距离和点的编号(自己就是议事处肯定就是自己,主要是对增加的lca进行处理)。因为最近的点可能来自下面
题目链接(hdu 7136) 本题可以根据权值最大的点作为突破口,权值最大的点一定是最优解的最后一步,那么我们可以依次倒推,每次删去最大的点以及该点连接的边最后推到每一个点。 实现过程:我们可以将所有点按照权值从小到大排出,每次枚举出的新点因为权值比前面的大,所以可以将他作为
写成刷表,更好理解一些。 对于树 \(T=(V,E)\) ,定义 \(u\in V,son(u,i)\) 为点 \(u\) 的第 \(i\) 个儿子,\(cnt(u)\) 为点 \(u\) 的儿子个数。 简单的说,要计算的就是这个东西: \[cost=\sum_{u\in V} \sum_{1\le i\le cnt(u)} size(son(u,i))\times \sum_{1\le j\le i} son(u,j) \]\[co
题面 P2279 [HNOI2003]消防局的设立 solve 今天模拟赛考到一道一模一样的题目,但我还写了1h+,真的是越来越菜了 其实这道题一股树形 \(DP\) 的味道,但是要考虑很多状态,父亲,儿子,兄弟,所以考虑贪心 对于一颗以 \(x\) 为根节点的子树,我们考虑几种情况 需要父节点和兄弟节点给一点贡献
洛谷题面传送门 终于调出来这道题了,写篇题解( 首先碰到这样的题我们肯定要考虑每种操作会对树的形态产生怎样的影响: 插入操作:对于 BST 有一个性质是,当你插入一个节点时,其在 BST 上的父亲肯定是,你把 BST 中父亲按权值 sort 一遍排成一列后,在待插入的数的两侧的数对应的节点中,深度
package main import "fmt" type Base struct { name string } func (b *Base) m1() int { return 666 } type Son struct { // 如果结构体之间存在匿名嵌套关系,则 子结构体 可以继承 父结构体中的方法 // 匿名的方式,如果改成 base Base ,则无法直接继承父结构体中的方法,
目录1、子类不重写构造函数2、子类重写构造函数 如果在子类中需要父类的构造方法就需要显示地调用父类的构造方法,或者不重写父类的构造方法。 1、子类不重写构造函数 子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__。 class Father(): def __init__(self, name
# 操作xml格式文件 # 简单的数据存储语言,被设计用来传输和存储数据 '''xml <data> # country name从属于data,rank updated等从属于country name <country name="Liechtenstein"> <rank updated="yes">2</rank> # updated="ye
目录壹、关于题目 ¶贰、关于题解 ¶叁、参考代码 ¶肆、关键 の 地方 ¶ 壹、关于题目 ¶ 没时间去编了。 贰、关于题解 ¶ 比较经典地,移动右端点指针,维护合法左端点。 左端点合法,指将 \([l,r]\) 的点都保留下来不成环且每个点度数小于等于 \(2\). 然后我们需要维护合法的左端点,