二维

二维偏序

梦想的初衷 提交于 2019-11-30 23:41:15
题意: 每个物品有两个参数(x,y),问 \(x_i > x_j 且 y_i > y_j\) 成立的 \(j\) 有多少个. 思路: 二维偏序,先对x进行排序,对y离散化,从后到前循环,对点i,树状数组求当前有多少个y比y_i小的,若小于n-i,则说明后面存在y比他大的,且后面的一定x比他大,所以当前这个点能贡献一次答案,然后再在y_i添加一次树状数组 #include<cstring> #include<cstdio> #include<queue> #include<iostream> #include<algorithm> #define ll long long #define pii pair<int,int> using namespace std; const int inf = 0x3f3f3f3f; const int N = 1e5+10; struct node{ int x,y; }a[N]; int n,w[N]; struct bit{ int a[N]; void update(int x,int pos){ for(int i=pos;i<=n;i+=i&(-i)) a[i] += x; } int sum(int pos){ int res = 0; for(int i=pos;i;i-=i&(-i)) res += a[i]; return

c++实现双端队列

时光毁灭记忆、已成空白 提交于 2019-11-30 21:43:51
在使用c++容器的时候其底层如何实现 例如 vector 容器 :是一个内存可以二倍扩容的向量容器,使用方便但是对内存要求严格,弊端明显 list 容器 : 双向循环链表 deque 容器 :双端队列 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容。deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与vector不同的是,deque还支持从开始端插入数据:push_front()。 实际上双端队列是一个二维数组,但是实际存储数据的部分并不是连续的,一维数组存放指针,指向二维申请出来的空间,如图 首先申请一维空间存放指向二维的指针,例如一维空间长度为int len;则在len/4的位置先申请一块二维空间,指向前的指针*_frist与指向后的指针*_last 位于二维空间的中间,前插数据则*_frist--,后插数据则*_last++; 如果前插到二维的0下标位置,若一维数组上一个位置指向的空间为空,此时会在一维上一个位置申请二维,*_frist指向二维尾部,例如上图,会在*p 0 的位置申请二维,*_frist指向新开辟的二维的尾部,实现继续前插,若上面的所有一维都申请了二维,但是下面还有一维数组还有空,则整体将数据往下挪,把一维0号下标的二维空出来,继续前插

C++二维数组

偶尔善良 提交于 2019-11-30 19:07:47
一、二维数组的介绍 当数组元素具有两个下标时, 该数组称为二维数组。 二维谁可以看做具有行和列的平面数据结构。 二、二维数组的定义 定义二维数组的形式: 数据类型 数组名[常量表达式1][常量表达式2] ; 数据类型是数组全体元素的数据类型, 数组名用合法的标识符表示, 两个整型常量表达式可以理解为分别代表行数和列数, 与一维数组相同, 数组元素的下标一律从 0 开始。例如: 该语句表示: ①. 定义了一个二维数组a, 其数据类型为int型; ②. a数组有3行5列, 共能容纳 3*5 = 15 个 int 型的数据; ③. a数组的行下标为 0, 1, 2, 列下标为 0, 1, 2, 3, 4 , 所有元素的位置可表示为; ④. 程序运行时将为a数组在内存中开辟 3*5* 4(字节) = 60个字节连续的存储单元; 三、二维数组的使用 同一维数组一样, 引用二维数组的元素, 也是引用他的数组元素, 数组元素的形式为: 数组名[行下标][列下标] ; 例如, 若定义 int a[3][5], i = 2, j = 4 ; 则下列引用都是合法的 使用举例 1>. 输入一个 2x3 大小的二维数组, 输入完毕后再全部输出 四、二维数组的初始化 二维数组初始化的形式为: 数据类型 数组名[常量表达式1][常量表达式2] = { 初始化数据 } ; 在 { } 这给出各数据元素的初始值

C++小议二维数组

 ̄綄美尐妖づ 提交于 2019-11-30 19:07:46
