随笔分类 - 做题总结
摘要:传送门 可以用线段树维护,\(ln\)表示当前区间无法匹配的左括号数量,\(rn\)表示当前区间无法匹配的右括号数量 #include<bits/stdc++.h> #define int long long using namespace std; const int N = 4e6 + 10;
阅读全文
摘要:传送门 首先当\(k\)为奇数时,若一个点想为好点,必须他自己就是岛屿之一,所以\(k\)为奇数时答案一定是\(1\) 接着考虑\(k\)为偶数时怎么求好点数。我们发现,若一个点为好点,则当其延某一条边移动一次得到的点的答案一定不能更优,否则这次移动得到的点才是好点。也就是说,对于好点所连的所有边,
阅读全文
摘要:传送门 需要先注意到,将员工按照能力值从大到小排序后,分配给每个项目的员工一定是连续的。 再利用这个性质,设\(dp_S\)表示完成\(S\)集合的项目所需最少员工为多少个。并记录每个集合是由哪一个子集转移过来的,最后输出方案数 启示:需先观察性质,才能设计dp及状态转移方程 #include<bi
阅读全文
摘要:传送门 性质1:规定\(a_0=a_{n+1}=0\),则满足条件的序列一定有\(a_i≤a_{i-1}+a_{i+1}\) 利用这个性质,我们可以设\(dp_{i,j,k}\)表示填充到第\(i\)位,第\(i-1\)位填\(j\),第\(i\)位填\(k\)的方案数,转移即 \(dp_{i,j,
阅读全文
摘要:传送门 1.位运算相关,看每一位是否独立。此题中每一位独立,所以可以对每一位单独算方案数最后相乘 2.DP状态设计,预处理及空间时间复杂度优化。首先设\(dp_{i,j}\)表示填好\(1\)~\(i\)位时,最后一个\(0\)在\(j\)位置的方案数,此时若想要转移,需要考虑对于当前第\(i\)位
阅读全文
摘要:传送门 首先注意到一条从\(1\)节点往下的路径权值一定要是单调递减的。这样就可以算出每个节点的权值要作为多少个点的美丽值,将这个值用\(siz\)储存 接着我们发现,对于一个题目要求的\(k\),我们需要选择一些点,使得这些点深度(距离当前子树的根)之和最小(因为每多选一个点就需要多放一个数,这样
阅读全文
摘要:传送门 我们发现,若从上往下遍历矩阵会涉及到一些类似删除的操作,这是难以维护的 所以可以从下往上,也就是从高度低往高度高遍历,这样变成添加操作维护起来是便捷的 根据乘法原理,最终答案为所有连通块方案数的乘积。考虑一个连通块的方案数怎么计算,若一个连通块只占据某一行,那么方案数为\(2\),即选或不选
阅读全文
摘要:传送门 题目转化为要么是两条不相交的链,要么是同一个顶点的四条链 感觉很妙的树形DP,用记忆化分别求出了以某一个顶点为父节点,某一顶点为子节点的以它为起点的最长链和不一定以它为起点的最长链 #include<bits/stdc++.h> using namespace std; const long
阅读全文
摘要:传送门 此题与之前某一场div.2的D题一模一样( 我们从后往前遍历,假如当前已经遍历了k个数,那么我们能选的数就有\(\left \lfloor \frac{k}{2}\right \rfloor\)个,所以假如当前优先队列中的数没有这么多,就直接选当前的数,如果已经选了这么多个数了,就看最小的是
阅读全文
摘要:传送门 首先第一直觉直接令dp[i][j]表示当前甜度咸度分别为i,j时能吃的最多的菜数进行dp,时间上\(O(nxy)\)肯定是炸的 优化方法其实也很简单,我们注意到n相对于x和y来说很小,所以我们只需要想办法把时间复杂度中的x或者y替换成n即可,类似于矩阵乘法时我们选择最小的一个作为平方项复杂度
阅读全文
摘要:赛时写了一个\(O(nm^{2})\)的做法想不到该怎么优化,赛后看题解用dfs序dp,觉得有点不习惯(还是习惯直接树上dp),翻别人的代码发现一个直接树上dp的做法,这里仅根据我的理解来解释一下。 首先设dp[i][j]表示整棵树所选节点权值和为j的情况下,i节点必选的方案数,接下来看如何转移。
阅读全文
摘要://记录一下思考这道题dp的过程 //首先发现如果想填三个格子,填法只有那么几种。所以我在一开始的想法是设置一个多维dp,记录下当前对应第几行、已经填了多少个、以及是哪一种填法 //但是发现这样不好转移,或者说无法转移。那么再思考,其实考虑填法的那一维可以变成当前这一列对应的两个格子各自的状态,用二
阅读全文
摘要://记录一下如何想到具体DP转移方程的 //首先想令dp[i][j][k]表示第i次移动之前,左手在j位置,右手在k位置的情况。这样状态转移很简单,但是时间空间都会炸 //空间好办,直接滚动数组即可。至于时间,我们发现前一次移动之后有一只手的位置是固定的,这直接帮我们省掉了一维的时间和空间 //于是
阅读全文
摘要://首先思路是,对于每一轮,假如是奇数轮次,我们只需要让当前轮次的所有数尽可能大即可,反之则尽可能小。所以用l=1和r=n来放答案 //对于当前轮次,如果是奇数,很明显只需要挨个从r往小放即可,因为这样已经保证了后面放的所有数都比当前放的小,也就是当前放的数不会是局部最小值 //现在还剩下一个问题,
阅读全文
摘要:传送门 题目大意:博弈论,给定若干个数轴上属于正半轴的区间,每次可以往左移动区间,但是不能重叠或是区间左端点非正,最后无法移动的人输。 首先我们将每个区间中包含了多少个数(不包含左右端点)看作是多少个小球,那么考虑一次移动区间,我们发现移动一次区间对于这个区间本身是没有任何影响的,影响的是这个区间左
阅读全文
摘要:#include<bits/stdc++.h> using namespace std; int t; const int N = 2e5 + 10; int n,m,ans,pos[N],cnt; vector<int> g[N]; vector<bitset<N> > h; void solve
阅读全文
摘要://首先需要注意到,如果我们对当前序列中每个数都进行一次操作,那么实际上是令整个序列每个数都减一 //于是假设序列k,k,...,k是可以由当前序列转化过去的,那么k-1,k-1,...,k-1也是可以得到的,乃至小于等于k的每个数都是可以作为最终答案的 //于是我们发现答案具有单调性,即有答案的情
阅读全文
摘要:传送门 题目大意:求斐波那契数列中第n个能整除k的位置 其实找几个数手推一下就会发现貌似是存在每种周期关系的。 这样写看似会无限重复下去,但是实际上是能通过的。根据皮萨诺周期,实际的枚举次数不会超过6k(至于证明,我也不会啊QAQ 放一个FIB数列最大公约数定理:gcd(F(m),F(n))=F(g
阅读全文
摘要:1001 数列计数 一个结论:\(C_{n}^{m}\)为奇数当且仅当\(n & k==k\) 于是就可以分类讨论一下,当\(l_{i}\)大于等于\(a_{i}\),此时\([0,a_{i}]\)全都可以取到,假定二进制下\(a_{i}\)有\(k\)个1,方案数就是\(2^{k}\) 否则,我们
阅读全文
摘要://首先让a[i] = i,如果把a[1]和a[2]调换,发现到奇数位置时就会是它本身,于是n为奇数的情况直接出来了 //而如果n为偶数,例如10,我们直接让111放在最后或,只要保证前面几个数全都有最高位的1,那么最后的答案肯定是最大的。 //但是n为偶数出现了特殊情况,例如8,此时如果还把111
阅读全文

浙公网安备 33010602011771号