inline

LCT(Link Cut Tree)总结

淺唱寂寞╮ 提交于 2020-02-11 03:49:09
概念、性质简述 首先介绍一下 链剖分 的概念 链剖分,是指一类对树的边进行轻重划分的操作,这样做的目的是为了减少某些链上的修改、查询等操作的复杂度。 目前总共有三类:重链剖分,实链剖分和并不常见的长链剖分。 重链剖分 实际上我们经常讲的树剖,就是重链剖分的常用称呼。 对于每个点,选择最大的子树,将这条连边划分为重边,而连向其他子树的边划分为轻边。 若干重边连接在一起构成重链,用树状数组或线段树等静态数据结构维护。 这里就不赘述; 实链剖分 同样将某一个儿子的连边划分为实边,而连向其他子树的边划分为虚边。 区别在于虚实是可以动态变化的,因此要使用更高级、更灵活的Splay来维护每一条由若干实边连接而成的实链。 基于性质更加优秀的实链剖分,LCT(Link-Cut Tree)应运而生。 LCT维护的对象其实是一个森林。 在实链剖分的基础下,LCT资磁更多的操作 同样将某一个儿子的连边划分为实边,而连向其他子树的边划分为虚边。 区别在于虚实是可以动态变化的,因此要使用更高级、更灵活的Splay来维护每一条由若干实边连接而成的实链。 基于性质更加优秀的实链剖分,LCT(Link-Cut Tree)应运而生。 LCT维护的对象其实是一个森林。 在实链剖分的基础下,LCT资磁更多的操作 查询、修改链上的信息(最值,总和等) 随意指定原树的根(即换根) 动态连边、删边 合并两棵树、分离一棵树

动态点分治

穿精又带淫゛_ 提交于 2020-02-10 18:40:17
好吧,我想说,动态点分治思路好理解,但打起来真让人心累。 所谓动态点分治,就是点分治在线修改和查询。 此时,我们构造一个点分树,先找整棵树的重心,以他为根,将他和每个子树的重心连边,以此类推。 对于每个重心,我们维护一些需要的信息 我们在修改的时候,只需要沿着点分树往上跳修改信息就好了。 动态点分树到这里就讲完了,但真正的难点是你的维护和修改。 例题1:P2056 [ZJOI2007]捉迷藏 网址:https://www.luogu.com.cn/problem/P2056 这题被号称是最水的动态点分治,但是我看了两个小时才明白,然后又打了一个小时,呜呜。 我的代码借鉴了https://www.cnblogs.com/LadyLex/p/8006488.html 可是哪位大佬太强,两三句就说完了,我这里算是对他的补充说明吧。 找最长链,那么我们需要维护最长链和次长链,但是由于数据可以被修改,所以不能只维护这两条。 定义一个堆h2[i]用来维护以i为重心的树上的黑店到i的距离。 但是我们不可能每次修改都重新遍历整棵树重新计算h2吧,所以再定义h1[i]用于维护以i为重心的树上的黑点到i在点分树上的父亲的距离。 这样一来,h2里面只用存储它的每个子树的h1.top()了,哈哈哈。 但我们要求的是求出整棵树的最大值,那不简单,再来一个堆h3呗。

「题解」「CF853B」Jury Meeting

南笙酒味 提交于 2020-02-10 17:19:19
目录 题目 思路 代码 题目 传送门 思路 十分巧妙的差分前缀和好题。 题目板块完结之后,我看到有很多处理此题的方法,但总感觉差分前缀和比较巧妙。 首先,通过输入我们可以将每个人能在 \(0\) 号点停留的最大时间区间 \([tl,tr]\) ,并将所有人的 \([tl,tr]\) 取交集,得到 \([ll,rr]\) 即表示只有在这个区间中所有人能够聚集在一起。 显然,如果 \(rr-ll-1<k\) 则直接 puts("-1") 即可。 然后怎么办?假设所有人聚集的时间从 \(i\) 开始到 \(i+k+1\) 或者更久,那么我们可以保证他们工作的时常至少为 \(k\) ,那么我们需要找的就是所有人在 \([1,i]\) 时间段内到 \(0\) 的最小花费以及 \([i+k+1,n]\) 时间段返回的最小花费之和。 两种情况是一样的,我们只讨论其中一种,不妨讨论前往 \(0\) 的情况。 对于一个人,我们假设他在 \(i\) 时刻到达 \(0\) 最便宜的价格为 \(m_i\) ,再将他的所有前往 \(0\) 的航班按时间顺序由小到大排序。 规定: \(t_i\) 表示第 \(i\) 趟航班起飞的时间, \(c_i\) 为其花费, \(m_i\) 为这个人在 \(i\) 时刻到达 \(0\) 的最小花费。 现在我们分析他的第一堂航班和第二趟航班,由于 \(t\)