一、二维数组的介绍 当数组元素具有两个下标时, 该数组称为二维数组。 二维谁可以看做具有行和列的平面数据结构。 二、二维数组的定义 定义二维数组的形式: 数据类型 数组名[常量表达式1][常量表达式2] ; 数据类型是数组全体元素的数据类型, 数组名用合法的标识符表示, 两个整型常量表达式可以理解为分别代表行数和列数, 与一维数组相同, 数组元素的下标一律从 0 开始。例如: 该语句表示: ①. 定义了一个二维数组a, 其数据类型为int型; ②. a数组有3行5列, 共能容纳 3*5 = 15 个 int 型的数据; ③. a数组的行下标为 0, 1, 2, 列下标为 0, 1, 2, 3, 4 , 所有元素的位置可表示为; ④. 程序运行时将为a数组在内存中开辟 3*5* 4(字节) = 60个字节连续的存储单元; 三、二维数组的使用 同一维数组一样, 引用二维数组的元素, 也是引用他的数组元素, 数组元素的形式为: 数组名[行下标][列下标] ; 例如, 若定义 int a[3][5], i = 2, j = 4 ; 则下列引用都是合法的 使用举例 1>. 输入一个 2x3 大小的二维数组, 输入完毕后再全部输出 四、二维数组的初始化 二维数组初始化的形式为: 数据类型 数组名[常量表达式1][常量表达式2] = { 初始化数据 } ; 在 { } 这给出各数据元素的初始值

计算几何--二维几何基础练习

爷,独闯天下 提交于 2019-11-30 13:39:12
内容参考书籍——《算法竞赛入门经典训练指南》 例题1 题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2119   莫利定理(Morley's theorem),也称为莫雷角三分线定理。将三角形的三个内角三等分,靠近某边的两条三分角线相交得到一个交点,则这样的三个交点可以构成一个正三角形。这个三角形常被称作莫利正三角形。 本题无算法可言,暴力求解即可(根据夹角根据旋转三角形的边,求出交点即为答案)。 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Point 4 { 5 double x,y; 6 Point(double x=0, double y=0):x(x),y(y) {}//构造函数,方便编写代码 7 }; 8 typedef Point Vector;//别名 9 //向量+向量=向量,点+向量=点 10 Vector operator + (Vector A, Vector B){return Vector(A.x+B.x,A.y+B.y);} 11 //点-点=向量 12 Vector operator - (Vector A,

二维网格迁移

江枫思渺然 提交于 2019-11-30 09:05:07
题目描述 给你一个 n 行 m 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。 每次「迁移」操作将会引发下述活动: 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。 位于 grid[i][m - 1] 的元素将会移动到 grid[i + 1][0]。 位于 grid[n - 1][m - 1] 的元素将会移动到 grid[0][0]。 请你返回 k 次迁移操作后最终得到的 二维网格。 示例 1: 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1 输出:[[9,1,2],[3,4,5],[6,7,8]] 示例 2: 输入:grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4 输出:[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]] 示例 3: 输入:grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9 输出:[[1,2,3],[4,5,6],[7,8,9]] 解析一 当移动次数等于二维数组的大小及其整数倍时, 数组的状态不发生改变 因此首先求移动次数对二维数组长度的模: // times是实际移动的次数, grid.length 和 grid[0]

二维平面最近点-分治

