基础算法
Zeolim
这个作者很懒,什么都没留下…
展开
-
[51nod] 1001 数组中和等于K的数对
1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对。例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5)。Input第...原创 2018-04-15 21:42:49 · 207 阅读 · 0 评论 -
[模板]排序
1.快速排序 #include <iostream>using namespace std;const int MAXN = 2e5 + 10;int arr[MAXN];int len;void qsort(int arr[], int fst, int lst){ int i = fst, j = lst; int mid =...原创 2018-07-25 16:15:25 · 180 阅读 · 0 评论 -
[二分] [POJ] 2456 Aggressive cows
网上都是二分搜索答案其实过程也可以二分搜索洛谷有个扔瓶盖一样的#include <iostream>#include <algorithm> using namespace std;const int MAXN = 1e5 + 50;int cow[MAXN] = {0};int dis[MAXN] = {0};int N, C, ...原创 2018-07-24 17:42:15 · 195 阅读 · 0 评论 -
[模板] 乘法逆元及其应用 (51nod 1013 3的幂的和)
1.拓展欧几里得求逆元#include <bits/stdc++.h>typedef long long ll;using namespace std;ll x,y;ll eggcd(ll m,ll n){ if(n==0) { x=1; y=0; return m; } int r=egg...原创 2018-05-23 17:11:18 · 196 阅读 · 0 评论 -
[51nod] 1279 扔盘子
1279 扔盘子 题目来源: Codility基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。盘子有几种命运:1、掉到井底。2、被卡住。3、落到别的盘子上方。盘子的高度也...原创 2018-05-15 21:04:34 · 194 阅读 · 0 评论 -
[模板] 结构体使用CMP SORT 二分 的技巧 (重载) 应用51nod 四个数和为零
一千组数据,枚举出所有任意两个数的组合,一共1000 * 1000组记录组合来的下标 然后二分查相反数并查重。#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 1010;int a[MAXN] ;str...原创 2018-05-21 21:10:56 · 260 阅读 · 0 评论 -
[贪心][51nod] 1133 不重叠的线段
1133 不重叠的线段 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注X轴上有N条线段,每条线段有1个起点S和终点E。最多能够选出多少条互不重叠的线段。(注:起点或终点重叠,不算重叠)。例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重叠。Input第1行:1个数N,线段的数量(2 ...原创 2018-05-08 17:07:58 · 151 阅读 · 0 评论 -
[二分] [51nod]1010 只包含因子2 3 5的数 lower_boud
#include <iostream>#include <algorithm>using namespace std;#define MAXN 1e18 + 998typedef long long ll;ll a[100010];int main(){ ll flag = 0; for(ll i = 1; i < MAXN; i *= 2) ...原创 2018-05-08 10:54:45 · 109 阅读 · 0 评论 -
[记忆化搜索] [洛谷] P1464 Function
题目描述对于一个递归函数w(a,b,c)如果a<=0 or b<=0 or c<=0就返回值1.如果a>20 or b>20 or c>20就返回w(20,20,20)如果a<b并且b<c 就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)其它别的情况就返回w(a-1,b,c)+w(a-1,b-1,c...原创 2018-05-14 19:15:08 · 282 阅读 · 0 评论 -
[质数筛法] [51nod]1181 质数中的质数(质数筛法)
是质数并且质数编号也是质数筛一下二分查初位暴力查下位#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int MAXN = 1e6 + 10;ll check[MAXN] = {0};ll prime[MAXN]...原创 2018-08-04 16:20:55 · 176 阅读 · 0 评论 -
[DP] [模板] 01背包
1.标准模板以横轴坐标为体积以纵轴坐标为当前物品至首物品则 dp[i][j] 即为 OPT(体积j, 物品1 - i)//#pragma GCC optimize(2)#include <cstdio>#include <iostream>#include <cstdlib>#include <cmath>#include...原创 2018-08-11 15:14:12 · 171 阅读 · 0 评论 -
[单调栈]1156E Special Segments of Permutation
题意:给一个1-n的排列, 你需要求出有多少个区间满足a[l] + a[r] = max(a[l] - a[r]);解题思路首先记录每个数字的下标然后用单调栈维护以 a[i] 为最高点的区间然后枚举 a[i] 区间内较短一侧的数因为1 - n 排列数值唯一且已经记录了位置, 所以可以 O(1) 的求出 (a[i] - 小区间内数 )是否在右侧区间中, 统计得解代码:...原创 2019-05-09 18:49:38 · 361 阅读 · 0 评论 -
[GCD] 最小LCM
题目:给n个数, 你需要找两个数使得LCM最小, 将两个数的位置输出解题思路:题目时间给了四秒, 数据范围 1e7所以暴力是可以过的尝试使用枚举范围内所有 gcd 解决问题对于每个gcd x 有任意 gcd(n * x, m * x) = x用 O nsqrt(n)的筛法可以枚举出当前gcd = x下 最小的两个数组中含有的数字并计算结果且这两个数字必定是...原创 2019-05-05 10:48:49 · 282 阅读 · 0 评论 -
[模板][倍增] ST算法 RMQ 区间中最大得值
ST算法是区间倍增保存信息的典型例子树高log2(n) + 1, 第i行的每个结点保存从原数组当前位之后 (1 << (i - 1)) 的最大值很容易发现最大值不断传递并符合通式rmq[i][j] = max(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1) )]);查询时把区间分成可以交叉的两部分 l 到 l + 2...原创 2019-04-07 09:24:42 · 240 阅读 · 0 评论 -
[模板]三分搜索
三分思想是二分的一个简单延展二分区间要求是简单线性变换而对于二次函数等单 峰 / 谷 函数无法获得正确的逼近趋向而三分搜索可以解决这样的问题设左右两三分点 X, Y若F(X) > F(Y) 则有 X = A&&Y = B 或 X = A &&Y = C; 则必定有峰在X 右侧同理 则必定...原创 2019-03-13 19:05:39 · 200 阅读 · 0 评论 -
[模板][字符串] 最小表示
字符串最小表示:给定一循环字符串,求出位置k使得从k位置开始的字符串字典序最小解法 : 设双指针i, j 比较 s[i] 与 s[j] 的关系若s[i] == s[j] 则以i,j开头的两字符的大小关系目前是相同的直接向后, 找到第一个不同点i,j 若有s[i + k]> s[j + k], 则必有以i - i + k开头的字符串非最小 废话反之亦然 这一大部分可以...原创 2019-04-07 09:18:50 · 243 阅读 · 0 评论 -
[模板] 快速乘 O(1)乘法 解决模运算下整数乘法64位变量溢出问题
快速乘原理同快速幂不做赘述ll qmul(ll a, ll b, ll mod) //快速乘{ ll ans = 0; while(b) { if(b & 1) ans = (ans + a) % mod; a = (a + a) % mod; b >>= 1; ...原创 2019-03-10 10:37:17 · 374 阅读 · 0 评论 -
[牛客寒假算法基础集训营6总结]
A.[简单数学思维递推]易得m题所组成所有分数集合中极小值m*6 极大值m*9, 因其子和差值均一, 则有若干组合组成连续闭区间[6*m, 9*m]易推得6数极小时应有其余三数组合极大 则有公式ans = max(-(n - m * ll(6)) + m, ll(0)) (未化简)---------------------------------------------...原创 2019-04-03 15:49:31 · 479 阅读 · 0 评论 -
[线段树] [51nod] 1174 区间中最大的数
裸线段树且只有查询基础#pragma GCC optimize(2)#include <iostream>#include <cmath>#include <iomanip>using namespace std;const int MAXN = 1e6 + 10;typedef long long ll;ll arr[M...原创 2018-08-07 10:42:40 · 205 阅读 · 0 评论 -
[贪心] 51nod 1428 活动安排问题
1428 活动安排问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? Input第一行一个正整数n (n <= 10000)代表活动的个数。第二行到第(n + 1)行包含n个开始时间和...原创 2018-05-06 14:41:27 · 203 阅读 · 0 评论 -
[栈操作] [NYISTOJ] 括号配对问题
括号配对问题时间限制:3000 ms | 内存限制:65535 KB难度:3描述现在,有一行括号序列,请你检查这行括号是否配对。输入第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[", "]", "(...原创 2018-05-18 14:04:57 · 185 阅读 · 0 评论 -
51nod 1087 1 10 100 1000
1087 1 10 100 1000 题目来源: Ural 1209基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注1,10,100,1000...组成序列1101001000...,求这个序列的第N位是0还是1。Input第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)第2 - T + 1行:每行1个数...原创 2018-04-20 14:55:59 · 184 阅读 · 0 评论 -
51nod 1081 子段求和(前缀和)
1081 子段求和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和。例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1。3 + 7 + 9 = 19,输出19。Input第1行:一个数N,N为数组的长度(2 <= N <= ...原创 2018-04-18 20:40:34 · 183 阅读 · 0 评论 -
51nod 1049 最大子段和
1049 最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注N个整数组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续子段和的最大值。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。Input第1行:整数序列的长度N(2 &l...原创 2018-04-18 19:27:25 · 126 阅读 · 0 评论 -
51nod 最长公共子序列
基本算法如上#include <iostream>using namespace std;string a,b;int c[1010][1010] = {0};//记忆化最长度int step[1010][1010] = {0};//记忆最长来源int main(){ cin>>a>>b; a = '1' + a; b = '1' + b;...原创 2018-04-18 16:37:26 · 144 阅读 · 0 评论 -
51nod 1289 大鱼吃小鱼 (模拟)(栈操作)
1289 大鱼吃小鱼 题目来源: Codility基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?Input第1行:1个数N,表示鱼的数量...原创 2018-04-22 17:32:47 · 322 阅读 · 0 评论 -
51nod 1134 最长递增子序列
1134 最长递增子序列#include <iostream>using namespace std;int a[100010],b[100010];//b数组用来记录当前情况下各位最小值的递增子序列int main(){ int n; cin>>n; for(int i = 0; i < n; i++) { cin>>a[i]; }...原创 2018-04-18 13:46:08 · 99 阅读 · 0 评论 -
[模板] [高精度] 大数加减 大数乘法 51NOD 1005/1027
给出2个大整数A,B,计算A+B的结果。Input第1行:大数A第2行:大数B(A,B的长度 <= 10000 需注意:A B有可能为负数)Output输出A + BInput示例68932147586468711654886Output示例537643802472 减法还有点凌乱,慢慢整理, 符号判断放在外面了,函数比较好...原创 2018-04-12 09:35:12 · 280 阅读 · 0 评论 -
[51nod] 1080 两个数的平方和
1080 两个数的平方和 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注给出一个整数N,将N表示为2个整数i j的平方和(i <= j),如果有多种表示,按照i的递增序输出。例如:N = 130,130 = 3^2 + 11^2 = 7^2 + 9^2 (注:3 11同11 3算1种)Input一个数N(1 &...原创 2018-04-16 20:06:34 · 170 阅读 · 0 评论 -
[STL] [51nod] 1095 Anigram单词 map
1095 Anigram单词 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram。Input第1行:1个数N,表...原创 2018-05-02 12:32:45 · 187 阅读 · 0 评论 -
[模板] 归并排序 逆序数 分治
归并排序图来自维基递归调用的过程需要在脑中模拟清楚然后是代码的细节问题多复习多理解刘汝佳版#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 10;int ans = 0;int arr[MAXN] = {0};int brr[MAXN] = {0};...原创 2018-04-24 20:31:47 · 174 阅读 · 0 评论 -
51nod 1088 最长回文子串
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。输入一个字符串Str,输出Str里最长回文子串的长度。Input输入Str(Str的长度 <= 1000)Output输出最长回文子串的长度L。Input示例daabaacOutput示例5解法一:暴力枚举所有串若当前枚举串长度大于已知最大回文串传到函数里判断是否是回文串#include <iostream>...原创 2018-04-27 10:54:44 · 198 阅读 · 0 评论 -
51nod 1091 线段的重叠
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注X轴上有N条线段,每条线段包括1个起点和终点。线段的重叠是这样来算的,[10 20]和[12 25]的重叠部分为[12 20]。给出N条线段的起点和终点,从中选出2条线段,这两条线段的重叠部分是最长的。输出这个最长的距离。如果没有重叠,输出0。Input第1行:线段的数量N(2 <...原创 2018-04-26 22:32:11 · 244 阅读 · 0 评论 -
[搜索][51nod] 1268 和为K的组合
1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注给出N个正整数组成的数组A,求能否从中选出若干个,使他们的和为K。如果可以,输出:"Yes",否则输出"No"。Input第1行:2个数N, K, N为数组的长度, K为需要判断的和(2 <= N <= 20,1 <= K <...原创 2018-05-17 07:18:14 · 202 阅读 · 0 评论 -
背包问题总结
一: 01背包状态转移方程 if(j < wet[i])//如果装不下 dp[i][j] = dp[i - 1][j]; else//装的下 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - wet[i]] + val[i]);51nod 1085 ac代码#include <iostream>using namespace s...原创 2018-04-25 20:13:43 · 147 阅读 · 0 评论 -
51nod 1284 2 3 5 7的倍数
1284 2 3 5 7的倍数 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。Input输入1个数N(1 <= N <= 10^18)。Output输出不是2 3 5 7的倍数的数共有多少。Input示例10Output示例1容...原创 2018-04-21 23:08:27 · 183 阅读 · 0 评论 -
51nod 1347 旋转字符串
1347 旋转字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注S[0...n-1]是一个长度为n的字符串,定义旋转函数Left(S)=S[1…n-1]+S[0].比如S=”abcd”,Left(S)=”bcda”.一个串是对串当且仅当这个串长度为偶数,前半段和后半段一样。比如”abcabc”是对串,”aabbcc”则不是。现在问题是给定一个字符串...原创 2018-04-24 22:46:41 · 179 阅读 · 0 评论 -
斯特林公式 求数字位数
数学方法 理解log的内涵一,求位数C语言中只有log和log10两种函数。 log()//表示ln; log10()//表示log10如果想表达log a,b 那么可以使用log(b)/log(a)来解决。求位数 log10(n)+1;//log10()要向下取整二,斯特林公式n! = sqrt(2 * pi * n) * (n / e)res = (long) ( (log10(sqrt(4....原创 2018-04-24 21:23:07 · 721 阅读 · 2 评论 -
[技巧]ARubbish
套树会爆内存,sort PAIR 离散后暴搜染色/* Zeolim - An AC a day keeps the bug away*///#pragma GCC optimize(2)#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef long double ld;#...原创 2019-06-09 19:21:02 · 229 阅读 · 0 评论