自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 n皇后问题

算法思路注意遍历所有情况都顺序和当发现有解,和提前剪枝时的回溯情况#include <iostream>using namespace std;const int N = 20;//存放棋谱中*和Q和情况char g[N][N];int n;//bool数组用于表示该 列col 对角线dg 反对角线udg 是否可以继续存储bool col[N],dg[N],udg[N];//每行只能放一个皇后,所以用类似全排列的方式搜索void dfs(int u){ .

2021-06-13 20:17:06 83

原创 合并区间-

算法思路将区间按左端点排序,按区间包含的三种情况进行排序#include <iostream>#include <vector>#include <algorithm>using namespace std ;typedef pair<int,int> pii ;vector<pii>nums,res;int main(){ int st=-2e9,ed=-2e9 ; .

2021-06-03 20:19:07 79

原创 整数离散化区间和

算法思路即当数据值域很大,但实际上不需要存储这么多值,所以映射到一个数组即可,步骤如下:先统计添加到x和询问l和r的下标统一存入alls数组,经过一遍去重之后将其存入a数组,之后问题转化为前缀和。#include <iostream>#include <vector>#include <algorithm>using namespace std;typedef pair<int, int> PII;const int N = 300010;.

2021-06-03 19:03:05 227

原创 二进制中1的个数

算法思路运用c++中的与运算, x&-x。x原码:10101000-x原码:01011000与操作过后得00001000即仅保留最后一个1自己定义个lowbit一直减就ok#include<iostream>using namespace std;int lowbit(int x){ return x&(-x);}int main(){ int n; cin>>n; while(n--){ i.

2021-06-01 17:44:41 67

原创 判断子序列

算法思路注意不是kmp啊!!!只有保持A序列在B序列按序出现即可#include<iostream>#include<cstdio>using namespace std;const int N=1e5+10;int a[N],b[N];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i = 0;i < n; i++) scanf("%d",&a[i]); .

2021-06-01 16:59:44 47

原创 数组元素目标和

算法思路注意到数组均为有序序列#include <iostream>using namespace std;int n,m,x;const int N = 100010;int a[N],b[N];int main(){ scanf("%d%d%d",&n,&m,&x); for(int i = 0;i<n;i++) scanf("%d",&a[i]); for(.

2021-06-01 15:54:16 86

原创 最长不重复子序列

算法思路1.双指针算法在此相当于优化,原来的暴力做法的O(n^2)算法穷举所有状态,在发现某性质后仅需枚举O(n)次2.首先定义快指针i和慢指针j,用于维护一个区间[i,j]此时区间内为q[i]结尾的最长不重复序列。所以我们仅需遍历一遍数组保留res最大值即可3.对于每一个i,如何求j的位置:首先我们知道[j,i-1]是上一步的最长不重复序列,那么此时j不可能向左移动,否则与上一步矛盾,所以j只能右移动,这也就是j的单调性所在,我们可以用双指针优化的原因。4.j向右移动什么时候停下,即满足chec.

2021-06-01 15:31:19 337

原创 差分矩阵(二维差分)

算法思路难点在于构造差分二维数组,用法则和前缀和相似#include<iostream>#include<cstdio>using namespace std;const int N = 1e3 + 10;int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c){ b[x1][y1] += c; b[x2 + 1][y1] -= c; b[x1][y2 + .

2021-06-01 13:51:43 267

原创 差分数组(前缀和的逆运算)

算法思路现给出差分定义:原有数组a[1],a[2],a[3]…a[n]构造数组b[1],b[2],b[3]…b[n]使的a[i] = b[1] + b[2] …+b[n]即a[n]数组为b[n]数组的前缀和换句话说使b[i] = a[i] - a[i-1] 即可此时在区间[l,r]上加c的操作即可转移到b[n]数组进行。具体操作为在b[l] + c,在b[r+1] - c即可#include <iostream>using namespace std;int n,m;.

2021-06-01 13:31:14 174

原创 高精度除法

算法思路定义r维持除数,注意最后的结果需要反转#include <iostream>#include <vector>#include <algorithm>using namespace std;vector<int> div(vector<int> A,int b,int &r){ vector<int> C; r = 0;//维持被除数 for(int i=A.size()-1;.