↘锁芯ラ 提交于 2019-11-30 08:36:48
题目描述 给出二维平面上的n个点,求其中最近的两个点的距离的一半。 输入包含多组数据,每组数据第一行为n,表示点的个数;接下来n行,每行一个点的坐标。 当n为0时表示输入结束,每组数据输出一行,为最近的两个点的距离的一半。 输入样例: 2 0 0 1 1 2 1 1 1 1 3 -1.5 0 0 0 0 1.5 0 输出样例: 0.71 0.00 0.75 题目解析: 采用分治的思想,把n个点按照x坐标进行排序,以坐标mid为界限分成左右两个部分, 对左右两个部分分别求最近点对的距离,然后进行合并。对于两个部分求得的最近距离d, 合并过程中应当检查宽为2d的带状区间是否有两个点分属于两个集合而且距离小于d,最多 可能有n个点,合并时间最坏情况下是O(n^2).但是,左边和右边中的点具有以下稀疏的性质, 对于左边中的任意一点,右边的点必定落在一个d*2d的矩形中,且最多只需检查6个点( 鸽巢原理),这样,先将带状区间的点按照y坐标进行排序,然后线性扫描,这样合并的时 间复杂度为O(nlogn)。 代码: #include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> using namespace std; double MAX = 1e9; int a,b; struct Node{ double x

Python——文件和数据格式化

倾然丶 夕夏残阳落幕 提交于 2019-11-30 07:17:54
一、文件 1.1使用 文件是存储在辅助存储器上的数据序列 文件是数据存储的一种形式 文件展现形态:文本文件和二进制文件(本质上所有文件都是二进制形式存储) 文本文件 由单一特定编码组成的文件 由于存在编码,也被看成是存储的长字符串 适用于:.txt文件,.py文件等 二进制文件 直接由比特0和1组成,没有统一字符编码 一般存在二进制0和1的组织结构,即文件格式 适用于:.png文件,.avi文件等 #文本形式打开文件 tf=open("f.txt","rt") print(tf.readline()) tf.close() #二进制形式打开文件 bf=open("f.txt","rb") print(bf.readline()) bf.close() 1.2打开和关闭 文件一般存储在硬盘上,为存储状态;如果要处理一个文件,首先要使该文件变成占用状态 状态的转换通过打开和关闭进行转换 1.2.1打开 <变量名>=open(<文件名>,<打开模式>) 变量名->文件句柄 文件名->文件路径和名称(源文件同目录可省路径) 打开模式->文本 or 二进制(读 or 写) 打开模式: 'r':只读模式,默认值,若文件不存在返回 FileNotFoundError 'w':覆盖写模式,文件不存在则创建,存在则完全覆盖 'x':创建写模式,文件不存在则创建,存在则返回

反省——关于csp-s模拟50

核能气质少年 提交于 2019-11-30 06:52:14
本人于搜索csp-s模拟49题解时,有意识地点开了一篇关于csp-s模拟50T2的题解,并知道了题解是二维前缀和以及四维偏序。 更 重要的是,那篇博客说有解法二,叫二维莫队。 于是我上网搜索二维莫队,结果第一篇博客就是那道原题。 然后我将二维莫队与普通莫队分块的区别,如何$O(n)$更新答案都看了。我在考场上只是确定了指针移动的方向以及贡献的加减,然后打了个程序测了最优块长。 事后我问别的同学为什么不打,是因为他们说他们认为复杂度不对。然而我提前就知道只要我能打出来就是AC,而且我又想起Yzh学长说莫队非常无脑好调,于是我就打了2h。 我在考场上想得只有这么多,竟然没有去想自己的行为有多么恶劣。 本来以为就算知道算法也打不出来,结果打出来。而且打出来以后,没有别的想法,只有轻松,然后就鬼迷心窍地交了。 我对自己的行为表示后悔与遗憾。 我为了42分丢掉了自己十几年来信守的信仰:真实、不虚伪。 所以这场考试我的真实分数应该是11+58+0==69。我对我利用这种手段超过的同学表示抱歉。 如果这42分让我阻止了您进入一机房(当然,这是不可能的,我只是这么说说,再给我300分我也不可能够线的……),请通知我,我将会主动和教练说明,把位置交给正确的人。 否则,请自觉把mzz在您心中的位置进行适当调整,可以消费,请适度(主要是因为我心眼小……)。 在此mzz向全体同学表示抱歉