离散化

Mayor's posters(线段树+离散化+lazy)

风格不统一 提交于 2020-02-08 10:08:18
Mayor's posters(线段树+离散化+lazy) 题目大意: 在墙上贴海报,然后很多海报,一层又一层,问你最后可以看到多少张海报。 题目分析: 数据范围很大,普通的线段树肯定超时+超内存,所以要用到离散化,离散化有基础的和稍微复杂一点的,然后这题要用到稍微复杂一点的, 离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,2000,2012就够了,将其分别映射到0,1,2,3,在于复杂度就大大的降下来了 所以离散化要保存所有需要用到的值,排序后,分别映射到1~n,这样复杂度就会小很多很多 而这题的难点在于每个数字其实表示的是一个单位长度(并且一个点),这样普通的离散化会造成许多错误(包括我以前的代码,poj这题数据奇弱) 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化后都变成了[1,4][1,2][3,4] 线段2覆盖了[1,2],线段3覆盖了[3,4],那么线段1是否被完全覆盖掉了呢? 例子一是完全被覆盖掉了,而例子二没有被覆盖 为了解决这种缺陷,我们可以在排序后的数组上加些处理,比如说[1,2,6,10]

蒟蒻林荫小复习——关于有限制区间元素查询的一些解法

我是研究僧i 提交于 2020-02-08 03:03:57
如题:本文主要说明对于区间有限制查询的一些解法(其实就两种) 问题1:给定一个数列,要求查询区间L—R中所有大于等于Va小于等于Vb的元素和 解法: 1.线段树套权值线段树 第一维维护区间,第二维作为权值线段树,维护值域在A—B之间的元素之和 每次查询就从第一维拉到对应区间,然后用Va和Vb确定在权值线段 树中的查询范围即可 2.分块 分块数组记为a,对每一个a块都开一个数组b,b数组将a块中元素拷贝后排序,新建c,对于每一个b都求前缀和 这样对于整块而言,用二分确定Va和Vb在b数组中的位置Ia,Ib,那么在这个数组的贡献即为c[lb]-c[la-1]. 零散部分暴力,不会超过2*sqrt(n) 问题2:在1的基础上求元素的个数 解法: 1.线段树套权值线段树 几乎同上,在第二维权值线段树中维护元素的个数即可(可能要离散化) 2.分块 分块数组记为a,对每一个a块都开一个权值数组b,b记录a中每种元素出现个数 b的范围为MinV—MaxV(离散化),对于每个b新开一个c记录b数组的前缀和 假设离散化后的Va,Vb为map[Va],map[Vb],则整块的贡献为c[map[Vb]]-c[map[Va]-1] 问题3:在1和2的基础上添加修改条件:可以是删去某一个元素(正常出题人应该不会这样搞),将某一个元素的值修改 解法: 1.线段树套权值线段树 大概方法同上

LightGBM介绍及参数调优

倖福魔咒の 提交于 2020-02-06 08:07:18
1、LightGBM简介   LightGBM是一个梯度Boosting框架,使用基于决策树的学习算法。它可以说是分布式的,高效的,有以下优势:   1)更快的训练效率   2)低内存使用   3)更高的准确率   4)支持并行化学习   5)可以处理大规模数据   与常见的机器学习算法对比,速度是非常快的    2、XGboost的缺点   在讨论LightGBM时,不可避免的会提到XGboost,关于XGboost可以参考 此博文   关于XGboost的不足之处主要有:   1)每轮迭代时,都需要遍历整个训练数据多次。如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。   2)预排序方法的时间和空间的消耗都很大 3、LightGBM原理   1)直方图算法   直方图算法的基本思想是先把连续的浮点特征值离散化成kk个整数,同时构造一个宽度为kk的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。在XGBoost中需要遍历所有离散化的值,而在这里只要遍历kk个直方图的值。      使用直方图算法有很多优点。首先,最明显就是内存消耗的降低,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值。

算法学习——离散化(整数离散化)

