Processing math: 100%

10 2019 档案

摘要:"题目" DP或者说是递推。 首先我们考虑一定要让吃饭慢的人排在前面,因为打饭的时间其实是固定的,所以首先要考虑吃饭慢的人先吃饭。然后再考虑两个窗口的问题。设置dp[i][j]为前i个人在1号窗口打饭时间为j时,所用的最小的结束时间。只需知道前i个人的打饭时间,即可推出前i个人在2号窗口打饭的时 阅读全文
posted @ 2019-10-31 18:14 DAGGGGGGGGGGGG 阅读(104) 评论(0) 推荐(0) 编辑
摘要:"题目" 第一问: 用广搜类似用floodfill的方法。 第二问: 暴力枚举加剪枝,对于每个连通块,枚举跟这个连通块相连的其他与他颜色不同的连通块,然后向外扩展合并颜色与他们俩相同的连通块。扩展合并颜色的时候需要在以每个连通块为节点的图上广搜,每次都将不在当前双色连通块内连通块且颜色和当前双色 阅读全文
posted @ 2019-10-31 08:22 DAGGGGGGGGGGGG 阅读(178) 评论(0) 推荐(0) 编辑
摘要:"题目" 二分+随机化贪心 首先我们有每次优先选择口小的人吃蛋糕的贪心策略。然后因为嘴巴的多少和填满嘴巴的困难程度存在单调关系,因此可以二分嘴巴的多少。而这个嘴巴个数为mid的时候,意味着我们需要满足前mid小的嘴巴都能被填满。判断能否填满时,可以用随机化贪心check。 此时贪心策略发生了变化 阅读全文
posted @ 2019-10-30 16:45 DAGGGGGGGGGGGG 阅读(266) 评论(0) 推荐(0) 编辑
摘要:"题目" 有可以直接找maxn[i][j][t](i,j)为左下角长度为t的正方形内的最大值。 然后可以有以下转移: $maxn[i][j][t] = Max(maxn[i + 1][j][t 1], maxn[i][j][t 1], maxn[i][j + 1][t 1], maxn[i 阅读全文
posted @ 2019-10-29 11:48 DAGGGGGGGGGGGG 阅读(144) 评论(0) 推荐(0) 编辑
摘要:"题目" DP 此题可以分为两个子问题。 m等于1: 原题目转化为求一行数列里的k块区间的和,区间可以为空的值。 直接定义状态dp[i][t]表示前i个数分为t块的最大值。 因为区间可以为空,所以最大值再小也不会比0小,所以初始化dp值为0。 有方程$dp[i][t]=max 阅读全文
posted @ 2019-10-28 21:36 DAGGGGGGGGGGGG 阅读(125) 评论(0) 推荐(0) 编辑
摘要:"题目" DP,直接递推比记忆化搜索简单。 定义状态dp[i][j]为前i行最后一个选择第i行第j个数所得到最大值。 易得状态转移方程 dp[i][j]=max(dp[i1][k]+a[i][j]) 这个题比较困难的就是在jk的枚举上。j要满足选j的时候一定要比i大, 阅读全文
posted @ 2019-10-27 21:15 DAGGGGGGGGGGGG 阅读(185) 评论(0) 推荐(0) 编辑
摘要:"题目" 双向链表+倍增+模拟。 70pts: 说白了此题的暴力就是细节较多的模拟题。 我们设离i城市最近的点的位置为B[i],第二近的位置为A[i]。设AB数组等于0的的情况不能接下去走到第二或第一近的位置。 1. 处理到底能不能继续向下走,即当前城市下一步无法选择城 阅读全文
posted @ 2019-10-27 16:37 DAGGGGGGGGGGGG 阅读(178) 评论(0) 推荐(0) 编辑
摘要:"题目" 树形DP,定义状态dp[i][j]i的子树保留j个节点,且i不连接父亲所需要删去的最小值。 初始化:dp[i][1]等于与i相连的边数,只需要保留一个节点且要和父亲断开,那只能是i这一个节点,其他跟i相连的节点都要断开。 有转移方程$dp[i][j]=min(dp 阅读全文
posted @ 2019-10-26 15:50 DAGGGGGGGGGGGG 阅读(170) 评论(0) 推荐(0) 编辑
摘要:竞赛中找环有许多种问题,判断是否有环,找到环上的点,找到环上的边等等。 而只需要找到环上相邻的两点,或者环上的一条边就可以解决这三个问题。 有向图中,可以用拓扑排序的方法,把将拓扑排序完后限制条件仍未被清零的点即在环上的点。 阅读全文
posted @ 2019-10-26 11:26 DAGGGGGGGGGGGG 阅读(2570) 评论(0) 推荐(0) 编辑
摘要:"题目" 数论,考虑原题给的公式,得出i%j=i(i/j)j) 原题求i=ni=1(k%i)=i=ni=1(ki(k/i))=kni=ni=1(i(k/i)) 因此原题转化成了快速求$\sum_{i=1}^{i=n 阅读全文
posted @ 2019-10-26 07:45 DAGGGGGGGGGGGG 阅读(140) 评论(0) 推荐(0) 编辑
摘要:"题目" 树形DP,首先考虑递归建图,类似于线段树的中序遍历。然后取状态dp[i][j]表示i点花费j时间所偷到的最多的画,有方程: dp[now][nwt]=max(dp[now][nwt],dp[lso][i]+dp[rso][nwtidata[now].t]); 注意三点: 阅读全文
posted @ 2019-10-25 21:42 DAGGGGGGGGGGGG 阅读(154) 评论(0) 推荐(0) 编辑
摘要:"题目" 区间dp。但是跟平常的区间dp不同的是,这个题仅仅只是运用了区间dp的通过小区间的信息更新大区间的信息,而没有运用枚举断点的区间dp一般思路。 这个题我们首先发现每个人在插入的时候一定插入到队伍的最前方或最后方,所以当要插入该数的时候,要比较的数是队伍的最前方或最后方,然后用加法原理。与其 阅读全文
posted @ 2019-10-25 08:39 DAGGGGGGGGGGGG 阅读(114) 评论(0) 推荐(0) 编辑
摘要:"寻宝" 模拟加优化,细节比较重要。 我们用ti[i]表示i这一层有楼梯的个数,然后我们把当前1号点的数据mod上ti[i],然后使该数不能等于0,就行了。 c++ include define int long long const int mod = 20123; using namespace 阅读全文
posted @ 2019-10-24 08:56 DAGGGGGGGGGGGG 阅读(130) 评论(0) 推荐(0) 编辑
摘要:"题目" 对于这种题目描述比较长的题,可以考虑简化题意。 简化后的题意: 给定一棵带边权无根树 在其直径上求出一段长度不超过s的路径F, 使得离路径距离最远的点到路径的距离最短。求最短距离。 根据题目范围,直接暴力floyd求多源最短路径。然后n2求出直径和直径端点。搜索求出直径上的点。然后再 阅读全文
posted @ 2019-10-23 19:54 DAGGGGGGGGGGGG 阅读(120) 评论(0) 推荐(0) 编辑
摘要:"题目" 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树。 根据题意父母先从C去A,再去B,或者反过来。 我们一定是要让A到B最大,也要让C到A和B的最小值最大。 AB最大一定就是直径了。 CA最大直接先求出任意一条直径的两个端点,必定一个是A、一个是B。然后枚举C,找到最大的$ 阅读全文
posted @ 2019-10-23 19:19 DAGGGGGGGGGGGG 阅读(159) 评论(0) 推荐(0) 编辑
摘要:"题目" 贪心+堆。 一般贪心题用到堆的时候都会存在一种反悔操作,因此这个题也不例外。 首先电缆一定是连接两个相邻的点的,这很好证明,其次一个点只能被一条电缆连接,所以我们通过选这个电缆,不选相邻电缆和选相邻电缆,不选这个电缆之间选择,然后添加反悔操作。 链表的存在是为了方便删除线段。用l,r分别表 阅读全文
posted @ 2019-10-23 17:27 DAGGGGGGGGGGGG 阅读(113) 评论(0) 推荐(0) 编辑
摘要:"题目" DP或者迭代加深搜索,比较考验递归的搜索。 题目第一问可以用迭代加深搜索限制层数。 第二问需要满足字典序最小,所以我们可以在搜索的时候把比当前答案字典序大的情况剪枝掉。 然后考虑怎么搜索,对于每一位我们都要先搜索出每一位所能到达的所有情况包括选或者选几个。 c++ include defi 阅读全文
posted @ 2019-10-23 10:55 DAGGGGGGGGGGGG 阅读(130) 评论(0) 推荐(0) 编辑
摘要:"题目" 搜索,注意判断特殊情况,并且区分开什么时候转弯什么时候停止。然后转弯的时候更是要注意是否会进入障碍。 阅读全文
posted @ 2019-10-22 20:08 DAGGGGGGGGGGGG 阅读(146) 评论(0) 推荐(0) 编辑
摘要:"题目" 此题数据范围小的话可以用区间DP,但是该题目的数据范围并不能用区间DP来求解,因此我们考虑优化DP。 每个数的生成一定是由这两个区间 考虑区间DP的弊端是并不知道每个数生成的区间是什么,所以需要枚举,而这枚举的时间就浪费了。因此考虑以区间信息为状态,在找到区间信息里比较好转移的状态 阅读全文
posted @ 2019-10-22 10:22 DAGGGGGGGGGGGG 阅读(170) 评论(0) 推荐(0) 编辑
摘要:"题目" 易得该题目中的nk具有单调性,满足二分的性质,因此该题目而已用二分来枚举n,然后对于每个n模拟出它所对应的k,然后注意注意代码细节,并且当当前k等于题目要求的k时,要分别向左和右二分,才能找出所有情况。 c++ include define N 3000011 阅读全文
posted @ 2019-10-21 19:44 DAGGGGGGGGGGGG 阅读(247) 评论(0) 推荐(0) 编辑
摘要:"题目" 二分加广搜 阅读全文
posted @ 2019-10-21 15:51 DAGGGGGGGGGGGG 阅读(156) 评论(0) 推荐(0) 编辑
摘要:"题目" 贪心 贪心思路是先找到每个节点的到最深处的路径,并找到最大值。然后最后答案要加上该最大值和所有路径权值的差。 c++ include define N 600101 define int long long using namespace std; int n, root, cnt, an 阅读全文
posted @ 2019-10-21 15:16 DAGGGGGGGGGGGG 阅读(70) 评论(0) 推荐(0) 编辑
摘要:"题目" DP, 用的dp[i][j]表示i之前的数选了j个得到的最大结果,然后状态转移方程应该是 $$if (j \% t == 0)~~dp[i][j] = max(dp[i][j], max(dp[i 1][j] S[i], dp[i 1][j 1] + S[i] + B[i]) 阅读全文
posted @ 2019-10-21 10:05 DAGGGGGGGGGGGG 阅读(116) 评论(0) 推荐(0) 编辑
摘要:"题目" DP,需要注意边界上的问题。 状态定义dp[i]为句子第i位去除字母的最小值,答案就是dp[len]。 易得状态转移方程为: dp[i]=min(dp[i1]+1,dp[l]+illen[j])l是保留第j个字符串的右端点,len[j]是第j个字符串的长度。 c+ 阅读全文
posted @ 2019-10-20 20:39 DAGGGGGGGGGGGG 阅读(149) 评论(0) 推荐(0) 编辑
摘要:"题目" 一道非常好的树形DP。 状态:dp[u][n]为u的子树选n个黑点所能得到的收益最大值。 则最终的结果就是dp[root][k],root可以为任何值,为了方便,使root=1 然后考虑怎么状态转移,状态转移一般要从方程和边界入手,考虑用背包的思想,得到方程: $$ dp[ 阅读全文
posted @ 2019-10-18 16:50 DAGGGGGGGGGGGG 阅读(238) 评论(1) 推荐(0) 编辑
摘要:"题目" 图论综合题。 首先我们需要求出所有在公共最短路上的边,可以用预处理出最短路长度,然后枚举每一条边,依次判断即可。然后把这些边建到一个新图里,跑DP就好了。 此题的关键就是求出在公共最短路上的边。 c++ include define N 7001011 using namespace st 阅读全文
posted @ 2019-10-18 15:46 DAGGGGGGGGGGGG 阅读(157) 评论(0) 推荐(0) 编辑
摘要:给定一个n,输出(a1+x)(a2+x)...(an+x)的多项式长度。 每一个字符(包括"a”、“x”、“("、")”、“+”,每一个指数的每一个数字,每一个下标 的每一个数字长度都为1。如π=n时,总长度为40。 对于这个题来说我们直接把a,x,(),+,数字,下标分类讨论一下,就能得到 阅读全文
posted @ 2019-10-17 21:28 DAGGGGGGGGGGGG 阅读(136) 评论(0) 推荐(0) 编辑
摘要:"题目" 区间DP,将maxn[i][j][k]表示为i到j区间内分为k个区间所得到的最大值,minn表示最小值。 然后可以得到状态转移方程: maxn[i][j][k]=max(maxn[i][j][k],maxn[i][l][k1](lj%10))。 然后判断一 阅读全文
posted @ 2019-10-16 15:52 DAGGGGGGGGGGGG 阅读(130) 评论(0) 推荐(0) 编辑
摘要:"题目" 搜索。并且通过题意所得到的信息先推出几个性质。 如果每个字母在开头的出现次数等于结尾的出现次数,则说明每个单词都有可能要成为起点。 而如果有字母在开头的出现次数比结尾的出现次数大,则只有以该字母为开头的单词才有机会成为起点,这样我们就可以只从他们开始dfs了。 阅读全文
posted @ 2019-10-15 14:18 DAGGGGGGGGGGGG 阅读(236) 评论(0) 推荐(0) 编辑
摘要:"题目" dp状态定义的好题,初看这个题其实并不好想到他的状态,但是可以根据状态的定义,需要满足最优子结构。还有比较重要的一点就是方便转移方程。 首先我们定义dp[i]表示前i个数所能得到的最多个数,发现并不好转移,因此我们考虑多加一维状态j表示前i个数选j个的最多个数。这样就可以得出状态转移方程了 阅读全文
posted @ 2019-10-14 10:53 DAGGGGGGGGGGGG 阅读(141) 评论(0) 推荐(0) 编辑
摘要:"题目" 一道入门的dp,首先要先看懂题目要求。 容易得出状态dp[i][j]定义为i时间疲劳度为j所得到的最大距离 有两个坑点,首先疲劳到0仍然可以继续疲劳。 有第一个方程: dp[i][0]=max(dp[i1][0],d[i][0]) 而如果要休息则一定要休息到疲劳值为0才可以停止。 阅读全文
posted @ 2019-10-13 09:53 DAGGGGGGGGGGGG 阅读(136) 评论(0) 推荐(0) 编辑
摘要:每个海面要么放要么不放,因此可以用二分图匹配, 考虑把同一行内的能互相看到的点放到一个行块里,同一列内能看到的点放到一个列块里,然后每一个行块都可以和该行块里所有海面的列块连边,选了这个行块,就必须选且只选择一个该行块里的一个海面对应的列块。 c++ include include include 阅读全文
posted @ 2019-10-11 17:14 DAGGGGGGGGGGGG 阅读(99) 评论(0) 推荐(0) 编辑
摘要:"题目" ) 二分好题 首先用二分找最小的绝对值差,对于每个a[i]都两个方向扫一遍,先都改成差满足的形式,然后再找a[k]等于0的情况,发现如果a[k]要变成0,则从他到左右两个方向上必会有两个连续的区间也随之变化, 然后我们有一点K, 使K点=0时,可以分别向左和右影响区间的值。并且影响之后的值 阅读全文
posted @ 2019-10-11 14:38 DAGGGGGGGGGGGG 阅读(129) 评论(0) 推荐(0) 编辑
摘要:n SAT 是给定多个条件,问是否有一个赋值方式使所有条件得到满足。 每个条件都有n个变量, 而2 SAT 是存在时间复杂度为O(nm)O(n+m)的做法(m是条件数)的算法的问题。 2 SAT往往是判断是否有方案使条件得到满足的一个算法。 建图: 求解2 SAT问题,需要转移到图上,对于 阅读全文
posted @ 2019-10-09 10:51 DAGGGGGGGGGGGG 阅读(242) 评论(0) 推荐(0) 编辑
摘要:"题目" 首先分析数据范围发现m很大,所以线性做法肯定不行,因此考虑倍增,即预处理出每个点跳1次后的位置。然后只用两个数组类似于快速幂,推出每个点跳m次后的位置。 预处理离每个点第k小的点,可以用长度为k的尺子尺取。 c++ include include include include inclu 阅读全文
posted @ 2019-10-08 18:19 DAGGGGGGGGGGGG 阅读(136) 评论(0) 推荐(0) 编辑
摘要:"题目" 该题目可以用辅助数组l[i], r[i]来指向以data[i]为最小值的左端点和右端点。然后最后枚举每个data[i]寻找每个data[i]的美丽值的最大值。 然后辅助数组可以用单调栈求出。 c++ include include include include include inclu 阅读全文
posted @ 2019-10-08 16:25 DAGGGGGGGGGGGG 阅读(116) 评论(0) 推荐(0) 编辑
摘要:"题目" 先判断是否有解,然后开两个栈,分别存进入递归时间复杂度为O(1)的变量,和时间复杂度为O(n)的变量,最后取最大值。 include using namespace std; int T; int tong[1000100]; stack s, s2; int main() { // fr 阅读全文
posted @ 2019-10-08 13:50 DAGGGGGGGGGGGG 阅读(174) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示