mid格式

P1168 中位数 堆

本秂侑毒 提交于 2019-12-03 05:10:19
题目描述 给出一个长度为 N N的非负整数序列 A_i A i ​ ,对于所有 1 ≤ k ≤ (N + 1) / 2 1 ≤ k ≤ ( N + 1 ) / 2,输出 A_1, A_3, …, A_{2k - 1} A 1 ​ , A 3 ​ , … , A 2 k − 1 ​ 的中位数。即前 1,3,5,… 1 , 3 , 5 , …个数的中位数。 输入格式 第 1 1行为一个正整数 N N,表示了序列长度。 第 2 2行包含 N N个非负整数 A_i (A_i ≤ 10^9) A i ​ ( A i ​ ≤ 1 0 9 )。 输出格式 共 (N + 1) / 2 ( N + 1 ) / 2行,第 i i行为 A_1, A_3, …, A_{2k - 1} A 1 ​ , A 3 ​ , … , A 2 k − 1 ​ 的中位数。 本题要用到优先队列定义堆: such as:     priority_queue<int,vetor<int>,greater<int> >p1;——小根堆(扔进去的数据自动排为由小到大)     priority_queue<int,vector<int>,less<int> >p2; ——大根堆(扔进去的数据自动排为由大到小) 堆顶堆:     代码(愿以后的我能看懂): 1 #include<bits/stdc++.h> 2 using

逆序对的数量(归并算法应用)

吃可爱长大的小学妹 提交于 2019-12-03 01:54:00
题目描述 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100000 输入样例: 6 2 3 4 5 6 1 输出样例: 5算法思路:1.利用归并算法,分区mid=l+r>>22.递归,left[l,mid] 和right[mid+1,r]3,归并时采用双指针i=l;j=mid+1.如果有右边的元素小于左边的元素,产生的逆序对个数有mid=i+1;继续归并。4.临时数组复制到原有数组中。 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=100010; 4 int q[N],tmp[N]; 5 typedef long long LL; 6 7 LL merge_sort(int q[],int l,int r) 8 { 9 if(l>=r)return 0; 10 int mid=l+r>>1; 11 LL res=merge_sort(q,l,mid)+merge_sort(q,mid+1,r); //

算法第二章上机实践报告

匿名 (未验证) 提交于 2019-12-03 00:11:01
实践题目: 7-3 两个有序序列的中位数 题目描述:已知有两个等长的非降序序列 S1, S2, 设计函数求 S1与 S2并集的中位数。有序序列 ,即第 1个数)。 输入格式 : 输入分三行。第一行给出序列的公共长度 N( 0<N≤100000),随后每行输入一个序列的信息,即 N个非降序排列的整数。数字用空格间隔。 输出格式 : 在一行中输出两个输入序列的并集序列的中位数。 输入样例 1: 5 1 3 5 7 9 2 3 4 5 6 输出样例 1: 4 输入样例 2: 6 -100 -10 1 1 1 1 -50 0 2 3 4 5 输出样例 2: 1 问题描述: 因为是两个数列的并集(在这里不是严格意义上的集合,元素可以重复),所以元素个数为偶数,题目要求找并集元素排序后最中间两个数的较小者。 算法描述: 找最中间的数的要求与二分搜索有类似之处。二分搜索的递归通过修改搜索范围查找,在这里可以采用在两数列内不断修改搜索区间逼近中位数。 代码如下所示: #include <iostream> using namespace std; int median(int *a, int *b,int l_a, int r_a, int l_b, int r_b) { if (a[r_a] < b[l_b]) return a[r_a]; if (b[r_b] < a[l_a]) return

【题解】考分鄙视