旧城冷巷雨未停 提交于 2020-01-30 02:05:03
百度百科解释: 离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如: 原数据:1,999,100000,15;处理后:1,3,4,2; 原数据:{100,200},{20,50000},{1,400}; 处理后:{3,4},{2,6},{1,5}; 用我的理解来说,就是抠搜。当数据的范围很大很多,但是数据的数量不多时,我们通过映射的方法,把数据的存储范围进行压缩,舍弃掉不需要的空间,只留用到的空间。 简单举个例子:广场举行一个活动,根据人的岁数来领取对应的奖品。正常我们需要准备1-150岁共150份奖品,但是活动有条件限制,就是让你提前报名提交自己的岁数,所以我们得到了一个真实的数据,来领奖品的都是老头老大妈,岁数只有从60-80岁的,所以我们不需要准备150种奖品,我们只需要准备60-80岁这些会来的人的奖品就行。把[60,80]这些数据排序后映射到我们实际上准备的空间里。也就是离散化。 例题: 区间和 这就是一个十分标准可以利用离散化来解答的题目。因为数据范围是-10^9 至 10^9,而数据数量只有10^5。 我们只需要把所有用到的坐标全部存储起来,将其排序之后一个一个离散化到一个新的坐标轴上,使数据直接相邻,节省了大量空间。 然后是代码实现: #include

线段树染色问题(例题为poj2777)

南笙酒味 提交于 2020-01-30 00:06:26
染色问题加离散化是poj2528,过后我会放出来的 关于离散的详细解释参考博客: https://blog.csdn.net/iwts_24/article/details/81603603 区域染色覆盖问题 假设某大学有一面文化墙,各个学院都可以在上面涂色,要求涂色区域高必须和墙一样,宽度任意但必须是整数(以米为单位)。涂色可以覆盖其他学院的涂色。现在若干个学院涂色之后最终这面墙上能看见多少种颜色。 这就是简单的染色问题了。当然有很多种不同的说法,但整体上离不开这两个问题:1.区域覆盖。2.多种染色方式。既然是区域操作,那么用线段树是比较合理了。用数组也可以,但是数据规模稍微大一点就会TLE。 当然,跟染色问题一同存在的还有就是离散化,很多博客也是将这两者一起来写的,并且主要是离散化。但我个人感觉染色问题对理解线段树很有帮助(当然还是太菜了= =大佬们都认为难点是线段树的离散化),所以就单独拿出来了。 建树 线段树有多种表现形式,感觉很多人都是拿结构体写的,博主是用数组写的,其本质还是一样的代码有些不一样而已。 整体上,我们对一段数据建成线段树,那么区域染色的时候就类似与修改区间。而线段树的精髓就是利用lazy数组,可以保证不遍历到子结点就可以获得区域的情况。那么染色也要利用这个性质,对于一段区间,我们想要在上层结点上来表示出来。那么我们可以设置3个变量:-1

离散化:区间和

浪子不回头ぞ 提交于 2020-01-25 01:17:14
题目链接:https://www.acwing.com/problem/content/804/ 题意 :假定有一个无限长的数轴,数轴上每个坐标上的数都是0。 现在,我们首先进行 n 次操作,每次操作将某一位置x上的数加c。 近下来,进行 m 次询问,每个询问包含两个整数l和r,你需要求出在区间[l, r]之间的所有数的和。 数据范围 −109≤x≤109, 1≤n,m≤105, −109≤l≤r≤109, −10000≤c≤10000 输入样例: 3 3 1 2 3 6 7 5 1 3 4 6 7 8 输出样例: 8 0 5 思路 :所谓离散化就是个一 一映射的过程,例如这个题的数据范围是1e9,但是真正能用到的坐标点最多3e5(n个改变坐标,和2 * m个区间点),所以我们根本不可能开1e9的数组,就需要把这3e5个坐标离散化(另存一个数组),使得我们的操作范围变小。 代码实现: # include <bits/stdc++.h> using namespace std ; typedef long long ll ; typedef pair < int , int > PII ; const int INF = 0x3f3f3f3f ; const int N = 3e5 + 5 ; int n , m ; int a [ N ] , s [ N ] ; vector <

hihoCoder #1079 : 离散化

蹲街弑〆低调 提交于 2020-01-24 08:54:02
#1079 : 离散化 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~ 这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢? 于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢? 提示一:正确的认识信息量 提示二:小Hi大讲堂之线段树的节点意义 输入 每个测试点(输入文件)有且仅有一组测试数据。 每组测试数据的第1行为两个整数N和L,分别表示总共贴上的海报数量和宣传栏的宽度。 每组测试数据的第2-N+1行,按照贴上去的先后顺序,每行描述一张海报,其中第i+1行为两个整数a_i, b_i,表示第i张海报所贴的区间为[a_i, b_i]。 对于100%的数据,满足N<=10^5,L<

