![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
_Rikka_
- v -
展开
-
C. Going Home (抽屉原理、范围、暴力)
题目抽屉原理看题目的数据,其中可以发现两个数相加结果最大也只是5e6,根据抽屉原理,只要有5e6+1个数就至少会有两个数相加得到相同的值。那么也就是说只要枚举出来的两个数相加的答案最多有5e6+1个就一定会得到至少两组坐标满足相加相等,直接暴力即可。#include<iostream>using namespace std;typedef long long ll;const int Max = 5e6 + 5;int lst[Max];int ls[Max][2];int m原创 2021-03-16 22:47:43 · 217 阅读 · 2 评论 -
C. Eugene and an array (区间为0前缀和处理)
题目思路:以每一个位置作为右端点取其前面为0区间的左端点的最大值为左端点,这一个字串就是以该位置为右端点,满足条件的最大长度的子串,它产生的贡献是(r-lmax-1,为了不把左端包含进去,包含进去就有为0的区间了),所有贡献相加即为答案。而对于如何判断一个区间是否为0,以及这个最大左端点的记录。我们可以使用前缀和来纪录某区间是否为0,sum[i]=sum[j] 那从i+1…j的元素的和为0,我们用map来记录,每次添加进一个新的和,如果前面已经出现了该值,则代表从前一个位置+1到此区间和为0,然后对于原创 2021-03-15 00:54:53 · 161 阅读 · 0 评论 -
C. Floor and Mod (分块整除)
题目a/b=i, a%b=i -> a=i*(b+1),(对于一个b可以配出几个i就可以产生几个贡献)可以知道对于给出的x,y 取任意1<=b<=y,一个b产生的贡献为min(x/(b+1),b-1)当x>=(b+1)(b-1)时对于此时的b的贡献全取b-1当x<(b+1)(b-1)时按x/(b+1)的贡献,此时用整除分块求解另注意下范围,细节见代码Code:#include<iostream>#include<cmath>#def原创 2021-02-18 00:56:05 · 211 阅读 · 0 评论 -
C. The Hard Work of Paparazzi (dp)
题目思路:这是一道最长递增子序列的变式。dp[i] 代表前i个名人中第i个名人被访问所能访问的最大名人数目先看暴力的方法,那么我们直接遍历前面所有情况当abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j] i<j 时dp[i]=max(dp[i],dp[j]+1)但这时时间复杂度O(n^2) 会超时,我们需要优化一下这时我们发现最大的距离不会超过2r-2,而对于每个名人出场的时间是递增的,也就是说一旦出场的名人相隔超过2r-2位那么他们相隔时间也超过原创 2021-02-17 12:02:00 · 186 阅读 · 0 评论 -
F. Zero Remainder Sum(四维dp)
题目状态:dp[i][j][k][o] 代表第i行前j个数已经选定k个数余o最大总和的值首先来单独看一行,lst[i][j] 代表第i行第j个数dp[i][j][k][o]=dp[i][j-1][k][o] , 此代表在第i行我们不选第j个数,所以选定的个数k不变,余数也不变dp[i][j][k][o]=dp[i][j-1][k-1][(o-lst[i][j]+70p)%p] ,此代表第i行选择了第j个数,所以由选定数k-1转换而来,p是题目要求余的数,o-lst[i][j]表示,要想得到加了l原创 2021-02-17 10:31:07 · 237 阅读 · 0 评论 -
1372 D. Omkar and Circle (思维、前缀和)
题目思路:对于为n的奇数,可以进行(n-1)/2次让一个数取代相邻两数操作,直到最后只剩下一个数,其实每次操作就是删掉了一个数,那要如何让删除后的总和最大? 首先贪心一下,我们一定不能删掉变成了两个数相加的那个数,如 1 2 3 4 5 假设第一步删掉1 -> 7 3 4 那之后删掉的数不能是7 因为 再删7=删掉1 2 5相当于删去了3个数,我们可以对比删掉2 5一定优于删掉1 2 5。而要不删掉已经加过一次的数就一定要删掉不是相邻的数,问题就转化成了从n个数中删掉(n-1)/2个不相邻的数原创 2021-02-12 12:37:15 · 193 阅读 · 0 评论 -
D. Radio Towers(dp、逆元)
题目思路:状态方程dp[i]代表从1–n都被照亮的方法数。dp[i]=dp[i-1]+dp[i-3]+dp[i-5]+dp[i-7]…可以看一个例子i=5,假设0表示没照亮1表示照亮dp[5] 1到5都亮可以由以下状态转变而来dp[4] 11110 在i=5处放亮度为1的灯dp[2] 11000 在i=4处放亮度为2的灯dp[0] 00000 在i=3处放亮度为3的灯故dp[5]=dp[4]+dp[2]+dp[0]再如dp[6]=dp[5]+dp[3]+dp[1]所以我们原创 2021-02-11 00:29:08 · 225 阅读 · 0 评论 -
逆元
参考于此篇博客:https://www.cnblogs.com/kongbursi-2292702937/p/10582258.html逆元定义:对于a*b≡1(mod m),b是a在模m下a的逆元。首先对于同余符号≡,如 a≡b%m 表示的意思是a%m=b%m,a、b模m后余数相同。逆元可以看作一个数的倒数 c * b≡1(mod m)(b为c的逆元)可得(a/c)%m=(a*b)%m推导过程:(a/c)%m=(a/c)*1%m=(a/c) * c * b%m=(a * b)%m由费马原创 2021-02-10 19:48:04 · 1186 阅读 · 0 评论 -
1430E - String Reversal (树状数组、队列)
题目思路:首先贪心一下,我们想要使得移动次数最小那肯定用前面离得近的元素去移动,所以我们用一个que来记录各个元素的位置,每使用完这个前面的位置的就pop掉。其次对于每一次移动我们需要知道它之前还剩多少个元素在这我们用树状数组来维护,每移去一个元素我们就让这个元素-1,初始时都为0.然后每次操作只需+que(i)-1的贡献即可。如:3 4 5 3 7 6 3假设我把7移到了最前面(干脆直接当作7不存在了) 3 4 5 3 (7) 6 3,那么对于原本7后面的6 3,他们下一步想要移到队首需要交换的次原创 2021-02-04 18:55:56 · 158 阅读 · 0 评论 -
1475C Ball in Berland (思维)
题目思路:看N为2e5可知复杂度为O(n)或O(nlogn),在这我用两个map分别记录每个男和女各自可以和多少匹配,首先选好一组匹配,那么还可以找出多少组匹配与之组成两组呢?答案为:k - 此组匹配中男生可以匹配女生数 - 此组匹配中女生可以匹配男生数+1(他们自身匹配那条线多匹配了一次)。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#includ原创 2021-01-26 01:20:02 · 958 阅读 · 2 评论 -
1399D - Binary String To Subsequences(队列)
题目思路:看数据大小1e5可以知道我们需用O(n)或O(nlogn)的算法。故开两个队列,q0,q1,一个表示存储以0结尾一个存储以1结尾,当队列空时另增加一个新的子序列,不为空时将转变一个序列从q0->q1(当遇到1且q0中还剩下xxxx0的字序列时,不剩则再增加一个子序列),细节见代码。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#incl原创 2021-01-25 16:49:58 · 138 阅读 · 0 评论 -
1293C - NEKO‘s Maze Game(分块、贡献)
题目思路:可以知道每一个点要想造成一个不能通过的结果,需要它的正对面 左对面 右对面 ,1岩浆0空地 故我们将其贡献算为,如果当前为x,y为1->0,则贡献减少lst[3-x][y]+lst[3-x][y-1]+lst[3-x][y+1],如果为0->1则减少,另y=1或n时特殊判断。Code:#include<iostream>#include<string>#include<map>#include<algorithm>原创 2021-01-24 23:10:21 · 122 阅读 · 0 评论 -
埃拉托色尼筛法(素数筛)
列举大于等于2的整数,将其倍数划掉,往后遍历发现被划掉的直接略过,还没被划掉的则是质数(表示其不是前面任何一个数的倍数,也即没有除1和本身外的因子)。时间复杂度 O(NloglogN),空间 O(N).Code: int prim[Max], vis[Max], x = 0; //prim[x]第x个质数 void eratos(int n) { for (int i = 2;i <= n;i++) { if (!vis[i])prim[++x] = i; if (vi原创 2021-01-22 13:01:19 · 319 阅读 · 0 评论 -
1263 - D. Secret Passwords (并查集)
题目思路:从答案上来看我们可以知道密码数最多只有26种即26个字母,然后根据可以等效的的密码(即直接或间接拥有相同的字母),我们让可以等效的密码放在一个集合里(对每个密码让每一个字母与第一个字母连边构成一个连通图(并查集)),然后最后的集合数即为答案。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#in原创 2021-01-16 20:36:45 · 208 阅读 · 0 评论 -
1263-C Everyone is a Winner! (整除分块)
题目老实说一开始并不知道这题是整除分块,就打表找规律做出来的。想着当一个数15 先除以15/1 = 15 15 /2=7 15/3=5 15/4=3 15/5=3 15/6=2 15/7=2 15/8=2…可以知道除到前面一定只有一个值,到了后面出现出现重复的后从3开始2 1 都会存在且重复。所以把从重复的数比其小的取完,再把前面分散的大的也取完就可以,因为有剪枝不会T掉。最开始的代码:#include<iostream>#include<string>#inc原创 2021-01-16 20:28:22 · 164 阅读 · 0 评论 -
排序算法的实现及性能测试及比较
在书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过具体数据比较各种算法的关键字比较次数和记录移动次数,以取得直观感受。要求:(1)编写程序创建一些整数文件用于排序。创建的这些文件可以根据需要生成不同的长度,如长度分别为20,200和2000,以正序、逆序、随机顺序的方式创建这些文件,通过把所有这些测试数据保存在文件中(而不是每次在测试程序时用随机数生成),可以使用同样的数据去测试不同的方法,因此会更易于比较这些方法的性能。(2)数据表采用顺序存储结构,实现插入原创 2020-12-23 01:09:09 · 4690 阅读 · 4 评论 -
1462E2 - Close Tuples (hard version)(组合数)
题目思路:先对数组排序,然后算出每个数的贡献,先从第一个数开始找到第一个大于它的值+k的数(二分),下表差即为可选的构成m个数元组的可选数的个数s,如果s<m贡献0,如果s>=m,贡献为从s-1个数中选出m-1个数的方法数(已经选了一个数)。但求组合数的模问题,不可以对两个相除的数先分别取模再除,故需要用到逆元和费马小定理先转换成乘法。不懂知道的可见...原创 2020-12-17 19:05:42 · 235 阅读 · 0 评论 -
组合数模板
证明过程可参考此篇博客https://www.cnblogs.com/liziran/p/6804803.htmlCode:ll f[Max];ll qpow(ll a, ll b) { ll ans = 1, base = a; while (b) { if (b & 1) ans = ans * base % Mod; base = base * base % Mod; b >>= 1; } return ans;}void init() { f[0]原创 2020-12-17 18:28:14 · 254 阅读 · 0 评论 -
E1. Close Tuples (easy version)
题目原谅兄弟我只A了easy…所以就写个easy的题解吧…思路:用一个map记录各个值的次数,然后如果某数字数量>=3则可以构成n*(n-1)(n-2)个相同的3个数组成的元组,如果某数字(a)数量>=2则可以构成n(n-1)/2*(a-1的数量+a-2的数量+a+1的数量+a+2的数量)个两个数字为a,其余一个为a+1或a-1或a+2或a-2的元组,如果某数字a的数量>=1则可以构成a的数量a-1的数量a+1的数量三个数字不同(a-1,a,a+1)的元组。对了,还要注意下开long原创 2020-12-16 00:51:43 · 432 阅读 · 0 评论 -
图的应用
题目:图在社交网络上的应用[问题描述]设计并实现一个社交网络模型图,并实现相关图的算法。要求:(1)每个人的信息是一个顶点,A关注了B,则构成A到B的边。请随机生成不少于50个点,和不少于500条边,边有方向,带权重(0-1之间),权重可以认为是两个人的亲密度,可随机生成。(2)根据输入的任意两个人的信息,可以查询打印他们之间的所有可能的路径。(3)实现图的深度优先遍历和广度优先遍历算法,打印图中所有点。(4)求图的所有强连通分量。(5)在最大的强连通分量上用prim和chruscal算法求原创 2020-12-11 18:00:54 · 1906 阅读 · 1 评论 -
1199D - Welfare State(思维)
题目题意:对于n个公民,我们知道其一开始的各自的金钱。现在我们有两种操作:1.直接将各个钱数小于k的公民的钱数转变为k。2.将第p个人的钱数抓变为k。问经过q次操作后,每个人最后的钱数为多少?思路:我们将一个人的金钱变化阶段定为两个,在q次操作中一个人在最后一次操作2,金钱直接变为了m0,后面还可能会有一些操作1,我们只需将m0变为max(m0,在后面的操作1中最大的k),这就是此人最后的金钱数。在此思路也就明了了,我们只需记录每一次操作的从当前操作到最后一次的操作中所有操作2中的最大的k。还有我们每个原创 2020-12-08 17:09:01 · 131 阅读 · 0 评论 -
1198A MP3(前缀和)
题目题意:给一个由n个数字组成的数组,和我们的空间大小I bytes转化为bits即为8*I,该数组有K个不同的数字,对于每个数字我们需要用log 2 K(向上取整)bits的空间存储,现在我们有一个操作,给出一个L和R,可以使数组中小于L的元素变为L,大于R的元素变为R。问:经过了操作后,我们要使得满足存储的最小改变数字个数。思路:我们可以给每个数字分配的空间为8I/n,所以我们可以保有的最大不同数字个数为K0=pow(2,I8/n(向下取整)),然后用一个map记录各个数的数量,求一个从小到大数量原创 2020-12-08 16:44:27 · 157 阅读 · 0 评论 -
1453C Triangles(贪心、模拟)
传送门题意:对于n行m列给定的数组,数组每个元素的值为0-9,我们需要构造出一个三角形,三角形顶点的坐标即为元素所在的行数和列数,三角形三个顶点的元素值应该相同,对于0-9我们需要分别求出每个数字构造出的三角形的面积最大值*2。额外条件:对于构造出的三角形我们要求其一定要有一条边平行于行或列,对于每一个点我们还可以任意指定一个元素使其值变为和自己的值相等以方便构造三角形。思路:首先对于一个给定点我们怎样使得其构造的三角形面积最大呢?我们已经确定了一个点P,然后我们还可以任选一个点使其值和这个点相等,使其原创 2020-12-05 01:38:17 · 2330 阅读 · 5 评论 -
1453B Suffix Operations(思维)
题目题意:我们对于一个n个整数的数组a,可以进行两种操作:1.对于它的任意长度后缀全体增加1.2.对于它的任意长度后缀全体减少1.并且我们还拥有一次改变数组a中一个整数变为任意整数的机会,但也可以不改变。求我们进行操作使数组每个整数相等的最小操作数。思路:当我们还没使用改变数组中的整数的机会时,我们所求的最小操作数为数组中所有相邻元素相差之和,如1 3 5 7如果我们想使最后两个元素5 7变成相同那我们只有单独改变7 变 6 变 5,成为1 3 5 5,如果我们从5(或更前面的1 3)开始增或原创 2020-12-05 00:59:45 · 213 阅读 · 0 评论 -
1283C - Friends and Gifts(思维)
传送门思路:开两个数组,分别保存没送出礼物的人和没收到礼物的人。然后遍历两个数组,发现两个数组元素有相等的地方则与下一个交换,注意边界当最后一个相同则和开始的元素交换。Code:#include<iostream>#include<string>#include<map>#include<algorithm>#include<memory.h>#include<cmath>#include<queue>#原创 2020-12-03 14:55:29 · 174 阅读 · 0 评论 -
1455D Sequence and Swaps(思维)
D. Sequence and Swapstime limit per test1.5 secondsmemory limit per test512 megabytesinputstandard inputoutputstandard outputYou are given a sequence aconsisting of n integers a1,a2,…,an, and an integer x. Your task is to make the sequence a sort原创 2020-12-01 17:05:10 · 284 阅读 · 0 评论 -
1455B Jumps(思维、规律)
B. Jumpstime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputYou are standing on the OX-axis at point 0 and you want to move to an integer point x>0.You can make several jumps. Suppose you’re c原创 2020-12-01 09:13:59 · 321 阅读 · 0 评论 -
查找算法的实现及性能测试与比较
查找算法的实现及性能测试与比较问题描述在顺序线性表中存放n个整数,n的值由用户输入确定,线性表可以是有序表或无序表。比较各查找算法在不同情况下的时间性能。各查找算法的实测时间性能包括两个指标:算法执行的绝对时间和关键字的平均比较次数。各查找算法要求评测查找成功与不成功的两种情形。为了能比较出各种查找算法执行的绝对时间,需要对表中的数据进行较大量的查找,设为m次,m的值也由用户输入确定。当输入m为1000000时,则对线性表作1000000次查找。(1)比较在有序表和无序表中进行顺序查找时,查找成原创 2020-11-23 21:47:19 · 1568 阅读 · 2 评论 -
Treasure Hunt Poj1066(线段相交)
Treasure HuntTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 9557 Accepted: 3914DescriptionArcheologists from the Antiquities and Curios Museum (ACM) have flown to Egypt to examine the great pyramid of Key-Ops. Using state-of-the-art techno原创 2020-11-17 16:45:29 · 113 阅读 · 0 评论 -
Intersecting Lines POJ - 1269
Intersecting LinesTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 22767 Accepted: 9502DescriptionWe all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1原创 2020-11-17 14:02:18 · 150 阅读 · 0 评论 -
二叉排序树的构造及其基本操作
二叉排序树的定义对于一棵空的二叉树或者具有如下性质的二叉树:1.若其左子树不为空,则左子树所有结点的值均小于根结点的值。2.若其右子树不为空,则右子树所有结点的值均大于根结点的值。3.其左右子树也是二叉排序树。如:相关图片来源《数据结构——从概念到C++实现(第三版)》二叉排序树中对值的查找给定一个值p,当前结点为bt,若bt->data==p,查找成功。若pdata,则在pt左子树查找。若p>bt->data,则在pt右子树查找。BiNode* BiSortTree原创 2020-11-11 18:21:02 · 34821 阅读 · 2 评论 -
构造二叉树及其基本操作
二叉树的基本操作如下构造一棵二叉树运用递归,从二叉树的根结点出发,先构造左子树再构造右子树,当输入"#"表示为空,跳回上一层。BiNode* BiTree::Create(){ BiNode* bt; datatype ch; cin >> ch; if (ch == '#')bt = NULL; else { bt = new BiNode; bt->data = ch; bt->lchild = Create(); bt->rchild原创 2020-11-11 17:18:08 · 2316 阅读 · 0 评论 -
dp心得
DP心得阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。状态:状态表示每个阶段开始面临的自然状况或客观条件。无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。从某一阶段以后的线路开始,当原创 2020-11-09 19:42:29 · 141 阅读 · 0 评论 -
小猫钓鱼纸牌游戏
小猫钓鱼纸牌游戏问题描述及要求A和B两个同学玩简单的纸牌游戏,每人手里有n张牌,两人轮流出牌并依次排列在桌面上,每次出掉手里的第1张牌,出牌后如果发现桌面上有跟刚才打出的牌的数字相同的牌,则把从相同的那张牌开始的全部牌按次序放在自己手里的牌的末尾。当一个人手中的牌先出完时,游戏结束,对方获胜。如n为5,A手里的牌依次为2 3 5 6 1,B手里的牌依次为1 5 4 2 9;A出2;B出1;A出3;B出5;A出5,发现前面有一张5,则把两个5都拿掉,这时他手里有6 1 5 5;桌子上的牌依次原创 2020-10-24 20:48:54 · 927 阅读 · 0 评论 -
二叉树顺序存储、链式存储及之间转化与遍历。
二叉树顺序存储转化为链式存储二叉树的存储可用顺序存储方式和链式存储方式,其中顺序存储时存储地址相邻,空间利用率高,但不易进行元素的增删等操作。而链式存储方式的元素可随意存放,但其存储空间所占为数据元素和指针所占空间,存储空间利用率低。数据图如下完整程序–转化算法如下#include<iostream>typedef char datatype;//将队列的节点类型设置为字符...原创 2020-04-28 16:31:19 · 4259 阅读 · 0 评论 -
POJ - 2187 Beauty Contest (旋转卡壳求最远点对)
DescriptionBessie, Farmer John’s prize cow, has just won first place in a bovine beauty contest, earning the title ‘Miss Cow World’. As a result, Bessie will make a tour of N (2 <= N <= 50,000) farms around the world in order to spread goodwill betw原创 2020-10-19 17:13:46 · 161 阅读 · 0 评论 -
Area POJ - 1265(pick定律)
Area POJ - 1265(pick定律)DescriptionBeing well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new research and development facility the company has installed the latest syste原创 2020-10-17 23:23:49 · 147 阅读 · 0 评论 -
poj1654 Area (求多边形面积)
poj1654 Area (求多边形面积)DescriptionYou are going to compute the area of a special kind of polygon. One vertex of the polygon is the origin of the orthogonal coordinate system. From this vertex, you may go step by step to the following vertexes of the polygo原创 2020-10-17 19:41:07 · 236 阅读 · 1 评论 -
栈的运用--中缀表达式求值(只有圆括号)
栈的运用–中缀表达式求值(只有圆括号)题目描述中缀表达式是我们熟悉的表达式形式。为了能正确表示运算的先后顺序,中缀表达式中难免要出现括号。假设我们的表达式中只允许有圆括号。读入一个浮点数为操作数的中缀表达式后,对该表达式进行运算。要求中缀表达式以一个字符串的形式读入,可含有加、减、乘、除运算符和左、右括号,并假设该表达式以“#”作为输入结束符。如输入“3.5*(20+4)-1#”,则程序运行结果应为83。要求可单步显示输入序列和栈的变化过程。并考虑算法的健壮性,当表达式错误时,要给出错误原因的提原创 2020-10-12 21:45:28 · 531 阅读 · 0 评论 -
回溯算法——八皇后问题
八皇后问题(链接)努比亚和苏丹没有子女,所以他要从一些有集成资格的继承者中挑选一个出来继承王位。他希望这个继承者足够聪明,所以他准备了一个西洋棋盘,上面的每个格子中均有一个 1−991-991−99 的数字。他又准备了 888 个皇后棋子。888 皇后的规则就是不能有任何棋子同行或者同列或者同斜线,在满足这个规则的同时,王位继承者还需要让 888 个皇后所在的位置的数字的和是最大的。输入格式输入一个数字 k(k≤20)k(k\leq 20)k(k≤20),代表棋盘的数量。接下来有 kkk 个棋盘,原创 2020-07-14 00:59:39 · 417 阅读 · 0 评论