Algorithm、数据结构
文章平均质量分 64
数据结构和算法
不爱吃鱼的猫丶
心比天高、脚踏实地
展开
-
计算两个等长升序序列的中位数的高效算法(408真题及解析)
【2011 统考真题】一个长度为L(L≥1)的升序序列 S,处在第【L/2】个位置的数称为 S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是 15,两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若 S2=(2,4,6,8,20),则S1和S2的中位数是 11。现在有两个等长升序序列 A和 B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列 A 和 B的中位数。要求∶1)给出算法的基本设计思想。2)根据设计思想,采用 C或 C+或 Java语言描原创 2021-07-11 19:48:47 · 1180 阅读 · 0 评论 -
给定字符串s,判断s[i..j]是否为回文(动态规划)
刷leetcode的时候看到的,判断 s 的子串 s[i…j] 是否为回文整理一篇博客吧(●ˇ∀ˇ●)当我们在判断 s[i…j] 是否为回文串时,常规的方法是使用双指针分别指向 i 和 j,每次判断两个指针指向的字符是否相同,直到两个指针相遇。然而这种方法会产生重复计算,例如下面这个例子:当 s=aaba 时,对于前 2 个字符 aa,我们有 2 种分割方法 [aa] 和 [a,a],当我们每一次搜索到字符串的第 i=2 个字符 b 时,都需要对于每个 s[i…j] 使用双指针判断其是否为回文串,转载 2021-03-07 21:08:43 · 660 阅读 · 0 评论 -
51nod 3086 - 线段覆盖加强版(贪心)
传送门:https://www.51nod.com/Challenge/Problem.html#problemId=3086题意:在一个数轴上有n条线段,线段的端点均为数轴上的整数点。现在请你删除尽量少的线段,使得剩下的线段不相交。输出剩下的线段数输入规模较大,建议使用读入优化思路:贪心先按照左端点、右端点得大小排序然后从前向后贪心的取线段,维护当前右端点now每次取线段得时候有考虑两种情况如果当前线段的左端点比now大,直接取即可(比now小就不能取,保证不交叉)如果当前线段的原创 2021-03-01 21:40:38 · 285 阅读 · 0 评论 -
Codeforces 103B - Cthulhu(并查集 找环和块)
传送门:https://codeforces.com/problemset/problem/103/B题意:给一个n个结点,m条边的无向图判断给定图是否满足以下条件:能被表示为有3个及以上的有根树的集合这些有根树的根连在一起形成一个环给定图中不存在多重边和自环满足条件输出"FHTAGN!",否则输出"NO"思路:题意就是要判断给定的无向图中是否只存在一个环,并且这个图是连通的并查集找环和连通块AC代码:#include<bits/stdc++.h>using nam原创 2021-02-26 22:03:08 · 265 阅读 · 0 评论 -
Codeforces Beta Round #83 (Div. 1 Only) - A. Dorm Water Supply(DFS)
传送门:https://codeforces.com/contest/107/problem/A题意:给n个点(房子)和p条管道(单向边)每条管道ai,bi,dia_i,b_i,d_iai,bi,di表示水流能通过该管道从aia_iai流向bib_ibi,该管道直径为did_idi对每个点,最多有一个出水口和一个进水口在每个有出水口而没有进水口的点安装水箱,也就是水流的起点在每个有进水口而没有出水口的点安装水龙头,也就是水流的终点求每个水箱输出到水龙头的水流的最大值,也就是求路原创 2021-02-24 23:30:53 · 227 阅读 · 0 评论 -
Codeforces Round #702 (Div. 3) - F. Equalize the Array(思维+前缀和)
传送门:https://codeforces.com/contest/1490/problem/F题意:给一个长度为n的数组a要使a中所有元素的出现次数一样求最少要移除元素的个数思路:英文题面的题意总是理解错误,哭了/(ㄒoㄒ)/~~要求删除多少个元素,我们可以知道,删除元素肯定是和元素出现次数相关的先把数组a转化成元素出现次数的数组b并从小到大排序,如:61 3 2 1 4 2应该转化成:4 //cnt1 1 2 2 //3和4出现一次,1和2各出现两次那我们只需要遍历原创 2021-02-21 16:57:19 · 359 阅读 · 1 评论 -
Codeforces Round #702 (Div. 3) - D. Permutation Transformation(递归)
传送门:https://codeforces.com/contest/1490/problem/D题意:给一个长度为n的排列a,将排列a化成一颗二叉树,转化规则如下在a中找到最大的数作为它的根节点最大值左侧的子排列组构成左子树,子树构成规则相同最大值右侧的子排列组构成右子树,子树构成规则相同要求每个数在二叉树中对应节点的深度思路:好家伙,一道简单递归题,题意恁给看了半天没看懂,英语阅读能力有待提高。。。递归dfs(l,r,dep)dfs(l,r, dep)dfs(l,r,dep)在区原创 2021-02-19 21:32:04 · 255 阅读 · 0 评论 -
CodeForces 1475D - Cleaning the Phone(枚举+二分)
传送门:https://codeforces.com/problemset/problem/1475/D题面:题意:手机中有n个app,现在需要腾出m的内存空间每个app占用内存aia_iai,重要程度bib_ibi(也就可以理解为代价吧)要求腾出m的内存空间所需要的最小代价思路:弄懂题意后好像就是一道01背包问题,写到一半发现m∈[1,109]m∈[1,10^9]m∈[1,109],只能另辟蹊径了。。因为bib_ibi就只有两种情况{1,2},我们考虑把app的内存分到代价为原创 2021-02-05 00:00:41 · 612 阅读 · 0 评论 -
CodeForces - Ehab the Xorcist(思维/构造)
传送门:https://codeforces.com/problemset/problem/1325/D题面:题意:给出u,v,求一个长度最短的数组使得:a1⊕a2⊕......⊕an=ua_1⊕a_2⊕......⊕a_n=ua1⊕a2⊕......⊕an=u--------------------①a1+a2+......+an=va_1+a_2+......+a_n=va1+a2+......+an=v--------------------②思路:这道题需要对位运算非常了原创 2021-01-31 21:56:36 · 290 阅读 · 0 评论 -
51nod - Or 和 Sum(位运算)
传送门:https://www.51nod.com/Challenge/Problem.html#problemId=2527题面:题意:给定两个非负整数 pairOr,pairSum,问是否存在A,B,使得A|B=pairOr,A+B=pairSum。思路:这道题需要有一个前置知识,不然很难做:(A+B)−(A∣B)=(A&B)(A+B)-(A|B)=(A\&B)(A+B)−(A∣B)=(A&B)我们设(A+B)=X,(A∣B)=Y,(A&B)=Z,(A+原创 2021-01-29 16:49:59 · 336 阅读 · 0 评论 -
VJudge - Product and GCD(数论)
在这里插入图片描述原创 2021-01-29 15:48:02 · 340 阅读 · 0 评论 -
CodeForces - Antenna Coverage(区间DP)
题意:给一段长度为m的线段,线段上有n个路灯,每个路灯在位置xix_ixi且能照亮范围[xi−si,xi+si][x_i-s_i,x_i+s_i][xi−si,xi+si]我们可以花费一个硬币使得某个路灯的sis_isi的增大1,可以操作任意多次求能使区间[1,m]被路灯照亮的最小硬币花费思路:dp[i]表示线段[1,i][1,i][1,i]被覆盖所需的最小代价第一层循环dp从1到m,第二层循环遍历n个路灯,维护dp时间复杂度O(n*m)状态转移分析:x[j]<=.原创 2021-01-28 16:26:34 · 456 阅读 · 2 评论 -
CodeForces - Yet Another Segments Subset(区间DP)
题意:给定n个线段[li,ri][l_i,r_i][li,ri]要求选出的线段满足任意两个线段要么不相交,要么全包含。问最多能选出多少条线段。思路:由部分解推出问题的解,考虑区间DP如果对于每个线段都考虑:dp[i][j] = max{dp[i][k]+dp[k+1][j]},显然复杂度为:O(n3)O(n^3)O(n3),TLE是必然的线段端点值域很大,需要先离散化一下端点。状态表示:dp[i][j] 表示区间 [i,j] 的满足条件的最大线段数,即区间 [i,j] 的最优解状态.原创 2021-01-26 16:00:46 · 231 阅读 · 0 评论 -
CodeForces Number of Subsequences(计数DP)
题意:给出一段由 ‘a’,‘b’,‘c’,’?’ 组成的序列,每个’?‘都可以变成’a’,‘b’,'c’其中一个,假设有k个问号,那么最终可能序列就有3k3^k3k种,问所有可能的序列中,一共出现了多少次abc,结果对1e9+7取模。思路:状态表示:dp[i][0]:到i之前所有可能的序列种’a’一共出现的次数dp[i][1]:到i之前所有可能的序列种’ab’一共出现的次数dp[i][2]:到i之前所有可能的序列种’abc’一共出现的次数如果不考虑问号,就是一个经典的计数dp。考虑问号之后.原创 2021-01-25 11:10:45 · 237 阅读 · 0 评论 -
CodeForces Two Merged Sequences(贪心)
题意:将一个序列分成两个序列,一个序列严格递增,一个序列严格递减,并且两个序列中元素的相对顺序保持和原序列不变。思路:我们考虑每个元素都要进入其中一个序列那么我们需要维护一个上升序列和一个下降序列,对于当前元素a[i],有以下三种情况:只能放入递增序列或递减序列不能放入任何一个序列,输出"NO"两个序列都可以放入对于第三种情况,我们判断当前元素a[i]和它后一个元素a[i+1]的大小关系如果a[i]>a[i+1],那么将a[i]放入递减序列如果a[i]<a[i+1],.原创 2021-01-23 13:59:01 · 442 阅读 · 1 评论 -
CodeForces Lomsat gelral(DSU on tree 树上启发式合并)
传送门:https://codeforces.com/problemset/problem/600/E题意:给一颗n个点的有根树,每个点有一种颜色,一颗子树中出现次数最多的颜色称为主导颜色,主导颜色可能有多个,求这棵树的每个结点的对应子树的主导颜色之和思路:DSU on tree 树上启发式合并,先记录一下板子······························································································原创 2020-12-29 11:12:01 · 148 阅读 · 0 评论 -
Virtual Judge 没有上司的舞会(树型DP)
传送门:https://vjudge.net/problem/51Nod-2605题面:题意:给一颗N个节点的树,每个结点iii都有一个价值r[i]r[i]r[i]对于每个结点,如果取这个节点,那么这个节点的子节点就不能取求能从这棵树获得的最大价值思路:树型DP,dfs就行对于每个职员(结点),只有两种情况,取或不去,所以开一个二维dp;dp[x][0]表示x结点为根的子树中x结点不去舞会能获得的最大价值dp[x][1]表示x结点为根的子树中x结点去舞会能获得的最大价值显然,我们需要原创 2020-12-19 16:40:25 · 155 阅读 · 1 评论 -
VJudge - Left or Right? How about neither?(Dijkstra)
传送门:https://vjudge.net/problem/Gym-102279L题意:思路:AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+10;struct Edge{ ll to,w,next;}e[5*maxn];struct Node{ ll u,d; bool operator < (const Node& b)原创 2020-12-15 10:53:01 · 112 阅读 · 0 评论 -
NOWCODER xinjun与阴阳师(01背包变形)
链接:https://ac.nowcoder.com/acm/problem/14602来源:牛客网题意:思路:AC代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e3+10; int t,n,m,a[maxn],v[maxn][maxn],w[maxn][maxn],dp[maxn]; int main() { cin>>t; while(t--) { cin>>n&原创 2020-11-24 10:27:13 · 120 阅读 · 0 评论 -
NOWCODER 吃火锅(单源最短路dijkstra()算法)
链接:https://ac.nowcoder.com/acm/problem/213225来源:牛客网题意:有n个城市,m条双向道路。第i条路线可用于从城市v[i]到城市u[i](以及从u[i]到v[i]),需要花费wi。每个城市都开了一个相同的火锅店,但是由于位置不同,每家火锅店的价格不同,为了简化问题。假设到第i个店吃的花费是val[i]。这个n个城市的人发现了这个漏洞,请你计算每个城市的人最少的吃火锅花费(花费包括来回的路费和吃火锅的费用,留在自己的城市不用路费)。思路:AC代码:原创 2020-11-22 14:58:38 · 691 阅读 · 0 评论 -
NOWCODER 灾难预警(二分+dfs)
链接:https://ac.nowcoder.com/acm/problem/213267来源:牛客网题意:对一个 N * N 的矩阵,每个位置有一个海拔数据 h[i][j],当水位高度大于 h[i][j] 的时候, 这个位置就会形成一个水坑,不能通过。q次询问,每次一个水位x,问能不能从(1,1)走到(n,n)思路:暴搜会T,直接排除,只能二分了,时间复杂度O(log10n)O(log_{10}n)O(log10n)二分查找能从(1,1)走到(n,n)的水位的最大值ans,对于每个原创 2020-11-21 13:10:33 · 165 阅读 · 0 评论 -
NOWCODER 莫的难题(进制转换)
链接:https://ac.nowcoder.com/acm/problem/205078来源:牛客网题意:求由{5、2、1、3、9}能够组成的所有数(可重复取)中,第 C(n, m)%1e9+7 (n>=m) 个数是多大?思路:打表可以找出规律,{1,2,3,5,9}组成的树中有515^151个一位数,525^252个两位数,535^353个三位数……1 2 3 5 911 12 13 15 1921 22 23 25 2931 32 33 35 3951 52 53 55 5原创 2020-11-17 21:51:35 · 137 阅读 · 0 评论 -
NOWCODER 智斗恶龙(bfs)
链接:https://ac.nowcoder.com/acm/problem/210758来源:牛客网题意:从(sx,sy)的位置能到达所有距离小于等于d的格子某些格子上有宝藏,每个宝藏有其特殊的能力值.需要求x种不同能力值的宝藏的最大与最小的能力值差值的最小值.-1表是陷阱,不能到达这个格子思路:BFS出从(sx,sy)到小于等于距离d每一个点的距离deep[x][y],并把这个点入队;对于每一个出队点,判断这个位置上的能力值是否大于零(是否有宝藏),大于零就放入数组v将收到的宝原创 2020-11-17 12:00:15 · 111 阅读 · 0 评论 -
NOWCODER 序列(逆元求组合数+快速幂)
链接:https://ac.nowcoder.com/acm/problem/16732来源:牛客网题意: 长度为n的序列a,已知a[1]=a[n]=1,且对于2 <= x <= n,a[x] / a[x-1]是以下三个数字之一 [ 1,-2,0.5 ],问有多少种不同的序列满足题意。思路: 为了保证最后变回1,-2和0.5必须都出现2k次(0<=k<=(n-1)/2),因为-2如过出现奇数次最后的结果为负,不能变回1。AC代码:#include<bits/原创 2020-11-11 22:17:39 · 249 阅读 · 0 评论 -
NOWCODER 字符串的问题(KMP/string.find())
题意:思路:解法一:KMP,求next数组,假设next[n]=k,n为S长度,如果k>0,则说明s[0…k-1]=s[n-k…n-1] 即前缀和后缀匹配,否则不存在答案。如果next[1…n-1]中有值为k的,则答案为S.substr(0,next[n])S.substr(0,next[n])S.substr(0,next[n])。否则看next[next[n]],即看前缀后缀之中有无循环节,有的话,子串长就为next[next[n]]。比如 abcabcdeabcabc,nex..原创 2020-11-10 10:58:24 · 220 阅读 · 0 评论 -
NOWCODER 郊区春游(Floyd算法+状压DP)
链接:https://ac.nowcoder.com/acm/problem/16122来源:牛客网题意: 给n个点和m条路径和R个必经点,求经过这R个必经点得最短路径长度思路: 状压DP,套个模板先,下次再补(下次也不一定)AC代码:#include <bits/stdc++.h>using namespace std;typedef long long int ll;const ll inf=0x3f3f3f3f;ll n,m,R,dis[209][209],r[原创 2020-11-08 23:35:27 · 245 阅读 · 0 评论 -
NOWCODER 最大乘积(枚举和暴力+__int128的快速幂)
题意: 给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少,结果对2000000000000000003(共有17 个零) 取模思路: 一看到对2e18+3取模就想到了快速幂,但实际上稍微乘一下即使用 ull (264=184467440737095516152^{64}=18446744073709551615264=18446744073709551615)也会爆,没办法,只能拿出__int128来算了。。。。。。但实际上循环乘3取模就行。。。。毕竟最大只有320...原创 2020-10-30 16:15:24 · 163 阅读 · 0 评论 -
NOWCODER psd面试(dp+最长回文子序列)
链接:https://ac.nowcoder.com/acm/problem/15317来源:牛客网题意: 给一个字符串,求删除它的最长回文子序列后的长度,注意是子序列不是子串,本蒟蒻在这里被坑了/(ㄒoㄒ)/~~思路: 最长回文子序列模板题,推荐一篇文章 动态规划|最长回文子序列AC代码:#include<bits/stdc++.h>using namespace std;string str;int longestPalindromeSubSequence(s原创 2020-10-27 14:39:35 · 231 阅读 · 0 评论 -
NOWCODER 小木乃伊到我家(最短路spfa)
链接:https://ac.nowcoder.com/acm/problem/15549来源:牛客网题意:从城市1到城市n找最短路,有就输出路径长,没有就输出"qwb baka"思路:最短路裸题啦,用邻接表建图,然后spfa()一下就好AC代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll maxn=2e5+10,inf=LONG_LONG_MAX;struct node原创 2020-10-24 12:01:41 · 131 阅读 · 0 评论 -
NOWCODER 神秘钥匙(快速幂+二项式定理)
链接:https://ac.nowcoder.com/acm/problem/20701来源:牛客网题意:n人中选m人并在m人中选一人为队长,问有多少种选择方案思路:可以很容易的推出答案是1∗Cn1+2∗Cn2+3∗Cn3+......+n∗Cnn1*C_{n}^{1}+2*C_{n}^{2}+3*C_{n}^{3}+......+n*C_{n}^{n}1∗Cn1+2∗Cn2+3∗Cn3+......+n∗Cnn=n(Cn−10+Cn−11+Cn−12+......+Cn−11)=原创 2020-10-23 21:22:52 · 170 阅读 · 0 评论 -
c++ string类型和int类型的相互转换
一.string类型转换成int类型方法一:使用atoi()函数#include<bits/stdc++.h>using namespace std;int main(){ string str="123"; cout<<str<<" str的类型为"<<typeid(str).name()<<endl;//输出Ss表示string类型 //atoi的参数类型为(const char *nptr)而string是一个类,所以需要原创 2020-10-23 15:16:04 · 16781 阅读 · 0 评论 -
NOWCODER iko和她的糖(dfs)
题意: 有n个点,每个点都有a[i]a[i]a[i]个糖果,从第iii个点到第i+1i+1i+1个点会消耗b[i]b[i]b[i]个糖果,限定在nnn个点中只能选择三个点补给糖果,求点111到点nnn最多能剩多少个糖果思路: dfs,维护到达n点的时候的s的最大值AC代码:#include<bits/stdc++.h>using namespace std;const int maxn= 1e3+10;int n,a[maxn],b[maxn],ans;void ..原创 2020-09-29 10:53:13 · 151 阅读 · 0 评论 -
NOWCODER 经商(并查集+DP)
链接:https://ac.nowcoder.com/acm/problem/14348来源:牛客网题意: 小d能与自己的朋友交际,也能与朋友的朋友交际,与每一个人交际都会花费一定的精力,并获得一定的利益,在小d的精力范围内,求最大能获得多少利益。思路:朋友的朋友可以用并查集来筛选然后维护dp[j]=max(dp[j],dp[j−a[i]]+b[i])dp[j] = max(dp[j],dp[j-a[i]]+b[i])dp[j]=max(dp[j],dp[j−a[i]]+b[i])dp[原创 2020-09-24 23:34:19 · 169 阅读 · 0 评论 -
NOWCODER Cut(贪心)
链接:https://ac.nowcoder.com/acm/problem/14291来源:牛客网题意:把长度为n的序列分割成长度为1的子序列,分割的代价是分割前原序列的总和,求分割完成后最大总代价思路:每次分割后保证剩下的序列和最大,也就是下一次分割花费最大,排序后每次分割出最小的那个元素就行AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+1原创 2020-09-21 20:39:27 · 104 阅读 · 0 评论 -
Codeforces --Hamming Distance Sum(前缀和)
题意:定义Hamming距离为两字符串间对应的字符差值绝对值的和, 求a与b的所有等长度子串的hamming距离之和。思路:分析样例可以推出:字符串a和字符串b的hamming距离就是:∑i=1∣a∣dis(a[i],[b[i],b[∣b∣−∣a∣+i]])\sum_{i=1}^{|a|} dis(a[i],[b[i],b[|b|-|a|+i]])i=1∑∣a∣dis(a[i],[b[i],b[∣b∣−∣a∣+i]])a字符串中的第一个元素,分别与b字符串中的第一个元素至第|b|-|a|..原创 2020-09-15 11:43:25 · 306 阅读 · 0 评论 -
Codeforces --Social Distance(模拟)
思路:AC代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+10;ll n,k,t,cnt1,b[maxn],ans;char a[maxn];int main(){ cin>>t; while(t--){ cin>>n>>k; for(int i=1;i<=n;i++) cin>>a[i]..原创 2020-09-14 19:01:30 · 254 阅读 · 0 评论 -
Codeforces --Decrease the Sum of Digits(规律+思维)
思路:一位大佬的思路:https://blog.csdn.net/hzf0701/article/details/108414450这里记录一下自己的理解:找进位点,即记录s的前缀和小于n的最大位置pos(注意9的进位),如果pos==−1pos==-1pos==−1,也就是s[0]就不满足小于n这个条件的话,输出10sizeof(s)+110^{sizeof(s)+1}10sizeof(s)+1如果pos!=−1pos!=-1pos!=−1,那么就把pos位置的值+1,并把pos位置后的数变0.原创 2020-09-14 11:37:37 · 195 阅读 · 0 评论 -
Codeforces --Beautiful Graph(二分图+并查集+dfs优化+快速幂)
思路:给每个点赋值(1,2,3)种的任意一个数,并保证相邻两个节点之和为奇数由此可以推出:对每一个连通块中的任意一个奇数结点,都有两种赋值可能(1或3),统计每个连通块中的奇数(cnt1)和偶数(cnt2)顶点的个数,只考虑奇数结点的时候有2cnt12^{cnt1}2cnt1种,奇数偶数结点互换后有2cnt22^{cnt2}2cnt2,那么总的方案数就有2cnt1+2cnt22^{cnt1}+2^{cnt2}2cnt1+2cnt2种。注意:图不连通的时候,总方案数应为所有连通块的方案数累乘当某..原创 2020-09-09 21:34:43 · 248 阅读 · 0 评论 -
Codeforces --Modular Stability(逆元+组合数+快速幂)
题目:思路: 依题意如果将mod的顺序任意变化,答案不变,那么所有数必须要是最小的数的倍数。假设模数没有倍数关系,那么连续取模就会破坏数据。问题取决于最小元素a[1]a[1]a[1],之后就是在a[1]a[1]a[1]的倍数中取k−1k-1k−1个,根据逆元组合数预处理出阶乘的逆元.对阶乘的逆元有:inv[n!]=inv[(n+1)!]∗(n+1)%modinv[n!]=inv[(n+1)!]∗(n+1)\%modinv[n!]=inv[(n+1)!]∗(n+1)%modinv[n!]=1n!原创 2020-09-08 17:14:29 · 193 阅读 · 0 评论 -
NOWCODER 2018(思维题)
题意:给出a,b,c,da,b,c,da,b,c,d,问有多少对(x,y)(x∈[a,b],y∈[c,d])(x,y)(x∈[a,b],y∈[c,d])(x,y)(x∈[a,b],y∈[c,d])使得x∗yx*yx∗y是2018的倍数思路:1.2018的倍数可以是2018∗n2018*n2018∗n(n为正整数)num1为区间[a,b][a,b][a,b]里201820182018的倍数的个数,num1中的任意一个数和区间[c,d]里的数相乘都是2018的倍数,num2同理∴ans+=num..原创 2020-08-18 16:35:40 · 123 阅读 · 0 评论