3. 构造函数

≯℡__Kan透↙ 提交于 2020-02-10 09:54:12
1. inline(内联)函数 inline函数很好,其优点是:传的速度快。那所有函数都做成inline()函数岂不是很好,有的函数没办法做成inline()函数。简单的函数可以,复杂的函数不可以。 来源: https://www.cnblogs.com/yibeimingyue/p/12289898.html

《Ray Tracing in One Weekend》笔记

拟墨画扇 提交于 2020-02-10 00:47:17
目录 Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 Chapter 6 Chapter 7 Chapter 8 Chapter 9 Chapter 10 Chapter 11 本文章记录《Ray Tracing in One Weekend》笔记,代码文件请参阅 https://github.com/Intro1997/RayTracing Chapter 1   这里我尝试使用教程中提到的 stb_image.h 去读取教程中生成的 PPM 格式图像,但是失败了。我在 stack overflow 上也提问过,截至目前(2019.12.22)仅有一人回答,且否定了成功读取的可能性。代码放在同文件夹下的 Chapter1.cpp 文件了。 Chapter 2   这里跟着作者实现了 vec3 类,也更新了之前生成图像的代码 #ifndef Vec3_h #define Vec3_h #include <cmath> #include <cstdlib> #include <iostream> class vec3{ public: float e[3]; vec3(){} vec3(float e0, float e1, float e2){ e[0] = e0; e[1] = e1; e[2] = e2; } inline

二叉堆学习笔记

