11 2020 档案

摘要:#include<bits/stdc++.h> using namespace std; const int N = 1005; int a[N][N]; int b[N][N]; int n,m,q; void insert(int x1,int y1,int x2,int y2,int c){/ 阅读全文
posted @ 2020-11-13 16:45 mohari 阅读(126) 评论(0) 推荐(0) 编辑
摘要:题解:题目大意是添加最少几个字符使得该串变为回文串,这里可以转化为最少删除几个字符成为回文串(删除字符和添加字符其实一样); 那么问题的答案就是总长度减去最长回文串(子序列)的长度。 求解最长回文子序列长度使用区间dp来求解。 状态表示f[l][r]表示r-l区间内最长回文子序列的长度。属性值是最大 阅读全文
posted @ 2020-11-11 16:29 mohari 阅读(104) 评论(0) 推荐(0) 编辑
摘要:题解:整数划分问题。将M划分为最多N个数的所有方案数。比较经典的题,dp的划分方式想不出,这里记录一下。 f[i][j]表示总和为i,划分为了j个数的方案。集合可以划分为两个部分 1.序列中存在数字0,那么f[i][j]=f[i][j-1](相当于可以减少一个划分数) 2.序列数不存在0,即都大于等 阅读全文
posted @ 2020-11-11 11:07 mohari 阅读(139) 评论(0) 推荐(0) 编辑
摘要:传送门 前置知识:算术基本定理:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*P3^a3......Pn^an,这里P1<P2<P3......<Pn均为质数,其中指数ai是正整数。 题解:由算术基本定理,我们可以将x拆成若干个质数相乘, 阅读全文
posted @ 2020-11-10 10:48 mohari 阅读(131) 评论(0) 推荐(0) 编辑
摘要:传送门 题解:题目是要求找到三个数之和最大并取模K等于0。 我们可以将每个数对k取模,并记录取余k相同的数中最大三个数(vector模拟即可) 那么我们只需要枚举这其中所有的三个余数之和结果取余k为0的方案(要防止取余结果为负),取最大和即可。 每个数只能取一个,所以需要开几个num数组记录当前余数 阅读全文
posted @ 2020-11-09 14:41 mohari 阅读(222) 评论(0) 推荐(0) 编辑
摘要:传送门 题解:大意是依次遍历每个数,若该数之前出现过,需要一直加一直到得到一个没有出现过的数。 这里可以用并查集解决,每次遍历一个点,输出其祖先节点,并将其祖先节点的祖先设为该祖先节点加一(即下一个位置) #include<bits/stdc++.h> using namespace std; in 阅读全文
posted @ 2020-11-09 14:28 mohari 阅读(151) 评论(0) 推荐(1) 编辑
摘要:传送门 题意:求树上两点的最短距离。考查lca,预处理点到根的距离dist,则两点a、b之间的最短距离是dist[a]+dist[b]-2*dist[p];p是a、b最近公共祖先。 关于lcahttps://blog.csdn.net/my_sunshine26/article/details/72 阅读全文
posted @ 2020-11-09 13:22 mohari 阅读(146) 评论(0) 推荐(0) 编辑
摘要:传送门 题目描述 给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。 你可以从中选出两个数 Ai和 Aj(i不等于j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。 例如 12 和 345 可以拼成 12345或 34512。 注意交换 Ai和 Aj的顺序总是被视为 2 种拼法,即便是 A 阅读全文
posted @ 2020-11-06 16:54 mohari 阅读(188) 评论(0) 推荐(0) 编辑