02 2021 档案
摘要:套路题,首先发现dp可做 但是直接枚举复杂度太高,并且发现我们求的都是区间最值,因此考虑线段树优化 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const
阅读全文
摘要:40有点大,我们考虑折半查找 这样每个字符串有取和不取两种可能 之后乘法原理即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=5e6
阅读全文
摘要:第一步贪心,按照权值排序,越大的能用肯定最优 因为在当前情况下,假如可以用这个但不用 最后求取的解,你将他对应的那个换掉,一个不会更差。 排完序后我们再考虑本题。 这题巧妙地转化在于,转化成图模型,每个武器的两个端点相当于一条边,如果k=1就是自环 对于一个大小为x的集合,他们中的边要不是x-1,要
阅读全文
摘要:行列无关,因此对于行列分别求解 这题的题目有个错别字,有打成由了,我做的时候没理解求的啥 ,尴尬了 其他就是状态机dp,表示这个位置向左还是向右 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pa
阅读全文
摘要:贪心点思路很简单,就是根据邻项微扰原则,进行比较两邻项,移项后就能看出公式 但是在这题显然爆ll,因此要用高精度 抄了一下int128的板子,以前虽然碰到过但是都没有记录下来 #include<bits/stdc++.h> using namespace std; typedef long long
阅读全文
摘要:一道dp好题,初始的不含加减的根据数据范围,容易猜测出状态的设计,表示f[i][j][k],表示最近的匹配1的前i个,2的前j个,3的前k的答案 现在考虑更新,这里我们发现更新只有1e3,这是一个很奇怪的询问 我当时做到这里没有想到的是,因为你只添加一个串的后缀或减去,加入添加,就相当于多增加了25
阅读全文
摘要:题目是有向图,并且要求我们最短路上的点和顺序都不能变 看上去无从下手又有迹可循。 我们假设两点之间的最短路是a ,x1,x2,x3,b 那么把他们的权值列出来后发现就是一堆边权。 我们想要的是对于每一条最短路,再修改后他们仍是最短的 这就启发我们,修改后他们之间的这些权值一定是原权值+一个定量。这样
阅读全文
摘要:朴素的做法是把全部的存起来,之后用正常的表达式计算做 据说这种方法容易mle 新的方法是,我们把这个式子当作两个式子相加,因为他没有括号,所以每次的优先级都是相同的 因此我们根据四种情况分类讨论即可 #include<bits/stdc++.h> using namespace std; typed
阅读全文
摘要:这种以k为长度的,就想一个窗口一样,很多题都是按modk相等为一组判断的 这题也不例外,我们发现,将数组差分之后,相当于2-n都要是0,第一位是啥无所谓 那么从2开始枚举,因为第一位比较特殊,是啥无所谓,他们是0,如果当前小于0,那么我们在这把他补成0(这是唯一变成0的方法),因此i+k的位置就要对
阅读全文
摘要:枚举w 根据长度的增加,其实相当于变成某一段区间能多加几次 而到了最高点后又会下降,加的次数会变少,因此维护这个数据即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pl
阅读全文
摘要:这题我的第一想法是维护每个颜色的个数,然后记忆化搜索 但是这个有15个,实在维护不了,但是我们可以转化思路看看 其实只需要相临的关系看着,其他前面的无所谓,我们就维护一下每个大小有哪几个就行,额外再维护上一个点的颜色即可,因为需要取一下重,两次不能一个颜色 #include<bits/stdc++.
阅读全文
摘要:这题题目的重要信息就是n很小并且面积要相等 因为每次都要切断,我们每次切割完的蛋糕一定要平分成功,因此我们每次切都要按x/n的倍数切 这个n代表当前这块蛋糕要分为几块,并且切完的两块蛋糕,每个蛋糕要分为几块也是固定的,因为面积要相等。 #include<bits/stdc++.h> using na
阅读全文
摘要:一道区间dp题 我们发现由于有了M的限制,所以合并区间的时候并不能直接合并,因为不是从区间左端点开始的 因此考虑三维状态设计 f[i][j][0/1]表示i-j中是否存在M 对于不存在的情况,他有两种更新方式,一种是直接合并,一种是当偶数时,可以折半合并 对于存在的情况,这个M相当于把一个大区间的合
阅读全文
摘要:想不到的一道题,有点背包的感觉,但是重点还是题目所给的信息 首先观察题目应该是平方算法 进一步剖析,我只能想到枚举重儿子大小这个思路。 后来看了题解发现他们把信息挖掘的很到位。重儿子肯定是要枚举 现在求的是最大代价,而除了重儿子外,自顶向下的思路上看,还有很多其他子树,这些树组成了森林 如果求他的最
阅读全文
摘要:我们贪心的猜测肯定是每次用二分图匹配,这样答案就是最小的 这基本上对的,因此可以每次都可以消除最多的边并且满足不会遇到同一个点 但是有一个纰漏,我们首先知道最小值肯定是度数最大的点的度数,因为这个点的每个出边都不同,并且我们每次只能减少一条边。 因此我们每次按照目前的度数排序去重复做匈牙利算法,因为
阅读全文
摘要:A题 找两两比列,按2的次幂进行划分 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const int N=1e5+200; const int mod=1e9+
阅读全文
摘要:这题如果注意到m的范围,那么思路将会豁然开朗 因为如果是一棵树,那么直接lca就能求得两点间最小值 但是现在是图,并且边数就比一棵树大100左右 所以我们可以想到,先将图中取出生成树,用lca求答案 那么剩下就有100条边左右未使用,我们发现,答案可能经过这些边,因此我们枚举这些边的端点去做01最短
阅读全文
摘要:这题的第一想法就是我们对根节点进行贪心构造,使得左子树和右子树的差最大,这是最优的 左子树自然是以n-1为高度的满二叉树,这样节点最多,那么右子树我们需要考虑如何满足高度的平衡限制 我们发现为了对每个点都满足左右子树差值为d,我们相当于对于每个节点,左子树是一个高度为i-1的最少节点的树,而右子树是
阅读全文
摘要:首先,每位独立考虑 其次,我们发现是求区间和,因此区间内中的数的对应位,1多就填0,0多就填1,一样多优先填0 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; co
阅读全文
摘要:相当于一个背包问题,设计状态为f[i][j]表示前i个,达到j元的方案,这样记住合法的方案之后除非法方案即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pll; con
阅读全文
摘要:我们把每个种族看作一个集合 已知最后他们联通,那么这就意味着他们到达某一点联通的代价是最小的 因此我们枚举所有点,找到最小值。 事实上,最后答案的连通块上面的点都是最小的,他们没有区别 #include<bits/stdc++.h> using namespace std; typedef long
阅读全文
摘要:这个depth的式子就很有那味,明显就是把他拆分掉,维护0次项,一次项和二次项 因为只能从头,所以递归维护即可,注意到如果小于0了,就把他的贡献剪掉。 我第一次写的时候用了dfs序+线段树维护,复杂度感觉还行,但是内存和常数太大,过不了,只过了70%,这题本来也不用这么麻烦做 数据量给到1e6,用大
阅读全文
摘要:题目比较水,但是为了给我的tag加点量就水一篇题解 这题一个暴力的贪心就是按照利润排序,然后对于大的利润去找能满足条件的最晚的一天 这样的复杂度比较高,找的过程可以可以用set自带的二分去做,这样就是nlogn了 #include<bits/stdc++.h> using namespace std
阅读全文
摘要:这题奇数部分比较容易想到,用优先队列维护每个位置前能否取到指定个数,这样枚举每个位置座位中位数即可 对于偶数,由于两个数位置不确定,并且不能枚举两个,因此还是考虑要维护一个 这样就需要一个log复杂度以内的算法找到每个对应的最优解,常见的就是二分算法 我们观察题目性质,果然符合单调性,因为对于左边定
阅读全文
摘要:我们观察到只有查询操作。 这个查询可以通过线段树来实现,因为可以通过维护最大最小值来维护差值最大值,因为是一个星期,所以容易相当答案是关于周期循环的,因此建立七棵线段树。 恶心的是有两个方向,因此我们要建十四棵线段树维护 #include<bits/stdc++.h> using namespace
阅读全文
摘要:复健牛客每日一题系列 这题的dp感觉很浓,因为数据范围给的很像dp 刚开始我被能多次操作困惑了,以为是什么巧妙的贪心 但是其实多次能拿,一次也能拿,我们可以通过放的位置控制在m之内 因此这题是一道背包dp,因为每个物品都有三种选择,左边右边或者不放,而第二维状态可以表示为两边的差值 这题会产生负的,
阅读全文
摘要:虽然题目说着分两种类型,其实就是相当于对于每一行,选择一个矩形去框 那么这样就统一了形式,而我们发现,每一行只跟上一行相关。 还有一个问题是交叉部分的去重,我们发现这有三种情况,因此对于三种情况分别讨论 但是枚举更新复杂度太高,因此想到优化,这种优化比较套路,用线段树求区间最大值就行 #includ
阅读全文
摘要:B题 双指针+贪心,先按照权值排序,对于每个l,找到最近符合条件的r 注意如果可以不取A,那就别取A #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const
阅读全文
摘要:因为只有一条路,因此可以发现同一个深度的节点他们的父亲要相同 不同深度的节点,深度大的节点的父亲要在深度小的节点的父亲的子树当中 因此我们需要使用dfn就能查看是否在子树当中 #include<bits/stdc++.h> using namespace std; typedef long long
阅读全文
摘要:A题 看出独立性后高斯消元 #include<bits/stdc++.h> using namespace std; #define ll long long const int N=205; int a[N][N];//增广矩阵 int x[N];//解集 int freeX[N];//自由变元
阅读全文

浙公网安备 33010602011771号