基础算法
无
DJL_DJL_DJL
程序是我的生命,但我相信爱她甚过爱我的生命。
展开
-
【时空复杂度分析】
一般10^7 ~ 10^8为1s 一般 ACM 或者笔试题的时间限制是 1 秒或 2 秒。 在这种情况下,C++ 代码中的操作次数控制在 10^7为最佳。 下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择: ...原创 2021-08-20 11:34:04 · 56 阅读 · 0 评论 -
Acwing_107超快速排序 【求逆序对思想】
题目链接:超快速排序 AC代码: #include<iostream> #include<cstdio> using namespace std; typedef long long LL; const int N = 500010; LL q[N], tmp[N]; LL merge_sort(LL q[], int l, int r) { if (l >= r) return 0; int mid = l + r >> 1; LL res = merge原创 2021-08-10 15:54:10 · 56 阅读 · 0 评论 -
Acwing_106动态中位数 【对顶堆思想】
题目链接:动态中位数 AC代码: #include<iostream> #include<algorithm> #include<queue> using namespace std; int main() { int T; scanf("%d", &T); while (T--) { int n, m; scanf("%d%d", &n, &m); printf("%d %d\n", n, (m + 1) / 2); int原创 2021-08-10 15:52:21 · 66 阅读 · 0 评论 -
【归并排序模板】
#include<iostream> #include<cstdio> using namespace std; const int N = 100010; int n; int q[N], tmp[N]; void merge_sort(int q[], int l, int r) { if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid), merge_sort(q, mid + 1,原创 2021-08-10 15:31:40 · 42 阅读 · 0 评论 -
Acwing_788求逆序对的数量 【归并排序思想】
AC代码: #include<iostream> #include<cstdio> using namespace std; typedef long long LL; const int N = 100010; int n; int q[N], tmp[N]; LL merge_sort(int q[], int l, int r) { if (l >= r) return 0; int mid = l + r >> 1; LL res = merge_.原创 2021-08-10 15:30:33 · 49 阅读 · 0 评论 -
Acwing_1273天才的记忆【RMQ算法(ST表)】
输入样例: 6 34 1 8 123 3 2 4 1 2 1 5 3 4 2 3 输出样例: 34 123 123 8 AC代码: #include<iostream> #include<cmath> #include<algorithm> #include<cmath> using namespace std; const int N = 200010,M=18; int n, m; int w[N]; int f[N][M]; void...原创 2021-08-10 11:59:11 · 128 阅读 · 0 评论 -
Acwing_102增减序列 【贪心+差分】
题目链接:增减序列 AC代码:原创 2021-08-09 11:37:21 · 110 阅读 · 0 评论 -
Acwing_113特殊排序 【思维型二分,序列不具有单调性】
题目链接:特殊排序 AC代码: class Solution { public: vector<int> specialSort(int N) { vector<int> res; res.push_back(1); for (int i = 2; i <= N; i++) { int l = 0, r = res.size() - 1; while (l <= r) { int mid = l + r >> 1; i原创 2021-08-09 10:44:39 · 65 阅读 · 0 评论 -
Acwing_102最佳牛围栏 【思维型二分】
题目链接:最佳牛围栏 二分问题其实可以转化为判定问题 该问题的思路就是先假设存在这样一个平均值avg,然后用二分进行逐步判断 给定一个平均值avg,判断是否存在一个方案,使其平均值≥avg AC代码: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int N = 100010; int n, F; dou原创 2021-08-09 10:21:23 · 101 阅读 · 0 评论 -
Acwing_99激光炸弹 【二维前缀和】
题目链接:激光炸弹 AC代码: #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 5010; int n, m; int s[N][N]; int main() { int cnt, R; cin >> cnt >> R; R = min(5001, R); n = m = 5001; wh原创 2021-08-09 09:08:55 · 77 阅读 · 0 评论 -
Acwing_803区间合并 【区间合并】
给定 n 个区间 [li,ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3]和[2,6]可以合并为一个区间[1,6]。 输入格式: 第一行包含整数n。 接下来n行,每行包含两个整数 l 和 r。 输出格式: 共一行,包含一个整数,表示合并区间完成后的区间个数。 数据范围 1≤n≤100000, −10^ 9 ≤li≤ri≤10^9 输入样例: 5 1 2 2 4 5 6 7 8 7 9 输出样例: 3 思路分析: (1)按区间左端点进行排序原创 2021-08-08 23:09:48 · 48 阅读 · 0 评论 -
【位运算】
常用的两个操作: 求数n的二进制序列中第k位数是几? int n = 10,k=2;//1010 int num = n >> k & 1; cout << num; lowbit(x)运算,返回x的最后一位1 x&-x可以看成x&(x取反+1) int lowbit(int x) { return x & -x; } lowbit(x)运算可以用来求一个数x二进制序列中1的个数,具体代码如下: //求x的二进制中1的个数 int res原创 2021-08-08 17:52:02 · 44 阅读 · 0 评论 -
Acwing_799最长连续不重复子序列 【双指针算法】
AC代码: #include<iostream> #include<algorithm> using namespace std; const int N = 100010; int a[N], s[N]; int n; int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &a[i]); int res = 0; for (int i = 0,j=0; i <.原创 2021-08-08 17:26:57 · 50 阅读 · 0 评论 -
Acwing_797差分 【一维差分】
AC代码: #include<iostream> using namespace std; const int N = 100010; int n, m; int a[N], b[N]; void insert(int l, int r, int c) { b[l] += c; b[r+1] -= c; } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) scanf("%d",.原创 2021-08-08 15:30:50 · 64 阅读 · 0 评论 -
Acwing_796子矩阵的和 【二维前缀和】
题目描述: 输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式: 第一行包含三个整数n,m,q。 接下来n行,每行包含m个整数,表示整数矩阵。 接下来q行,每行包含四个整数x1, y1, x2, y2,表示一组询问。 输出格式: 共q行,每行输出一个询问的结果。 数据范围 1≤n,m≤10001≤n,m≤1000, 1≤q≤2000001≤q≤200000, 1≤x1≤x2≤n原创 2021-08-08 11:52:43 · 58 阅读 · 0 评论 -
Acwing_795前缀和 【一维前缀和】
题目描述: 输入一个长度为n的整数序列。 接下来再输入m个询问,每个询问输入一对l, r。 对于每个询问,输出原序列中从第l个数到第r个数的和。 输入格式: 第一行包含两个整数n和m。 第二行包含n个整数,表示整数数列。 接下来m行,每行包含两个整数l和r,表示一个询问的区间范围 输出格式: 共m行,每行输出一个询问的结果。 数据范围 1≤l≤r≤n, 1≤n,m≤100000, −1000≤数列中元素的值≤1000 输入样例: 5 3 2 1 3 6 4 1 2 1 3 2 4 输出样例: 3 6 10原创 2021-08-08 11:50:30 · 65 阅读 · 0 评论 -
大数的加减乘除运算
大数相乘: #include<iostream> #include<string> #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.size()原创 2021-08-08 10:49:50 · 56 阅读 · 0 评论 -
【快速加】
快速加类似于快速幂运算 #include<iostream> #include<cstdio> using namespace std; typedef long long LL; //实现快速加 LL qadd(LL a, LL b, LL c) { LL res = 0; while (b) { if (b & 1) { res =(res+a)%c; } a = (a+a) % c; b >>= 1; } return res;原创 2021-08-07 22:29:45 · 71 阅读 · 0 评论