离散化

HDU 4325 线段树离散化

这一生的挚爱 提交于 2020-01-11 04:59:34
线段树离散化 1.输入完所有数据,对开花时间离散化 2.区间更新,点查询,LAZY操作。。 View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> using namespace std; #define MAXN 51000 struct node { int left, right; int num; int sum; int lazy; }seg[500010]; int N, M; struct flower { int a,b; }p[101000]; int v[200010]; int hashx[201000]; void build(int l, int r, int root) { int mid = (l + r) / 2; seg[root].left = l; seg[root].right = r; seg[root].num = 0; seg[root].lazy = 0; seg[root].sum = 0; if( l == r ) { return; } build(l,mid,root*2); build(mid+1,r,root*2+1); seg[root].sum = seg[root*2]

POJ 2299树状数组求逆序对

风流意气都作罢 提交于 2020-01-08 13:06:52
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法。在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到999,999,999之多,在运用树状数组操作的时候,用到的树状数组C[i]是建立在一个有点像位存储的数组的基础之上的,不是单纯的建立在输入数组之上。 比如输入一个9 1 0 5 4(最大9) 那么C[i]树状数组的建立是在: 下标 0 1 2 3 4 5 6 7 8 9 –——下标就要建立到9 数组 1 1 0 0 1 1 0 0 0 1 –——通过1来表示存在 现在由于999999999这个数字相对于500000这个数字来说是很大的,所以如果用数组位存储的话,那么需要999999999的空间来存储输入的数据。 这样是很浪费空间的,题目也是不允许的,所以这里想通过离散化操作。 那么怎么离散化操作呢?离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围,必要的是建立一个结构体a[n],v表示输入的值,order表示原i值,再用一个数组aa[n]存储离散化后的值 例如: i:1 2 3 4 5 v:9 0 1 5 4 sort:0 1 4 5 9 order:2 3 5 4 1 aa:5 1 2 4 3 //建立映射:aa[a[i].order]=i;

hdoj 4325 Flowers 线段树+离散化

穿精又带淫゛_ 提交于 2020-01-08 10:18:24
hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然花的周期数据可能会达到1e9,这样的话线段树开四倍时不可能的。但是我们可以看到一共可能的数据时N行,那么每行两个数,再开4倍的区间。计算下来,在离散化的帮助下,我们只需要开8*N被的线段树即可。 另外询问的数据也需要放入离散化的范围,如果不这样做,有可能在询问时使用lower_bound函数会导致数据的改变,询问的原数据发生变化。 eg:1~3 7~10 询问6,结果应该时0,但因为lower_bound的原因询问时使用7,得到结果1。etc. 代码: #include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; const int maxn = 1e5+5; struct node { int l,r,sum,lazy; inline void update(int val) { lazy+=val; sum+=val; } } tr[maxn*8]; int a[maxn],b[maxn],c[maxn<<1

浅谈树状数组求逆序对

六月ゝ 毕业季﹏ 提交于 2020-01-08 07:25:12
做了一道树上求逆序对的题,主要难点并不在于树形结构,而是求逆序对数。(在我看来是这样的)。 to洛谷P3605晋升者计数。 发现自己树状数组求逆序对还有个坑,先填上再说。再加上最近学的树状数组离散化,捋一捋思路。 首先是离散化 for(int i=1;i<=n;i++){ a[i].v=read(); a[i].id=i; } sort(a+1,a+1+n);按v排序 for(int i=1;i<=n;i++)b[a[i].id]=i; 在上述代码中,首先我们输入的是a[i].v,也就是一开始的数据,我们将其放到结构体里,再记录一下id,也就是原序。之后我们将a按照v排序,那么得到的就是从小到大的顺序。 又因为离散化是为了避免数据太大而出锅,所以我们在乎的就是数据的相对顺序,所以很容易地想到,将他们的顺序作为新的权值,这样就可以保证相对大小不变并且还可以最大化的缩小数据范围。 那么我们开一个新的数组,对应为离散化之后的数组,那么这个数组一定是要和原数组的顺序相同的,所以这个时候原来记录的id也就是原序就有了用场,然后再把当前这个元素的排名也就是i赋给离散化数组的第a[i].id位即可。 再来说逆序对数,在一个序列中,如果存在 \[ i<j并且a[i]>a[j] \] 那么就代表有一个逆序对。 考虑如何用树状数组实现 \(nlogn\) 的时间复杂度求逆序对数。 首先

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

旧街凉风 提交于 2020-01-05 03:10:20
给这个题目跪了两天了,想吐简直 发现自己离散化没学好 包括前一个离散化的题目,实际上是错了,我看了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的话,必须要中间手动插点

HDU 4325 线段树离散化