匿名 (未验证) 提交于 2019-12-02 23:49:02
题目描述 输入格式 输出格式 输入样例 4 1 3 3 5 输出样例 3 题解 #include <iostream> #include <cstdio> #define MAX_N 100000 using namespace std; int n; int a[MAX_N | 1]; long long ans; void Merge_Sort(int lt, int rt) { if(lt == rt) return; int mid = lt + rt >> 1; Merge_Sort(lt, mid); Merge_Sort(mid + 1, rt); int i = lt, j = mid + 1; int b[MAX_N | 1], cnt = 0; while(i <= mid && j <= rt) { if(a[i] >= a[j]) b[++cnt] = a[i++]; else ans += mid - i + 1, b[++cnt] = a[j++]; } while(i <= mid) b[++cnt] = a[i++]; while(j <= rt) b[++cnt] = a[j++]; for(register int i = lt; i <= rt; ++i) { a[i] = b[i - lt + 1]; } return; } int main

线段树 模板

纵然是瞬间 提交于 2019-12-02 12:25:00
原创建时间:2018-04-01 00:26:09 快速查找和修改区间 注:本文包含 洛谷 P3372 【模板】线段树 1 题解 线段树模板 前言 什么是线段树? 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 线段树的主要用途及好处? 线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。 线段树的应用? 最简单的应用就是记录线段是否被覆盖,随时查询当前被覆盖线段的总长度。 代码 基础函数 我们选择一个$O(1)$的取儿子函数: inline int leftChild(int p) { return p << 1; } // 左子树 inline int rightChild(int p) { return p << 1 | 1; } // 右子树 线段树的维护: void pushUp(int p) { t[p] = t[leftChild(p)] + t[rightChild(p)]; } // 向上维护区间 void pushUpMin(int p) { t[p] = std::min(t[leftChild(p)], t[rightChild(p)]); } // 向t[p]下放Min标签 void pushUpMax(int p) { t[p] = std::max(t

线段树模板二

感情迁移 提交于 2019-12-02 01:55:40
题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入格式 第一行包含三个整数N、M、P,分别表示该数列数字的个数、操作的总个数和模数。 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k 操作2: 格式:2 x y k 含义:将区间[x,y]内每个数加上k 操作3: 格式:3 x y 含义:输出区间[x,y]内每个数的和对P取模所得的结果 输出格式 输出包含若干行整数,即为所有操作3的结果。 输入输出样例 输入 #1 复制 5 5 38 1 5 4 2 3 2 1 4 1 3 2 5 1 2 4 2 2 3 5 5 3 1 4 输出 #1 复制 17 2 #include<bits/stdc++.h> typedef long long ll; using namespace std; const int maxn=2e5+9; struct tree{ int l,r; ll sum,add,mul; }a[maxn<<2]; ll s[maxn],p; void update(int k) { a[k].sum=(a[k<<1].sum+a

算法第二章上机实践报告

爱⌒轻易说出口 提交于 2019-11-30 08:21:38
1.代码规范(参考google的c++代码规范) 包含文件的名称及次序: 将包含次序标准化可增强可读性、避免隐藏依赖(hidden dependencies,注:隐藏依赖主要是指包含的文件编译),次序如下:C 库、C++库、其他库的.h、项目内的.h。 命名规范: 1、总体规则:不要随意缩写,如果说 ChangeLocalValue 写作ChgLocVal还有情可原的话,把ModifyPlayerName写作MdfPlyNm就太过分了,除函数名可适当为动词外,其他命名尽量使用清晰易懂的名词;   2、宏、枚举等使用全部大写+下划线;   3、变量(含类、结构体成员变量)、文件、命名空间、存取函数等使用全部小写+下划线,类成员变量以下划线结尾,全局变量以g_开头;   4、普通函数、类型(含类与结构体、枚举类型)、常量等使用大小写混合,不含下划线; 格式:   1、行宽原则上不超过80列,把22寸的显示屏都占完,怎么也说不过去;   2、尽量不使用非ASCII字符,如果使用的话,参考 UTF-8 格式(尤其是 UNIX/Linux 下,Windows 下可以考虑宽字符),尽量不将字符串常量耦合到代码中,比如独立出资源文件,返不仅仅是风格问题了;   4、函数参数、逻辑条件、初始化列表:要么所有参数和函数名放在同一行,要么所有参数并排分行;   5、除函数定义的左大括号可以置于行首外

