10 2019 档案
摘要:"题目链接" 满分做法: 在做搜索 最短路路径时 可以从终点搜到起点,记录该位置到终点的最短路,再次搜索时从起点搜索并判断即可。 本题还要比较颜色的字典序,于是我们把当前深度的点都拿出来,进行向外扩展,找到既在最短路径上,又经过颜色字典序最小的点,加入到队列中,并把当前颜色最小值加入到答案序列即可。
阅读全文
摘要:换根dp的通法:1.第一次扫描时,任选一个点为根,在“有根树”上执行一次树形DP,也就在回溯时发生的,自底向上的状态转移。 2.第二次扫描时,从刚才选出的根出发,对整棵树执行一次dfs,在每次递归前进行自上向下的推导,计算出换根后的解。 例题POJ3585 Accumulation Degree d
阅读全文
摘要:"题目链接" 满分做法: 将正反两面连边,发现如果一个连通块的变数 =n条时,那么这个连通块一定能满足保证每个面值都能够被提供至少一次。如果它是一棵树,无论怎么调整,都会漏掉一个面值无法打出。 于是最后询问的就是一个线段中是否包含一个完整的限制线段(他的起点为一棵树中编号最小的,终点为最大的),这个
阅读全文
摘要:85分做法: 利用优先队列找出最大的蚯蚓,再用懒标记去计算增长的长度即可( 除了那被切成的两只蚯蚓其他的都往正方向移动了一些, 等价于那两只往负方向移动了一些. 所以可以记录累计加的长度, 有几只没被加的就减去就好了) 满分做法: 发现先被切掉的蚯蚓分成的蚯蚓一定比后切掉的蚯蚓分成的蚯蚓大,所以直接
阅读全文
摘要:满分做法: 对于有全对的时候,直接枚举每个人的答案为最终答案,判断和他完全相反的字符串是否为p个即可。 对于没有全对但有全错的时候,枚举每个答案为错误答案,并判断和他完全相反的字符串是否有即可。 对于p,q都是0时,先假定全是N(保证字典序最小),然后判定有无,无的话直接输出;有,就二进制枚举后面Y
阅读全文
摘要:满分做法: 几组样例充分说明,最优的子序列单调区间最多不超过两个。所以可以用树状数组维护三个值,一个是单增的最大值,一个是单减的最大值,一个是有拐点的最大值。最后离散化倒叙处理即可
阅读全文
摘要:满分做法: 由题,树是不需要染色的,所以我们要让所有的连通块变成树。所有联通块的总点数 是 n,所以如果设联通块数为 C,则最后剩下的边个数就是 n − C,因此答案就是 m − n + C。
阅读全文
摘要:满分做法: 在第一棵树中确定编号的dfs序,遍历第二棵树时,用树状数组维护在第一棵树相对位置,查询某点的贡献时,统计有多少比他高的就行了。注意要在子树后消除影响。
阅读全文
摘要:满分做法: 手画样例,发现输出的都是以k为根的叶子节点。于是我们按照以下步骤去操作即可: 1.先按以k为根,进行dfs处理。 2.按照节点深度及编号对节点排序,深度越大排序越靠前,深度相同时,编号小的排在前面。 3.依次处理每个节点 ,每次向上蹦,如果碰到以走过的节点或根节点就停止,记录走过的步数。
阅读全文
摘要:60分做法:直接暴力背包 满分做法: 按照K的因数进行背包即可
阅读全文
摘要:满分做法: 对于一条链的情况,我们可以隔一个走一个,最后再走回来,如下: 那对于树来说,我们可以直接扩展:如 果当前节点深度是奇数,那么我们在 DFS 前输出这个点,否则在 DFS 完所有孩子之 后再输出这个点。自己手画一下,感觉很对!!!
阅读全文
摘要:满分做法: 这个状态是我见到过最奇怪的,$f[i][j][l][r]$表示在区间$[i,j]$中取出一些数后,剩下的数值在$[l,r]$范围内的最小代价。因为$w[i] include include include include include include using namespace s
阅读全文
摘要:满分做法: 有一个专门解决这类问题的算法叫:GarsiaWachs算法。 算法流程:1.从序列开头往后找第一个位置$i$满足$a[i]=a[i]+a[i+1]$,并把合并的值插入到$j$后面。 这样复杂度就降到了$n²$,用vector就可以达到$nlogn$了。(可以用平衡树优化,但我不会┭┮﹏┭
阅读全文
摘要:满分做法: 本题直接搜索即可,因为要记录最优值,直接spfa就好了。
阅读全文
摘要:这个题好像没什么难度,就是需要耐心调解。 注意事项:1.在加值时, 11要+10,在减值时, 11要 10。 2.判断类型要从分值从大到小判,要先判特殊牌,再判有头牌。 3.在判断是否有头时,也要判断J,K,Q。 4.注意本题是四舍五入。
阅读全文
摘要:满分做法: $dp[i][j][k][1/2]$表示到a串的第i位置为止使用了$k$个子串匹配到b串的前j个且当前i位置选还是没选的方案数,因为当前只和$i 1$有关,所以第一维可以滚动。 考虑转移当$a[i]==b[j]$时,$dp[val][j][k][0]=(dp[val^1][j][k][0
阅读全文
摘要:满分做法: 因为每个数都小于$10^{18}$,因此每个数最多有$64$位,因此如果有超过$128$个非零数字,那么必定有一位在$3$个及以上个数的二进制表示下为$1$,所以最小环大小为$3$。 当n include include include include include using nam
阅读全文
摘要:满分做法: 把人向床连边进行二分图匹配即可。 cpp include include include include include include using namespace std; typedef long long ll; const int maxm=5555; int t,n,ans
阅读全文
摘要:满分做法: 由题:s[u] include include include include include using namespace std; typedef long long ll; const int maxm=1e5+7; int n; ll ans; int f[maxm]; ll
阅读全文
摘要:1.$ 128$的补码是$10000000$,$ 1$的补码是$11111111$。 2.属于TCP拥塞控制算法有:慢启动,拥塞避免,快速重传。 3.同时查找$2n$个数中的最大值和最小值,最少比较次数为$3n 2$; 前两个数比较,大的为最大值, 小的为最小值, 用掉一次比较后面$2 (n 1)$
阅读全文
摘要:满分做法: $dp[i][j][k]$表示在区间$[i j]$加上一段长度为$k$,且数字和$a[i]$相同的序列,要消除这整个序列所需要的最小操作次数。 1.普通情况:我们可以在当前状态继续在前面加一个与$a[i]$相同的数即:$dp[i][j][k]=dp[i][j][k+1]+1$。 (1):
阅读全文
摘要:50分做法: 可以发现答案具有单调性,所以二分答案。判断是否可行就需要DP。dp[i]表示到第i个格能得的最大值,从能跳向它的格进行转移即可。 满分做法: 50分做法的转移是O($n\sqrt{n}$)的,如何更快的转移呢?因为随着格的转移,能被跳到的区间也在转移,而且他一定是从这个区间中的最大值转
阅读全文
摘要:满分做法: 枚举每个边作为生成树的最小边,再进行最小生成树求出最大边,做差比较即可。 cpp include include include include include using namespace std; typedef long long ll; const int maxm=20007
阅读全文
摘要:满分做法: 由题,0和1的交界处把0,1分成两个矩阵,满足杨氏矩阵的性质,可以用钩子公式解决。对于给定形状,不同的杨氏矩阵的个数为:n!除以每个格子的钩子长度加1的积。其中钩子长度定义为该格子右边的格子数和它上边的格子数之和。 因为可以分开算,由打表可知一段的方案数就是长度的卡特兰数。 钩子公式 c
阅读全文
摘要:满分做法: 这道题蛮难想的,$dp[i]$表示到i位置的最大操作数,$11111101$和$1011111$这两种情况我们可求出它的最大操作数为长度$ 2$,并发现整个序列的操作数可以拆分成几个小序列的最大操作做次数之和。 所以我们要记录$l[i]$表示左边离$i$最近的$0$的位置,并得出转移:
阅读全文
摘要:正睿OJ 石子 满分做法: 本题应用了期望的线性性:E(x+y)= E(x)+ E(y)。取走第一堆石子期望其实就是它之前的石堆数+1。这时我们的问题就转化为求取走第一堆之前的期望长度。 令Pi表示第 i 堆石子在第 1 堆之前被取走的概率,因为它只跟第一堆的相对位置有关,所以它的值就是为$\fra
阅读全文
摘要:满分做法: 按照结束时间从小到大排序,一个一个进行处理。遇到当前时间+处理时间 结束时间的建筑时,把这个建筑和之前修理过的建筑中处理时间最大的进行比较。 如果当前处理时间小于最大值,那么可以进行替换,使当前时间变小,否则就放弃此建筑。剩下的就是直接加进来就可以了。 cpp include inclu
阅读全文
摘要:满分做法: 题目概述:连通块联通的最小代价。但本题要求选过的点不能再选,所以要选$2 (tot 1)$个点($tot$为连通块个数),这波选点就需要贪心了。 首先在每个连通块中选出最小权值的点,并把剩下的点全部加到队列里排序,再选出$tot 2$个点即可。判$impossible$就是剩下的够不够$
阅读全文
摘要:因为第$i$个数最终所在的位置,只与$i$之前所去掉的个有关与具体去掉哪些数无关,所以具有无后效性,可以DP。 方法一:$dp[i][j]$表示到i位置留j个数的匹配值。 当$a[i]=j$时,$dp[i][j]=max(dp[i][j],dp[i 1][j 1]+1)$; 当$a[i]\neq j
阅读全文
摘要:满分做法: 用$dp[i][j]$表示到$i$位置分为$j$段的最大值,区间dp通常枚举断点,所以预处理$sum[i][j]$表示区间$[i,j]$的单词数。 本题还用了string类型的小技巧,推荐做一下。 cpp include include include include include i
阅读全文
摘要:70分做法: 全排列,再枚举这个点由那个点扩展出来的即可。 cpp include include include include include include include using namespace std; typedef long long ll; const int maxm=20
阅读全文
摘要:两种方法 1.Kruskal算法(解决疏松图) 7.最小生成树计数 做法:应用最小生成树的两条性质: 1.不同的最小生成树中,每种权值的边出现的个数是确定的 2.不同的生成树中,某一种权值的边连接完成后,形成的联通块状态是一样的 此时需要记录所有的边权种类,最小生成树需要的种类边权个数,暴力二进制枚
阅读全文
摘要:介绍几种贪心题型 1.选择不相交区间: 按照结束时间从大到小排序,如果区间左端点大于当前最右点就选,否则不选。 例题:活动安排: 2.区间选点问题: 按照区间的结束位置从大到小排序。对于当前区间如果选的点不够,就尽量在区间末尾选点。 例题:种树 3.区间覆盖问题: 将闭区间按照左端点从小到大排序。对
阅读全文
摘要:感觉这个题没什么好说的。 对于树的情况直接从1开始搜(保证字典序最小),从大到小排序它的子节点,再接着搜。 对于基环树,直接$n^2$暴力删边即可,用$vector$存边,排序预处理,枚举边,给边两侧的点打上标记,在搜到他们俩时直接continue就行,剩下的和树一样 cpp include inc
阅读全文
摘要:60分做法: 暴力枚举两个没被覆盖点,形成一个合法的抛物线,在扫一遍能在抛物线上的点,打上标记即可。 cpp include include include include include include using namespace std; int t; int n,m,U,w; double
阅读全文
摘要:逛公园 题意:在一张有向图中,求出1到n有多少条路径长度不超过最短路+K。 30分做法:K=0时,就是最短路计数,详见P1144 "最短路计数" cpp include include include include include include include using namespace s
阅读全文
摘要:肝了一个下午,终于把这个绝世好题写完了(滑稽) 满分做法: 看到题目求最短时间,说明更高的时间也可以控制,满足答案单调性,可以二分;(技巧) 看到这些比较复杂的题目,一定要滤清自己该干什么,不要慌!!! 显然一个军队最后停留的节点深度越小,它控制的叶子结点越多。所以我们尽量让军队往上走,如果过程中它
阅读全文
摘要:30分做法: dp[i]表示青蛙跳到位置i经过的最小石子数,从dp[i-j]转移过里,s<=j<=t。初始状态:dp[0]=0; 最后统计答案是从[n,n+t)区间中找出最小dp值。(n+t青蛙跳不到,所以开区间) 满分做法: 观察数据范围l<=1e9,这么大数组肯定存不下来,所以考虑路径压缩。因为
阅读全文

浙公网安备 33010602011771号