断了今生、忘了曾经 提交于 2020-02-09 22:59:30
前言 其实这东西学过两年了……所以应该算是复习笔记吧? 定义 二叉堆,简称堆,顾名思义,是一棵二叉树,还是一棵完全二叉树。其显著特征是整棵树中父结点的值与子结点的值的大小关系都相同(即父结点的值均大于两个子结点的值或均小于两个子结点的值)。若大于,称之为大根堆,小于则是小根堆。显而易见,堆顶元素(即根节点)为二叉堆的最大或最小元素。在存储的时候,为了方便,我们可以将整个二叉堆存到一个数组里,以1为根结点,某一元素两个儿子的下标分别为(2i)和(2i+1),父亲下标为(i/2)。 用途 二叉堆可用于维护一个序列的极值。它支持插入一个元素,删除极值元素和查询极值元素。通过拼接两个二叉堆,我们还可以对删除指定元素的操作。 操作实现 插入 首先将元素插入二叉堆的最后,接着不断与它的父结点比较,若不满足堆的顺序则交换它与它的父结点,直到整个二叉堆重新满足二叉堆的性质(即到达堆顶或当前比较结果满足堆的顺序)。 void insert(const Type &x) { a[++size]=x; unsigned int now=size; while(now>1&&!compare(a[now>>1],a[now])) { swap(a[now>>1],a[now]); now>>=1; } return; } 查询堆顶元素 直接返回根节点即可。 inline Type top(){return

[LOJ143]质数判定(Miller-rabin素数测试+防相乘爆long long的技巧讲解)

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-09 20:47:14
题面 https://loj.ac/problem/143 题解 Miller-rabin素数测试 是一种随机化算法,能够在较短的时间内判断出一个数是合数,还是很可能为素数。其出错的概率极小;当用于测试的p取遍前10个素数时,在 \(3e18\) 的范围内不会出错。 原理:1、费马小定理 p为素数的必要不充分条件是 \(\forall (a,p)=1,a^{p-1}{\equiv}1{\mod p}\) 。证明不再赘述,可以参见百度百科或《数学奥林匹克命题人讲座:初等数论》2.3节。 2、二次探测 只使用费马小定理时,出错概率仍然较大,尤其是对于Carmichael数n(在 \(1e8\) 以下有255个,最著名的、最小的Carmichael数是561),对于所有的与n互质的正整数a,都可以满足 \(a^{n-1}{\equiv}1{\mod n}\) 。因此,仅仅使用Fermat测试是不够的。 二次探测的原理是:如果 \(x^2{\equiv}1{\mod p}\) ,p为素数,那么有 \(x{\equiv}{\pm}1{\mod p}\) 。证明显然,将1移项至左边,然后因式分解即可。 具体做法 设待测数为mod,若mod为偶数则可以直接判断。否则,我们将mod-1分解为 \(2^t*n\) ,其中 \(2{\nmid}n\) 。然后,取与mod互质的数p,计算 \[p^n、

「JSOI2013」旅行时的困惑

穿精又带淫゛_ 提交于 2020-02-08 15:39:09
「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的路径是唯一的。 那么题意就变成了:每次在图上选出一条路径,覆盖上面的边,求最小的路径数使得所有边都被覆盖至少一次。 看到这里我不禁联想起 这道题 那么对于这道题我们就让源点 \(S\) 向所有点连上界为 \(+\infty\) ,下界为 \(0\) 的边,所有点向汇点 \(T\) 连边同理,然后原图中的边连成上界为 \(+\infty\) ,下界为 \(1\) 的边,然后跑一个有源汇上下界最小流即可。 由于这题数据范围还是相对有点大的,所以建议把能加的优化都加上。 #include <cstring> #include <cstdio> #define rg register #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout) template < class T > inline T min(T a, T b) { return a < b ? a : b; } template < class T > inline void read(T& s) { s = 0; int f = 0;

文档流定位

此生再无相见时 提交于 2020-02-08 00:40:48
文档定位是一种浏览器默认的定位方式display属性规定元素的类型并可以互相转换! display:block可以设置元素的height,width,margin,padding。并且可以自带换行符单独占一行。常见的block元素都有<div>,<p>,<h1>,<ol>,<ul>,<form>,<tadle>. display:inline元素不单独占用一行,width,height不可以设置width就是它包含的文字图片的宽不可以改变,不单独站用一行。常见的inline元素有<span>,<a>。 display:inline-block就是同时具备inline元素和block的特点。不单独站用一行元素的width,margin,padding,height都是可以设置的。常见的display:inline-block元素有<img> 标准文档流 说白了就是一个“默认”状态。文档流指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。并最终窗体自上而下分成一行行,并在每行中从左至右的顺序排放元素。 标准流的微观现象: (1).空白折叠现象。比如,如果我们想让img标签之间没有空隙,必须紧密连接。 <img src="img/00.jpg"/><img src="img/02.jpg"/> (2)高矮不齐,底边对齐 (3)自动换行,一行写不完时,换行写 标准文档流等级

CSS---display详解

自作多情 提交于 2020-02-05 13:49:15
inline   常用的inline就是文字和图片,其实inline真没什么好说的,大家可以把它想象成一个杯子里的水,它是“流”,是没有大小和形状的,它的宽度取决于父容器的宽度。   因此,针对inline的标签,你设置宽度和高度是无效的,通过监控可以知道,该元素实际的宽度和高度都是auto,并不是我们设定的值。      一个很基础的问题:如何把inline元素转换成“块”元素?相信绝大部分人的回答是display:block,但是你应该知道这不是一个唯一的答案。至少我设置display:table也是可以的吧? 还有两种情况你应该去了解(如果你不知道的话): 第一,对inline 元素设置float 还是刚才那个例子,我们对span元素添加一个float:left,运行看看效果,你就会大吃一惊。从显示的效果和监控的结果上看来,span元素已经“块”化。注意,上一节刚刚讲完float,不要忘记float的“破坏性”、“包裹性”,在这里同样适用。    第二,对inline 元素设置position:absolute/fixed 还是有同一个例子做演示,这次在span元素上加上absolute/fixed,效果大家应该能猜到,和加上float的效果相同。至于absolute/fixed有什么特性,会在下一节介绍position时提到。    3. block