算法第二章上机实践报告

血红的双手。 提交于 2019-11-30 06:33:09
1.实践题目 7-1 二分查找 2.问题描述 输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入格式: 输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。 输出格式: 输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入样例: 4 1 2 3 4 1 输出样例: 0 2 3.算法描述 核心算法是二分查找,将已经排好的序列一分为二,划分的中心数定义为mid,然后将mid与要查找的数相比较,根据大小再将将其划分。 源代码: #include <iostream> using namespace std; int s(int a[], int x, int n) { int l=0, r=n-1, num=1; int mid; int p=0; while(l<=r) { mid=(l+r)/2; if(x==a[mid]) { p=1; cout<<mid<<endl<<num; break; } else if(x>a[mid]) { l=mid+1; num++; } else { r=mid-1; num++; } } if(p==0) { cout<<"-1"<<endl<<num-1; } } int

算法第二章上机实验报告

◇◆丶佛笑我妖孽 提交于 2019-11-30 06:26:15
一、实践题目:二分查找 输入n值(1<=n<= 1000)、n个 非降序排列的整数 以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入格式: 输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。 输出格式: 输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。 输入样例: 4 1 2 3 4 1 输出样例: 0 2二、问题描述1.输入:第一行输入n值,第二行输入n个非降序排列的整数,第三行输入要查找的数x。2.用二分查找算法查找x3.输出:1)x存在,输出x的下标 & 比较次数 2)x不存在,输出 -1 & 比较次数三、算法描述1.输入整数n2.用for循环输入n个非降序的整数,存入数组a[]3.输入要查找的数x4.让l指向第一个数a[0],r指向最后一个数a[n-1],初始化mid=0,flag=0来记录有无找到x,cnt=0来记录比较次数5.用while循环来找x 1)mid=(l+r)/2 比较次数可以cnt加一 2) mid和x比较,如果找到的话 flag = 1,就输出mid和cnt;如果mid比x小,则把mid+1赋值给l,继续while循环,直到mid=x 或 l > r;如果比x大,则把mid-1赋值给l,继续while循环,直到mid=x 或 l > r;6

luogu P3407 散步 解题报告

流过昼夜 提交于 2019-11-29 21:25:15
题目描述 一条道路上,位置点用整数A表示。 当A=0时,有一个王宫。当A>0,就是离王宫的东边有A米,当A<0,就是离王宫的西边有A米。 道路上,有N个住宅从西向东用1-N来标号。每个住宅有一个人。住宅只会存在于偶数整数点。 该国国王认为,国民体质下降,必须要多运动,于是下命令所有人都必须出门散步。所有的国民,一秒钟可以走1米。每个国民各自向东或者向西走。这些方向你是知道的。命令发出后所有人同时离开家门开始散步。 然而该国的国民个都很健谈,如果在散步途中两个人相遇,就会停下来交谈。正在走路的人碰到已经停下来的人(重合)也会停下来交谈。一但停下来,就会聊到天昏地暗,忘记了散步。 现在命令已经发出了T秒,该国有Q个重要人物,国王希望能够把握他们的位置。你能帮他解答吗? 输入格式 第一行是3个整数,N,T,Q 接下来N行,每行两个整数Ai,Ri。Ai是家的坐标,如果Ri是1,那么会向东走,如果是2,向西。数据保证Ai是升序排序,而且不会有两个人初始位置重合。 接下来Q行,每行一个整数,表示国王关心的重要人物。 输出格式 Q行,每行一个整数,表示这个人的坐标。 20%数据 N<=100,T<=10000 另外20%数据 N<=5000 另外20%数据 从最西边数起连续的若干国民全部往东,剩下的全部往西 100%数据 Ai为偶数,|Ai|<=10^18,|T|<=10^18,1<=Q<=N<