谁都会走 提交于 2020-01-05 03:07:14
线段树离散化 1.输入完所有数据,对开花时间离散化 2.区间更新,点查询,LAZY操作。。 View Code #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> #include<vector> using namespace std; #define MAXN 51000 struct node { int left, right; int num; int sum; int lazy; }seg[500010]; int N, M; struct flower { int a,b; }p[101000]; int v[200010]; int hashx[201000]; void build(int l, int r, int root) { int mid = (l + r) / 2; seg[root].left = l; seg[root].right = r; seg[root].num = 0; seg[root].lazy = 0; seg[root].sum = 0; if( l == r ) { return; } build(l,mid,root*2); build(mid+1,r,root*2+1); seg[root].sum = seg[root*2]

hdoj 4325 Flowers 线段树+离散化

随声附和 提交于 2020-01-05 03:05:23
hdoj 4325 Flowers 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4325 思路: 直接线段树,按照花的开放区间的大小建树,要注意虽然花的周期数据可能会达到1e9,这样的话线段树开四倍时不可能的。但是我们可以看到一共可能的数据时N行,那么每行两个数,再开4倍的区间。计算下来,在离散化的帮助下,我们只需要开8*N被的线段树即可。 另外询问的数据也需要放入离散化的范围,如果不这样做,有可能在询问时使用lower_bound函数会导致数据的改变,询问的原数据发生变化。 eg:1~3 7~10 询问6,结果应该时0,但因为lower_bound的原因询问时使用7,得到结果1。etc. 代码: #include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <math.h> using namespace std; const int maxn = 1e5+5; struct node { int l,r,sum,lazy; inline void update(int val) { lazy+=val; sum+=val; } } tr[maxn*8]; int a[maxn],b[maxn],c[maxn<<1

IMU Noise Model

情到浓时终转凉″ 提交于 2019-12-26 00:26:02
1.参考资料 2.相关定义 3.IMU 的噪声模型 3.1噪声的建模 3.2白噪声和随机游走噪声的离散化 3.3如何获取传感器噪声参数 4.随机噪声和扰动的积分 4.1建立模型 4.2噪声的离散化模型推导 4.3系统的状态误差方程 4.4状态误差方程的积分 4.4.1 第一项-状态误差 4.4.2 第二项-测量白噪声 4.4.3 第三项-扰动噪声离散化(随机游走噪声) 4.5 离散的系统误差方程 4.6 误差状态方程的其他说明 4.7 Full IMU example 1.参考资料 <1>Kalibr IMU Noise Model: https://github.com/ethz-asl/kalibr/wiki/IMU-Noise-Model <2>高斯白噪声: http://blog.csdn.net/ZSZ_shsf/article/details/46914853 <3>随机游走: http://blog.sina.com.cn/s/blog_5c2cfefb0100emyi.html <4>泡泡机器人IMU状态模型(2) http://mp.weixin.qq.com/s/_ElpcSkMaGEIFd3bmwGa_Q <5>泡泡机器人IMU状态模型(1) http://mp.weixin.qq.com/s/PD4cOqVE3oMhyW4A2N02xQ <6>

数据分析实战之数据预处理

蹲街弑〆低调 提交于 2019-12-17 02:08:54
1.餐饮销量数的统计量情况 import pandas as pd import matplotlib.pyplot as plt # 餐饮销量数的统计量情况 catering_sale = '../data/chapter3/demo/data/catering_sale.xls' # 餐饮数据 data = pd.read_excel(catering_sale, index_col='日期') # 指定日期为列索引 print(data) # 过滤异常数据 data = data[(data['销量'] > 400) & (data['销量'] < 5000)] print(data) # 数据基本描述 print(data.describe()) # 菜品盈利 catering_profit = '../data/chapter3/demo/data/catering_dish_profit.xls' data = pd.read_excel(catering_profit, index_col='菜品名') print(data) data = data.sort_values(by='盈利', ascending=False) print(data) # rate = 1.0*data['盈利'].cumsum/data['盈利'].sum() data.columns

标准化和归一化(综合)

假装没事ソ 提交于 2019-12-06 13:07:06
part1: 【转】https://blog.csdn.net/weixin_40165004/article/details/89080968 Weka数据预处理(一) 对于数据挖掘而言,我们往往仅关注实质性的挖掘算法,如分类、聚类、关联规则等,而忽视待挖掘数据的质量,但是高质量的数据才能产生高质量的挖掘结果,否则只有"Garbage in garbage out"了。保证待数据数据质量的重要一步就是数据预处理(Data Pre-Processing),在实际操作中,数据准备阶段往往能占用整个挖掘过程6~8成的时间。本文就weka工具中的数据预处理方法作一下介绍。 Weka的数据预处理又叫数据过滤,他们可以在weka.filters中找到。根据过滤算法的性质,可以分为有监督的(SupervisedFilter)和无监督的(UnsupervisedFilter)。对于前者,过滤器需要设置一个类属性,要考虑数据集中类的属性及其分布,以确定最佳的容器的数量和规模;而后者类的属性可以不存在。同时,这些过滤算法又可归结为基于属性的(attribute)和基于实例的(instance)。基于属性的方法主要是用于处理列,例如,添加或删除列;而基于实例的方法主要是用于处理行,例如,添加或删除行。 数据过滤主要解决以下问题(老生常谈的): 数据的缺失值处理、标准化、规范化和离散化处理。