2021-05-31 14:49:49 70

原创 高精度乘法

算法思路每次A[i]之间称上b#include <iostream>#include <vector>using namespace std;vector<int> mul(vector<int> &A,int b){ vector<int> C; int t = 0; for(int i=0;i<A.size()||t;i++) { if(i<A.si.

2021-05-31 14:25:56 44

原创 浮点数二分

算法思路其立方根答案肯定在[-10000,10000]设好区间二分即可#include <iostream>using namespace std;int main(){ double x; cin>>x; double l = -10000; double r = 10000; while(r-l > 1e-8) { double mid = (l+r)/2; .

2021-05-31 13:35:26 90

原创 求逆序对数(归并排序)

算法思路1.即在归并排序合并数组时恰好可以统计逆序对的数量2.给出统计规则如下:if(q[i]<q[j]) 不产生逆序对else 产生mid-i+1个逆序对#include <iostream>using namespace std;const int N = 100010;int q[N],tmp[N],n;long long merge_sort(int l,int r,int q[]){ if(l>=r) return .

2021-05-31 13:17:01 143

原创 第k个数(快速选择)

算法思路快速选择:1.即任意选一个数,将数组划分为二。2.最终根据该数所在的位置,即第?大,选择第k大的数字所在区间进行划分。时间复杂度分析,第一次划分n,下一次划分期望n/2,n/4…累加和小于等于2n故快速选择算法是时间复杂度为O(n)的算法。理解该算法的难点即一次划分之后,指针j值向哪一个数,当选取的x为重复值时呢?#include <iostream>using namespace std;int n,k;const int N = 100010;int q.

2021-05-31 02:27:58 472 1

原创 前缀和矩阵

算法思路1.主要是理解计算s[i,j]的含义和初始化方法2.和计算(x1,y1)和(x2,y2)间矩阵计算公式

2021-05-30 20:29:00 153

原创 前缀和的应用

算法思路即用空间换时间,注意s[0] = 0;#include <iostream>using namespace std;int n,m;const int N = 100010;int a[N],s[N];int main(){ scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) scanf("%d",&a[i]); s[0] = 0; .

2021-05-30 20:12:07 58

原创 高精度减法

算法思路和高精度加法类似,注意到题中给的A和B都是正整数,若不加限制则需对输入输出做出限制,问题转换为|A|-|B|或|A|+|B|。1.对于减法首先处理A>=B问题决定是否为负数2.其次在对借位数为负的情况处理 (t+10)%103.最后对前导0进行处理#include <iostream>#include <vector>using namespace std;// A>Bbool cmp(vector<int> &A,ve.

2021-05-30 19:27:49 91

原创 高精度加法

算法思路像手写加法一样计算Ci = Ai + Bi + t (t表示进位)注意反向存储数字aotu的用法:#include <iostream>#include <vector>using namespace std;//C = A+Bvector<int> add(vector<int> A,vector<int> B){ vector<int> C; int t = 0; .

2021-05-27 17:22:19 152

原创 二分查找法

算法思路两次二分算法分别找到上下界#include <iostream>using namespace std;const int N = 100010;int n,q[N],k,x;int main(){ scanf("%d%d",&n,&k); for(int i=0;i<n;i++) scanf("%d",&q[i]); while(k--) { scanf("%d",&.

2021-05-27 02:45:26 58

原创 归并排序

算法思路算法动态图解1.不断将无序数组划分为均匀两部分,直到不可划分(数组长度为2即可)2.将无序数组整理为有序后,两两合并#include <iostream>using namespace std;const int N = 100010;int n,q[N],tmp[N];void merge_sort(int l,int r,int q[]){ if(l>=r) return; //将问题划分为子问题 int mi.

2021-05-25 14:47:22 54

原创 快速排序算法

代码思路:1.选取区间内的一个值作为基准X。2.做一次划分,将区间内比X小的值放在左边,比X值大的数字放在右边。3.分别对左边右边区间递归执行步骤1和2,直至区间仅有一个元素。#include <iostream>using namespace std;const int N = 10000010;int n,q[N];void quick_sort(int l,int r,int q[]){ if(l>=r) return; else { //在给.

2021-05-25 00:25:46 61

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除