07 2020 档案
摘要:在字符串的头部插入'$',在每个字符之间插入'#'. 用p数组记录以某点为中心的最长回文半径,会发现,最长回文子串长度$maxlenth=p[i]-1$. 那么如何去求p数组呢?我们遍历每个字符,记录回文串能延伸到的最右端的位置$mx$,之后我们再去判断. (1) mx>i: 1:i的右边界小于mx
阅读全文
摘要:每次都去找想要的点,如果当前已经被占用了,那么标记一下,然后去找这个点的主人是否还有其他能连的点,若有,连这个点,然后当前的这个点就能连自己想要的点了 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cma
阅读全文
摘要:题意:有$n$个点,$m$条边的无向图,可以给每个点赋点权${1,2,3}$,使得每个点连的奇偶不同,问有多少种方案,答案对$998244353$取模. 题解:要使得每个点所连的奇偶不同,很明显是二分图染色,那么对于某一个联通块,我们可以对左边的点赋$2$,右边的点赋${1,3}$,那么左边的点没有
阅读全文
摘要:题意:有一个$n$个点的有向图,从$1$出发,问是否有负环. 题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这个环,那么这个环中的边数也就会不断增加,因为我们只有$n$个点,所以假如某条路径的边数$\ge n$时,就说
阅读全文
摘要:题意:有$n$个点,$m$条双向边,两个方向的权值都是相等的,可以从$A$中的某个点出发走到$B$中的某个点,求所有路径中的最短距离,如果A和B中没有点联通,则输出$-1$. 题解:感觉是个阅读理解啊,题目看懂了就是个裸的单源最短路,我们首先将牛牛的所有星球初始化作为起点,然后建边跑个dijkstr
阅读全文
摘要:题意;将一组数重新排序,使得相邻两个数之间的最大差值最小. 题解:贪心,现将所有数sort一下,然后正向遍历,将数分配到新数组的两端,然后再遍历一次维护一个最大值即可. 代码: class Solution { public: /** * 返回按照这些花排成一个圆的序列中最小的“丑陋度” * @p
阅读全文
摘要:题意:有一组数,每次将所有相等的偶数/2,求最少操作多少次使得所有数变成奇数. 题解:用桶标记,将所有不同的偶数取出来,然后写个while模拟统计一下次数就行. 代码: class Solution { public: /** * 返回一个数,代表让这些数都变成奇数的最少的操作次数 * @param
阅读全文
摘要:感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int dis[N]; bool st[N]; int prim(){ me(dis,INF,sizeof(
阅读全文
摘要:题意:在二维坐标轴上给你一堆点,在x轴上找一个点,使得该点到其他点的最大距离最小. 题解:随便找几个点画个图,不难发现,答案具有凹凸性,有极小值,所以我们直接三分来找即可. 代码: int n; long double x[N],y[N]; long double check(long double
阅读全文
摘要:题意:有两个数组$a$和$b$,每次比较它们最左端的元素,取小的加入新的数组$c$,若$a$或$b$其中一个为空,则将另一个全部加入$c$,现在给你一个长度为$2n$的数组$c$,问是否能有两个长度为$n$的数组$a$和$b$构成. 题解:我们从左向右看$c$,记一个最大值$mx$,观察样例不难发现
阅读全文
摘要:题意:给你两个长度为$n$的01串$s$和$t$,可以选择$s$的前几位,取反然后反转,保证$s$总能通过不超过$2n$的操作得到$t$,输出变换总数,和每次变换的位置. 题解:我们现将$s$串全部变成$1$或$0$,确保$s[n]=t[n]$,然后我们倒着遍历$t$,若遇到相邻的两个字符不同,我们
阅读全文
摘要:题意:给你两个长度为$n$的01串$s$和$t$,可以选择$s$的前几位,取反然后反转,保证$s$总能通过不超过$3n$的操作得到$t$,输出变换总数,和每次变换的位置. 题解:构造题一定要充分利用题目所给的条件,对于$s$中的某一位i,假如它和$t$中的对应位置不同,我们先对前i个字符取反反转,然
阅读全文
摘要:题意:有一个字符串$s$,我们可以选择$s_$,如果$s_{i+k}>s_$,那么就可以交换$s_$和$s_{i+k}$,问最多能够交换多少次. 题解:因为限定了$k$,所以我们交换的位置是固定的,即所有能交换的位置的$i$%$k$都相等,那么对于某个位置$i$,在它之前的$i$%$k$相等的位置的
阅读全文
摘要:题意:有$m$个窗口,$n$个人排队,每个人都有各自的办理时间,只有办理完成窗口才能空出来,后面的人开始办理,求有多少人比后面的人开始办理的早但完成的晚. 题解:我们可以用优先队列来模拟办理,用一个数组q来记录办理完成的时间,之后只要求q中逆序对的个数即可,既然求逆序对,那我们肯定用归并排序啦~ 代
阅读全文
摘要:题意:有一个数$x$,判断其是否能有某个完全平方数$mod$1000得到. 题解:直接写个for判断一下就好了,因为对1000取模,所以枚举到1000即可. 代码: class Solution { public: /** * * @param x int整型 * @return bool布尔型 *
阅读全文
摘要:题意:给你一个加密的字符串,以及偏移量,求对应的明文. 题解:根据样例,不难看出模板串是:$0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz$,然后我们去遍历密文的每一位,减去偏移量再取个模就行. 代码: class Sol
阅读全文
摘要:题意:有$n$个点,$n-1$条边,每条边正向和反向有两个权值,且每条边最多只能走两次,有$m$次询问,问你从$u$走到$v$的最大权值是多少. 题解:可以先在纸上画一画,不难发现,除了从$u$走到$v$的路径上的反向权值我们取不到,其他所有边的正反权值均能取到,所以答案就是:\(sum-u->v路
阅读全文
摘要:最近公共祖先,顾名思义,就是在一颗树中,去找两个子节点的最近的公共祖先.这处理起来并不复杂,我们可以直接一个一个的暴力去 找,但基本上会TLE.所以我们可以用倍增法来处理LCA的问题. 倍增法:每次按$2$的倍数增大,即:$1,2,4,8,16,32.....$,有点类似二进制的枚举,而在当前处理的
阅读全文
摘要:题意:有一个长度为$n=2^k$的字符串,对于某个字符$c$,我们定义他是一个$c-good$,如果: 1.\(len=1\),并且$s[1]=c$. 2.\(len>1\),\(s[1]=s[2]=...=s[\frac{len}{2}]=c\),并且另外一半是一个$(c+1)-good$
阅读全文
摘要:题意:给你一个数组$a$,可以删除其前缀,要求操作后得到的数组是"good"的.对于"good":可以从数组的头和尾选择元素移动到新数组,使得所有元素移动后得到的新数组是非递减的.问最少删除前多少个元素满足条件. 题解:因为只删除前缀,所以我们可以倒着来看,感觉自己搞复杂了. 假如数组从最后一位
阅读全文
摘要:题意:有两个完全相同的排列,将其中一个的元素按相对顺序插入另外一个排列中,给你操作完的排列,求原排列. 题解:感觉看看样例就能直接写了啊,直接遍历,用桶存数字个数,如果桶为空,直接输出即可. 代码: int t; int n; vector<int> v; map<int,int> mp; int
阅读全文
摘要:题意:给你三个正整数$x$,\(y\),\(z\),问能够找到三个正整数$a$,\(b\),\(c\),使得$x=max(a,b)$,\(y=max(a,c)\),\(z=max(b,c)\). 题解:容易看出,$a,b,c$中最大的数一定会在$x,y,z$中出现两次,所以我们只要判断$x,y,z$
阅读全文
摘要:题意:有一$n$个点,$m$条边的双向图,每条边都有花费和流量,求从$1$~$n$的路径中,求$max\frac{min(f)}{\sum c}$. 题解:对于c,一定是单源最短路,我们可以用dijkstra,但是这个最小流量不是很好搞,但是题目所给的数据范围较小,所以我们可以直接枚举最小流量,然后
阅读全文
摘要:题意:有$n$件衣服,每件衣服都有$a_$滴水,所有衣服每分钟都能自然烘干$1$滴水,或者用烘干机,每分钟可以烘干$k$滴水,问最快多少分钟可以使所有衣服都烘干. 题解:这题和之前的那个拔苗助长感觉一样啊....都是二分答案. 先把$a$排个序,然后左区间$l=1$,右区间$r=a[n-1]$,
阅读全文
摘要:题意:求所有$n$位数每位之和等于$m$的数的和. 题解:数据范围非常小,我们可以直接暴力枚举$t$到$10*t$的所有数字,逐位分解判断即可. 代码: class Solution { public: /** * 返回这样的数之和 * @param n int整型 数的长度 * @param m
阅读全文
摘要:题意:有一个数组,每次可以修改子数组,但是修改后每个元素的位置都必须变化,求最少修改多少次使得这个数组有序. 题解:假如这个数组本来就有序,我们直接输出0.否则,对于数组两端,假如它们有序,那么我们可以不用做任何操作,直接看中间部分,所以我们分别扫一遍两端,分别找到两端第一个不满足条件的位置,然后我
阅读全文
摘要:题意:给你一个正整数$n$,求两个正整数$a$和$b$,使得$a+b=n$,并且$LCM(a,b)$要尽可能的小. 题解:首先对于偶数,构造$\frac{2}\(和\)\frac{2}$一定是最优解,对于奇数,我们去找除它本身的最大因子$a$,为什么呢? 我们假设$a$是$n$的一个真因子,那么
阅读全文
摘要:题意:构造一个长度为$n$的序列,要求所有元素总和不大于$1000$,并且任意两项的和不等于另外一项. 题解:全构造$1$就好了. 代码: int t; int n; int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>t; while
阅读全文
摘要:题意:有$n$个队员,每个队友都有一个能力值,构造队伍,要求队伍人数*队伍中最低能力值不小于$x$,求能构造的最大队伍数. 题解:大水题,排个序,倒着模拟就行了. 代码: int t; int n,x; ll a[N]; int ans; int main() { ios::sync_with_st
阅读全文
摘要:题意:石头剪刀布,bot有一串字符,表示他要出什么,你需要事先确定你的出招方案,然后遍历bot的字符串,从$i$位置开始跑一个循环,每次跑都要记录你赢的次数贡献给$sum$,现要求$\frac$最大,求你的最佳处找方案. 题解:贪心,全输出bot出招次数最多的对应即可. 代码: int t; str
阅读全文
摘要:题意:有一长度为$n$的序列,问是否能找到$a_<a_,a_>a_,(i<j<k)$,如果满足,输出其位置. 题解:直接暴力两头找即可,最坏复杂度:\(O(n^2)\). 代码: int t; int n; int a[N]; int main() { ios::sync_with_stdio(fa
阅读全文
摘要:题意:有一个$n$x$m$的矩阵,\(A_{i,j}=lcm(i,j)\),对于每个$k$x$k$的子矩阵,其最大元素贡献给答案,求答案的最大值. 题解:矩阵构成我们直接$i*j/gcd(i,j)$即可,然后就要去找每个子矩阵中的最大元素. 这题我们可以用单调队列来求,首先先对每一列维护长度为$
阅读全文
摘要:题意:给你一个长度为$n$的$01$串,从高位到低位遍历,对该位取反,用得到的十进制数$mod$所有位上$1$的个数,不断循环直到为$0$,输出每次遍历时循环的次数. 题解:根据题意,我们可以直接模拟来写,但是所给数据范围会TLE,我们先记所有$1$的个数为$sum$,当取模时,我们要么取$sum+
阅读全文
摘要:题意:有两个$01$字符串$a$和$b$,每次让$a$和$b$进行与运算,将值贡献给答案,然后将$b$右移一位,直到$b=0$. 题解:因为$a$不变,而$b$每次右移一位,所以我们看$b$中$1$的位置在$a$中所对应的位置,从该位置到最低位,所有为$1$的位置都要算一次十进制的数贡献给答案,那么
阅读全文
摘要:题意:有一个一维的书架,$L$表示在最左端放一本书,$R$表示在最右端放一本书,$?$表示从左数或从右数,最少数多少次才能得到要找的书. 题解:我们开一个稍微大一点的数组,从它的中间开始模拟,$L$就--$l$放进去,$R$就++$r$放进去,然后每次更新某一本书的最新位置,因为后放的肯定离最左侧或
阅读全文
摘要:题意:有$n$个桩子,$1$表示该位置有一个火炉,可以使两边距离为$r$的范围照亮,问最少使用多少炉子使得所有范围都被照亮. 题解:贪心,首先我们从$r$位置开始向左找,如果找到了就记录这个位置,然后答案+1,然后再从$2*r-1$这个位置开始向左找第一个没有标记的火炉,如果没有找到就直接输出$-1
阅读全文
摘要:题意:构造一个$n$x$n$只含$0$和$k$个$1$的矩阵,统计每一行每一列$1$的sum,然后构造一个权值最大行和最小行的差的平方加权值最大列和最小列的差的平方的最小和($f(A)=(max(R)-min(R))^2+(max(C)-min(C))^2$的最小值). 题解:假如$k\ mod\
阅读全文
摘要:题意:有$a$个蛋糕,$b$个巧克力,第一类人有$n$个,总是吃多的东西(若$a>b$,吃蛋糕,否则吃巧克力),第二类人有$m$个,总是吃少的,可以随便调整这两类人吃的顺序,问是否能让所有人都吃到东西. 题解:首先$a+b\ge n+m$,这个条件是一定要成立的, 然后我们最优先的方法一定是让第二类
阅读全文
摘要:题意:你需要在长度从$1$~\(k\),宽度无限的网格图中造图形(每个点四周必须连通),问最多能造出多少种不同的图形. 题解:感觉没什么好说的,就是画图找规律,如果$r\ge n$的话(即没有任何空间限制),那么就是1+1+....+n-1,否则就被网格图限制了,这时的方案数只能是1+2+....+
阅读全文
摘要:题意:有一个长度$n$的序列,如果$a_<a_{i+1}$,那么可以选择删除$a_$或者$a_{i+1}$,再继续操作,问是否能够将序列删到只剩一个元素. 题解:感觉这种序列变化的题目能用stack写,所以用数组模拟stack写了一发. 首先,假如栈为空或者$a_<a_$,那么就让$a_$入栈.
阅读全文
摘要:题意:给一个$n$X$m$的矩阵,矩阵中某个数字$k$表示其四周恰好有$k$个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既然能使任意位置加大任意数值,那么我们可以将所有位置都给他填满,这样的话,只要是满足条件的情况就都能这样输出,所以我们
阅读全文
摘要:题意:有一个长度为$n$(odd)的序列,可以更改所有的数的正负,要求最少$\frac{2}$个$a_{i+1}-a_i\ge0$,并且要求最少$\frac{2}$个$a_{i+1}-a_\le0$,求更改后的序列. 题解:因为$n$是奇数,并且随便改正负,那我们直接构造正负正负.....正负这样的
阅读全文
摘要:题意:有$n$个数,从中选$k$个数累乘,求最大的乘积$(mod\ 10^9+7)$. 题解: 1.假如全是负数,并且选奇数个,那么从小到大选. 2.否则,考虑当前状态,假如$k$是奇数,那么我们先选一个最大的,然后再选两个最大的正数相乘或者两个负数相乘后最大,每次这样选即可. 代码: int n,
阅读全文
摘要:题意:有一个空环和$n$个点,每次可以选择一个点放在空环上,并且获得周围两个点中最小的那个的权值,问能获得的最大的权值是多少? 题解:我们每次都优先放最大的进去,注意每次放的时候都要将这个点放在当前能去得到的最大权值的周围,这样的话,每个最大值我们都能取两次,所以我们只要加一个最大的权值,然后剩下的
阅读全文
摘要:题意:有一张图,.表示白色,#表示黑色,每次可以将多行和多列涂成红色(也可不涂),问有多少种方案,使得剩下黑点的个数为$k$. 题解:又学到了新的算法qwq,因为这题的数据范围很小,所以可以用二进制枚举来将所以情况枚举出来. 关于二进制枚举:对于一个集合$n$,有$2n$个子集,而$[0,2n]$,
阅读全文
摘要:题意:给你两个一元多项式$f(x)$和$g(x)$,保证它们每一项的系数互质,让$f(x)$和$g(x)$相乘得到$h(x)$,问$h(x)$是否有某一项系数不被$p$整除. 题解:这题刚开始看了好久不知道怎么写,但仔细看题目给的条件可能会看出一点门道来,我们知道,$c_$是由$f(x)$和$g(x
阅读全文
摘要:题意:有一个长度为$n$的字符串,你可以选取一个值$k(1\le k \le n)$,然后遍历字符串,每次将区间长度为$k$的字符串反转,求反转后字典序最小的字符串,并输出$k$的值. 题解:这题我是打表找规律写的,观察样例不难发现,当区间长度为$k$时,答案字符串就是将前$k-1$个字符移到了尾部
阅读全文
摘要:题意:有一个整数$n$,每次可以对加$10x$或减$10x$,问最少操作多少次能得到$n$. 题解:对于某一位上的数,我们可以从$0$加几次得到,或者从前一位减几次得到.所以对于每一位,我们都要求得一个最优解,所以用dp来写. dp数组的一维表示当前的位置,二维表示是用第一种情况还是第二种情况. 而
阅读全文
摘要:题意:有$n$个数,选择某一对数使二者分别$or$和$and$得到两个新值,求操作后所有数平方和的最大值. 题解:不难发现每次操作后,两个数的二进制表示下的$1$的个数总是不变的,所以要让平方最大,那么只能使大的尽可能大,那我们就统计每个数二进制下的每一位上$1$的个数,然后每个数的位置都尽可能的分
阅读全文