- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 腾讯AI Lab部门-后台开发实习面经
感觉是KPI面,面试官表现的比较冷漠,写完算法题后看我课题跟AI有关就问了一些相关的东西,八股也没问,我投的明明是后台开发实习…4、算法题:leetcode 72. 编辑距离 (脑子抽了转移方程推错。5、算法题:leetcode 5. 最长回文子串 (秒了)3、项目经历 (面试官完全不感兴趣。9、了解transformer嘛 (没了解过。6、CNN和DNN的区别。7、怎么解决梯度消失问题。8、介绍adam优化器。
2023-06-14 23:17:20 505 3
原创 leetcode(805)数组的均值分割 (折半搜索)
折半搜索,又称为meet-in-the-middle。其做法为将整个搜索的过程分为两部分,然后每部分分别进行搜索,最后将得到两个答案序列,再将答案序列进行合并,即可得到最终的答案。比如,在每一层搜索时,假如都有两种选择,那么其时间复杂度为O(2^N)。当n较大时,往往会导致超时,此时,如果使用折半搜索,其时间复杂度将缩小为O(2^(N/2)+合并操作的时间复杂度)。
2022-11-14 17:25:36 198
原创 树形DP入门
Tip:1、什么是树型动态规划树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺推与逆推,而树型动态规划是建立在树上的,所以也相应的有二个方向:1、叶->根:在回溯的时候从叶子节点往上更新信息(一般都是从叶到根)2、根 - >叶:往往是在从叶往根dfs一遍之后(相当于预处理),再重新往下获取最后的答案。2、树形动态规划的优美之处树本身至少就有“子结构”性质(树和子树);
2021-05-29 21:11:32 111
原创 Educational Codeforces Round 99 (Rated for Div. 2) A-D题解
题目链接:https://codeforces.ml/contest/1455tip:有一段时间div2没做出四题了,记录一下(D题差点没改对QAQ)。A、Strange Functions输出输入的字符串长度即可,签到题。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e5+10; int main(){ int T;cin>>T;
2020-12-01 10:45:32 492
原创 核弹剑仙 (拓扑排序+bitset或最短路)
题目链接:https://ac.nowcoder.com/acm/contest/6874/F题意:题解:参考了大佬的代码后,得出了两种做法,第一种是拓扑排序,建图时将强的点指向弱的点,同时用bitset进行答案的转移,第二种是将弱的点指向强的点建图,然后对每个点跑一遍最短路,统计那些能到的点的个数(除了它本身)即为答案。拓扑排序代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;con
2020-08-22 23:46:33 189
原创 Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree(DFS+贪心)
题目链接:https://codeforces.ml/contest/1401/problem/D题意:n个点,n-1条边,一个数k拆分成若干个素因数将其放置在边上,f(i,j)表示从i顶点到j顶点的边权和,求的最大值。题解:很明显的贪心题,边经过的次数越多,放置的数字越大,因此要先求出每条边经过的次数再从大到小排序,最后分n和m的关系讨论,重点在于如何求每条边的次数,开一个数组sz表示子树大小(节点数),经过边的次数=(n-sz[i])*sz[i],这边简单证明一下,我们从树种任意选取一条边,
2020-08-22 03:36:03 150
原创 装货物 (DFS+剪枝)
题目链接:https://ac.nowcoder.com/acm/contest/7189/A题意:题解:看到n特别小,很容易想若能装下所有货物最多只需要n个箱子,因此可以DFS求解,但过程需要剪枝,否则会超时,假定分成min(n,x)个桶,每个桶容量为wi,考虑第i个物品则它可能装入的桶为1~min(i,x)而不是1~min(n,x),这样就完成的第一部分的剪枝,第二部分的剪枝是已经能装下全部物品后就直接return防止一部分状态还会再继续搜索和回溯。完成前两部分的剪枝就已经能AC了,但还可以
2020-08-20 21:34:32 279 1
原创 spfa算法求解次短路
题目链接:https://ac.nowcoder.com/acm/contest/7031/F题意:求图当中从0号节点到n-1号节点的次短路。思路:在spfa算法上稍改进即可,更新次短路的情况分三种。1、当最短路更新时将次短路的值更新为当前最短路的值(这样保证次短路永远都是大于最短路且是第二小的)。2、次短路正常更新。3、当最短路不更新时,若到u的最短路经过该边到v的距离小于次短路则更新次短路。代码:#include<bits/stdc++.h>using namespace
2020-08-17 22:08:32 419
原创 Codeforces Round #661 (Div. 3) D. Binary String To Subsequences(队列)
题目链接:https://codeforces.ml/contest/1399/problem/D题意:给一串由0和1组成的字符串,问最少可以分成多少个子序列使得每个子序列没有相邻的0和1.题解:直接模拟标号,同时需要两个队列,q0存的是以0结尾的标号,q1存的是以1结尾的标号,若当前s[i]='0'判断q1是否为空,非空则该元素的标号=队首的标号,再将队首弹出放入q0队列(此标号从以1结尾变成了以0结尾),反之亦然。代码:#include<bits/stdc++.h>usi
2020-08-06 15:46:27 134
原创 AtCoder Beginner Contest 174 C - Repsept
题目链接:https://atcoder.jp/contests/abc174/tasks/abc174_c题意:给一个正整数k,问是否存在一个77777....这样的数能整除k,若能则输出最小的位数。题解:通过动手模拟可以发现每添加一位后对k取余即可,例如777%3<=>7%3=1,1*10+7=77,77%3=2,2*10+7=27,27%3=0,因此暴力跑1e6遍若还不能整除则无解。代码:#include<iostream>using namespace s
2020-08-04 10:42:22 358 2
原创 Codeforces Round #660 (Div. 2) C、D
C. Uncle Bogdan and Country Happiness(两次dfs)题目链接:https://codeforces.ml/contest/1388/problem/C题意:给定一个n个节点的树,所有人都从1号节点往自己回家的方向走,在走的过程中每个人的好心情可能会变成坏心情,但坏心情不能变成好心情,pi是每个节点居住的人数,hi当前节点是好心情的人数-坏心情的人数,问hi计数是否存在。题解:首先要把所有节点经过的总人数算出来(第一次dfs),从而算出每个节点好心情的人数,再将
2020-07-31 14:37:22 160
原创 2020牛客寒假算法基础集训营6 图(tarjan缩点+拓扑排序)
题目链接:https://ac.nowcoder.com/acm/contest/3007#question题意:题解:题中有两个坑点,第一个是图可以不连通,第二个是图中有环,因此要先处理环,处理环的过程可以用tarjan算法进行缩点重构图,将所有的环缩成一个点(缩点的细节具体见代码),重构的图是一个有向无环图,因此只要跑一遍拓扑排序,维护每个点的最大值即可。代码:#include<bits/stdc++.h>using namespace std;typedef lo
2020-07-27 23:51:24 148
原创 P1726 上白泽慧音 (tarjan求最大强联通分量)
题目链接:https://www.luogu.com.cn/problem/P1726tarjan算法参考:https://blog.csdn.net/Prediction__/article/details/100030166代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5050;vector<int> e[maxn];int n,m,a,b
2020-07-26 00:22:35 139
原创 畅通工程续 (floyd算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874tip:记录一下floyd算法,本质是区间DP的思想,用邻接矩阵存储图,若两个点无边则标记为正无穷,接着枚举中转点k,起点i和终点j,若e[i][j]>e[i][k]+e[k][j]说明从i点到j点经过k点距离更小则更新。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const in
2020-07-25 17:07:38 120
原创 Codeforces Round #658 (Div. 2) D. Unmerge (01背包)
题目链接:https://codeforces.ml/contest/1382/problem/D题意:定义两个数组的合并merge(a,b),每次将数组a第一个元素和数组b第一个元素中最小的那个放到数组c中,同时删除那个最小的元素,现在给你一个长度为2*n的排列,问是否能由两个长度为n的数组合并而成。题解:通过观察可以发现这一段序列由若干个子段组成,例如3 1 2 4可以由3 1 2和 4组成,其分法是以最大值为分割点,可以简单的证明一下,若将一段中小的放到另一个数组b中,则该小的数必然排在大的.
2020-07-24 12:14:43 108
原创 Codeforces Round #656 (Div. 3) E. Directing Edges (拓扑排序)
题目链接:https://codeforces.ml/contest/1385/problem/E题解:首先将有向边和无向边分开存,若已存在的有向边(判断一个有向图是否存在环用拓扑排序)已经存在环则输出NO,否则一定有解,无向边方向的判断可以根据拓扑排序的先后次序,次序在前的指向次序在后的。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+10;int
2020-07-23 21:52:02 91
原创 多重背包问题 (二进制优化)
题目链接:https://www.acwing.com/problem/content/5/题意:tip:可以将多重背包问题转化成01背包问题,若将每种物品的数量拆分成1个的话时间复杂度还是不变,因此可以拆分成二进制,例如10可以拆分成1,2,4,3,其中3是由于到2^2时剩余数量小于2^3因此将剩下的凑成一个物品。拆分的正确性可以通过动手模拟,1,2,4,3可以任意组合成1~10之间的任意数字。代码:#include<bits/stdc++.h>using namesp
2020-07-22 21:58:50 511
原创 大水题 (容斥原理)
题目链接:https://ac.nowcoder.com/acm/problem/15079题意:题解:由于n太大直接枚举肯定不行,可以用容斥原理,先求出2,5,11,13各自的倍数个数用n减去它们的和,但发现它们中的共同倍数会被减多次,因此还要加上两两各自的倍数个数,以此类推,最后形成加减交错的式子。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;int main(){ ll
2020-07-08 21:45:15 221
原创 线段树 (区间更新+区间查询)
题目链接:https://www.luogu.com.cn/problem/P3372题意:题解:如果采用单点更新的思路对区间进行更新的话时间复杂度会比较高,因此用了一个lazy数组(俗称懒人标记),它为什么叫懒人标记呢,比如更新的区间为[l,r]+z,而l到r覆盖了线段树某一个节点的区间,那么可以将该节点对应的lazy数组的值加上z,同时更新该节点的值,这样就可以避免更新它子孙节点的值了,当要查询或者修改的时候要将lazy标记往下传一层,这样就能保证当在更新或查询的时候子孙节点的值是正确的。
2020-07-07 23:53:09 453
原创 线段树 (单点修改+区间查询)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166tip:记录一下线段树的入门题吧~~代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e5+10;int a[maxn],tree[maxn];int n,m;void build(int node,int start,int end){ if(star
2020-07-07 15:57:22 269
原创 最小生成树模板(kruskal算法)
题目链接:https://www.luogu.com.cn/problem/P3366tip:作为队伍的数据结构选手,来记录一下模板题供以后比赛前复习~~~(其实是队友太懒了)题解:这边用了kruskal算法,首先将边权从小到大排序后,再遍历每一条边,用并查集检查当前遍历到的边的两端节点是否已经连通,若不连通则加入到集合中,最后判断一下边是否是节点的数量-1即可。代码:#include<bits/stdc++.h>using namespace std;typedef lo
2020-07-03 14:32:11 220
原创 牛牛战队的比赛地 (三分)
题目链接:https://ac.nowcoder.com/acm/problem/201956题意:题解:由于坐标在x轴上,可以假定当前有一个x0使得最大的距离最小,那么当x0往左移或往右移时最大的距离就会变大,因此可以把它看成一个先减后增的函数,套用三分的模板即可。三分证明参考:https://blog.csdn.net/xu0_zy/article/details/79417463代码:#include<bits/stdc++.h>using namespace
2020-06-30 14:25:35 3234
原创 AtCoder Beginner Contest 172 D - Sum of Divisors(类似素数筛)
题目链接:https://atcoder.jp/contests/abc172/tasks/abc172_d题意:给定一个n,f(x)表示x的因子数量,求题解:可以类比素数筛,素数筛是从2开始把它所有的倍数都划去,这边也可以用这种思想,从1开始枚举到1e7,将每个数的倍数对应的因子个数+1.代码:#include<iostream>using namespace std;typedef long long ll;const int maxn=1e7+10;ll p[ma
2020-06-27 22:22:45 301
原创 同余方程 (拓展欧几里得求逆元)
题目链接:https://ac.nowcoder.com/acm/problem/16563题意:题解:这个方程实际上是逆元的定义,由于b没说是质数,故不能用费马小定理求解。ax=1(mod b)可以转化成ax+by=1(mod b)。这边简单的证明一下,ax%b+by%b=1%b => ax%b=1%b =原式。得到的方程是一个二元方程,我们要求的逆元是x,因此可以用拓展欧几里得求解。代码:#include<bits/stdc++.h>using names...
2020-06-26 19:28:28 437
原创 逆序数 (归并排序)
题目链接:https://ac.nowcoder.com/acm/problem/15163题解:求逆序数有两种方法,一个是用归并排序,还有一个是树状数组,当然也可以用冒泡排序但是时间复杂度会变成O(N^2),这边讲一下归并排序的思路。举一个简单的例子吧,L-mid:4 5 ,mid+1-R: 1 2,可以发现4>1那么4后面的数肯定也会大于1(归并排序在marge的时候一定是左右两边都是有序的),因此当前对逆序对数量做出的贡献是mid-i+1,以此类推。代码:#include<b
2020-06-26 14:48:06 241
原创 Codeforces Round #652 (Div. 2) D. TediousLee (DP+找规律)
链接:https://codeforces.com/contest/1369/problem/D题解:如图,要注意f[3]!=f[2]+f[1]*2,因为level为3的时候算的是最上边的claw,为6的时候最大的也是算上最上边的claw,因此可以推出level是3的倍数时递推式就是f[i]=f[i-1]+f[i-2]*2+4。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const
2020-06-24 13:04:51 210
原创 A Number Theoretical Problem (逆元)
题目链接:https://ac.nowcoder.com/acm/contest/5891/B题意:给定y和p,问(x*y)%p=1是否有解,若有解则输出x。tip:费马小定理->若a和p互质,则(a^(p-1))%p=1%p。逆元->a*b=1(mod p),其中a和b与p互质。solution:可以将式子化成x%p*y%p=1%p => x%p=y的逆元%p =>x%p=y^(p-2)%p。因此只需要算出y^(p-2)%p即可,可以用快速幂求解。代码:...
2020-06-22 23:33:43 170
原创 Codeforces Round #651 (Div. 2) D. Odd-Even Subsequence (贪心+二分)
题目链接:https://codeforces.com/contest/1370/problem/Dsolution:
2020-06-21 19:35:43 152
原创 Codeforces Round #651 (Div. 2) E. Binary Subsequence Rotation(思维)
题目链接:https://codeforces.com/contest/1370/problem/Esolution:若s串中0和1的数量与t串中不同则直接输出-1,否则有解。有解的情况下只需要考虑不同的部分,不同的部分中s串为1则t串为0,经过模拟后会发现像111000,000111这种情况可以拆分成三个10或01串进行平移,而其它单独拆分出来的01串或10串可以与最长的111000串和000111串合并起来进行平移,101串的情况是不需要考虑的因为它经过平移不可能与t串相同。具体的实现看代码吧。
2020-06-21 19:23:13 188 1
原创 Codeforces Global Round 8 D. AND, OR and square sum(位运算+贪心)
题目链接:https://codeforces.com/contest/1368/problem/D题意:有n个数,每次可以选两个下标不同的数ai和aj,使得ai=ai|aj,aj=ai&aj,可以操作任意次,问操作后使得所有数最大的平方和是多少。solution:仔细观察发现ai=ai|aj和aj=ai&aj如果对应的位不一样则交换0和1的位置,并没有改变当前位0和1的数量。因此我们可以统计出每个位上1的个数,然后重新分配1,越前面的尽可能分配越多的1,这样使得平方和更大。时间复杂
2020-06-19 13:21:21 132
原创 AtCoder Beginner Contest 170 E - Smart Infants(multiset容器模拟)
题目链接:https://atcoder.jp/contests/abc170/tasks/abc170_e题意:给n个人 每个人有一个值a[i] 属于b[i]组 ,有q次询问,每次询问让第c个人变成d组,问每次改变后 , 每个组中的最大值中的最小值为多少。思路:对每个组可以建立一个multiset(它的值可以重复),然后再维护一个multiset保存每个组的最大值。每次进行更新时要注意判断两个条件,第一个是当a[i]值是该组最大时要将该组的最大值插入x,第二个是当a[i]值是要插入那组的最大值时.
2020-06-18 14:41:09 247
原创 Maze(dfs+连通块)
题目:思路:由于它只能从+走到-或从-走到+号,可以把迷宫看成由多个连通块或者集合组成的,不需要对每个点都进行dfs,我们只要对于所有连通块的一个点进行dfs即可,因此可以维护一个并查集,但本人太懒。。就直接用了标记,属于某一个连通块的所有点都标记成一样的数字,然后再开一个数组保存该数字对应的个数即可(代码如下)。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;char a[3005][
2020-06-14 22:38:58 200
原创 大数阶乘问题
题目:tip:由于n很大要用到大数模拟才能过,怎么模拟呢,开一个数组每个空间存一定的位数,但是如果只存一位的话会超时,经过多次的WA当每个空间存到7位数时就过了。。要注意的是除了数组末尾前面的数不满7位都要填充0,否则就会丢失掉0,因为是满8位数时进位,每个空间应该是7位数才对。代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a[15000];int main(){ i
2020-06-13 02:05:36 244
原创 矩阵消除游戏(二进制枚举+贪心)
题目链接:https://ac.nowcoder.com/acm/problem/200190题意:给n*m的矩阵,每次只能取一行或一列,取完后该行或该列变为0,总共能取k次,问怎么取才能使获得的数最大。思路:n和m都很小,可以想到枚举选出k个行和列,但是最坏的时间复杂度为2^30次方会T,因此可以想到如果只枚举行或列选取哪些,另一边直接贪心的从大到小选取就好了,但是如何枚举呢,这边要采用二进制的方式,1表示选中,0表示未选中。二进制枚举参考:https://blog.csdn.net/su
2020-06-10 22:07:15 554
原创 树上求和(贪心+树上dfs)
题目链接:https://ac.nowcoder.com/acm/contest/5986/F题目:有一棵包含n个节点和n-1条边的树,规定树链(u,v)为树上从u到v的简单路径。树的每条边上都有一个正整数,这个正整数被称作这条边的颜色,规定一条树链的权值w(u,v)为这条树链上所有边的颜色的代数和。而整棵树的权值为所有不同的树链的权值的代数和。已知所有边的颜色集合恰好为1到n-1这n-1个不同的正整数,请你为每条边安排一种颜色,使得这棵树的权值尽量小,你不需要给出具体方案,只需要求出这个最小的权值即
2020-06-10 00:08:43 278
原创 Codeforces Round #605 (Div. 3) D. Remove One Element (前缀和+后缀和|线性DP)
题目链接:https://codeforces.com/contest/1272/problem/D题意:给一个数列,最多移除其中一个数,问最长的连续上升子串的数量。tip:这篇博客写给自己看的。。算是翻翻旧题目吧,去年好像是WA了好多发没写出来,那时候还不会DP,现在看起来好像根本不需要DP的样子。思路:其实这题有两种情况,第一种是不删,第二种是删其中一个,连续上升的话可以用前缀和处理出来,再构造一个连续下降后缀和,因为连续上升从后往前就是连续连续下降嘛,删除某一个数其实只要将它前面一个数
2020-06-08 16:45:00 127
原创 Codeforces Round #648 (Div. 2) F. Swaps Again (思维+模拟)
题目链接:https://codeforces.com/contest/1365/problem/F题意:给你一个数组a,每次只能选取一个数K交换前缀的K个数和后缀的K个数,问是否能变成数组b。solution:先吐槽一下这题吧,个人觉得这题如果放在C题的位置都不过分。。然后说思路,先举个例子,1 2 3 4 5,可以变成5 2 3 4 1, 4 1 3 5 2, 2 1 3 5 4,多试几个样例发现对称的数经过交换后的位置依然是相对对称的,像这个例子中1和5,2和4的位置都是对称的,因此我们可以直
2020-06-08 11:40:17 375 1
数据库课设&JavaEE大作业.zip
2020-05-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人