信号与系统

不羁岁月 提交于 2020-01-24 00:02:56
signals and systems 序言 discrete time rabbits(斐波那契数列) leak tank(一阶微分方程) fall of a fog droplet(二阶微分方程) springs(二阶微分方程) 微分方程与模块化 输入和输出相同 序言 世间纷繁,人采映像。 对不可再分物质的不断追寻,是世人探究世界原码的终极体现。从有穷到无限,乃问题的两个分支,有穷是有限制的(restrictive),具体问题的分解;无限是站在现今的边界,寻求新的突破。 系统是人创造性的抽象(abstraction),对于解决问题颇有增益,它的特点: 内部强联系 外部弱联系 强 弱 系统 内部 外部 由此,可对单个系统进行分析。而系统之间可以通过力、信息传递相互作用。即为信号与系统的核心问题。 系统举例:CPU、芯片、电机、服务器、喷气机(jumbo jet)、太阳系…… 思考: 热力系统(热力学第零定律所述,两个系统的平衡) 集合、矩阵等数学概念,一个封闭的体系 物理的力学分析,合外力为零,单独分析 电路的二端网络,输入和输出性质固定 学校等实体,按照一个既有的形式运作,大环境下处于稳态 discrete time 离散化表示是解决问题的一个方法。 重要性在于: 电脑是离散的系统 大多数概念同时适用于离散和连续 思考: 离散和连续的相互转化是处理问题的常见手段: 微积分中

题解【USACO12DEC 逃跑的BarnRunning Away From…】

折月煮酒 提交于 2020-01-20 10:32:31
期末考前写题解, \(rp++! \ rp++! \ rp++!\) \[ description \] 给出一个 以 \(1\) 为根的边带权有根树 ,给定一个参数 \(L\) ,问每个点的子树中与它距离小于等于 \(L\) 的节点个数。 \[ solution \] 有关子树内的统计,肯定能联想到 线段树合并 吧。 记 \(d[u]\) 表示根节点到 \(u\) 的距离,该数组可通过一次遍历求出。 则对于每个点 \(u\) ,它的贡献就是满足下式的点对数量: \[ d[v]-d[u]\leq L \ \{ v\in\operatorname{subtree}(u) \} \] 移项,可化简为: \[ d[v]\leq d[u]+L \ \{ v\in\operatorname{subtree}(u) \} \] 那么问题就转化成了: 令点 \(u\) 的点权为 \(d[u]\) 。对于每个点 \(u\) ,求出该点的子树中点权小于等于 \(d[u]+L\) 的节点个数 然后发现是一道 线段树合并 板子题,直接码上就行。 需注意的是,这个 \(L\) 和 \(d[~]\) 的范围有 \(1e18\) ,所以我们需要离散化一下防止 \(MLE\) 。 我是把每个 \(d[u]\) 以及 \(d[u]+L\) 都扔进去离散化了,如果有哪位 \(dalao\) 有更优秀的离散化方法

ZOJ 2301/HDU 1199 线段树+离散化

三世轮回 提交于 2020-01-15 04:44:25
给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了sha崽的博客后才知道,POJ那题简直数据弱爆了,本来随便一组就能让我WA掉的,原因在于离散化的时候,缩小数据规模的同时,没有考虑到误差,比如 1 4 6 8,离散化之后是1 2 3 4,我如果覆盖了1 2和3 4,表面上好像全部覆盖了,实际数据并没有覆盖。。所以我只能说那道题目我其实错了,并没有真正做出离散化出来。。。现在用这道题来弥补。 color the ball,ball的编号可以从1 到2^31,不可能开这么大线段树,但是其实测试数据只有N=2000*2组,所以必然是离散化,初始的时候,所有球都是黑色的,然后N组数组,a b w(b),说明把 区间 a到b染成(white or black),最后求最长的连续白色的区间的左右边界 瞬间想到上次求最大连续子串,线段树节点里用一个除了记录最大值,前驱最大值,后驱最大值以外,专门用个lm ,rm记录题目需要的坐标。这些都好处理,基本的线段树区间合并。要注意的是落实的叶子节点的时候,不能单纯以离散化之后的区间长度为衡量标准,要回到原区间去,原区间最长才是真正的最长。这个也好操作,读入数据的时候已经把原始区间保存下来了。 然后就是坑爹的离散化了,还是sha崽说得对,如果离散的两点距离大一1的话,必须要中间手动插点