03 2022 档案
摘要:读完题目之后思路就出来了 但是不敢下手怕时间过不去1e7感觉好大 就是类似埃筛的方法将1e7以内该跳过的数都筛出来 加入在set里面 最后查询的话直接log就可以了 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(
阅读全文
摘要:还是一道很好的树形dp 但是我写了好久 一直改来改去的 还是对树形dp不是很熟练 不过还好最后A了 很容易想到dp[i,1/2/3] 表示 以i为根节点的染色方案数 1/2/3表示根节点染的颜色 转移方程: dp[u][3]=dp[u][3]*(dp[to][1]+dp[to][2])%mod; d
阅读全文
摘要:非常好的一道树形dp 我开始一直陷入了思维误区 认为最优解可能不但是从子树转移过来还可能是从父亲转移过来的 这就非常头疼了 转移方程不好写啊 但实际上直接从下向上转移就好 为什么 因为最优解 保证一定存在一个节点 最优解为该节点最大子树和次大子树之和 最为极端的情况就是 最优解那个节点只有一个子树
阅读全文
摘要:二叉树这个数据结构不会写 但是用数组还是能够写出来 这个题最坑点是最后那个判断是否为完全二叉树 我开始一直把完全二叉树的概念搞错了 导致一直wa 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x)
阅读全文
摘要:非常好的一道dp题目!!!! 首先对于普通物品和b-a<=p的魔法物品 直接用a值卖掉就好 卖完之后我们手头有val的钱 分两种情况: 1.假如此时val>=p 那么剩下的魔法物品都可以卖了,因为保证买完一个魔法物品钱一定任大于p 2.假如此时val<p 我们就要先卖魔法物品的a值(因为不够买卷轴)
阅读全文
摘要:假如是有重复元素的全排列怎么办呢? 在dfs枚举每个位置的时候 加一个判断条件 如果这个位置上枚举的数字以前这个位置用过 那就跳过 点击查看代码 //有重复的全排列 #include<cstdio> #include<algorithm> using namespace std; const int
阅读全文
摘要:很容易想到用叉积来表示面积 但是数据范围不允许n立方的复杂度 考虑固定了一个点,怎么取另外两个点使得面积最小 发现一定是围成多边形相临的两个点 考虑用极角排序 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x)
阅读全文
摘要:不得不吐槽一下出题人的数据真水 开始我的做法完全错了 但是居然能过19分 开始我想拓扑排序 但发现只需要bfs走一遍就好 这个时候我还用的dp 肯定是不对的 同一个点可能会入队多次 而且dp值会被加多次 实际上就是直接bfs到底就好 遍历每条路径 但是最后一个 点tle 为啥呢? 这种情况下4——>
阅读全文
摘要:比赛的时候没有把题目读清楚 导致这么简单的一道拓扑排序没做 属实有点遗憾 跑一遍拓扑排序 最后统计每个任务如果有没法执行的就impossible 否则就输出所有任务花费时间最长的那个 点击查看代码 #include<bits/stdc++.h> using namespace std; #defin
阅读全文
摘要:很简单的一道dp dp[i,j]表示区间[i,j]最少次数变为回文串 初始状态dp[i,i]=0单个字符就是回文串 转移 区间从小到大进行转移 如果s[i]==s[j] 那dp[i,j]=dp[i-1,j-1] 如果s[i]!=s[j] 那dp[i,j]=max(dp[i-1,j],dp[i,j-1
阅读全文
摘要:就是一道正反两边求lis(最长子序列问题) 吐槽 出题人是个瓜皮 题目上说了保证输出的unique 结果根本就没保证 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll lon
阅读全文
摘要:这个题纯属把我逗乐了 首先分析暴力比较肯定不行,那咋办 这个问题的难点就在于每次比较有多个数,很难搞 于是我们就把多个数压缩成一个值就好了 这个题为啥把我逗乐了 因为我想的是把每个碎片的数平方再加到一起 压缩成一个值 好巧不巧的是 刚好样例就可以hack掉这个压缩 看来出题人是想过这个问题的 那我就
阅读全文
摘要:一道转移类型的树形dp 考虑u点作为集合地点,不方便度为f,如果换做v点(v为u的一个儿子),不方便度会怎么变化 pre[u]表示在u点上方的点值之和,sum[u]表示u点子树点值之和 如果换做v点 f+(pre[u]+sum[u]-sum[v])*w-sum[v]*w pre[u]+sum[u]-
阅读全文
摘要:点击查看代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 110; int dp[N][N]; int f[N][N]; in
阅读全文
摘要:别小看这个题,通过率很低的,比赛的时候我改了好多次最后才改出来 考虑什么时候两者的最短路径是唯一的 一:两者刚好在对角线的时候 二:两者同列或者同行 对于第一种情况,如果缺点恰好在其对之间的对角线上(之外的对角线肯定不会造成影响),最短路就会改变+1 对于第二种情况,如果缺点刚好处于同列(行)之间,
阅读全文
摘要:这是一个很经典的树形dp 其实还是很有难度的 dp[u][0]表示u节点一定被自己点亮 dp[u][1]表示u节点一定被父亲点亮 dp[u][2]表示u节点一定被儿子点亮 注意这里的“一定”表示: 比如dp[u][1]表示一定u的父亲是亮的,但是不排除u是亮的或者u的儿子是亮的 尽管这里有个状态是d
阅读全文
摘要:很经典很好的一个树形dp 很明显dp[i][j]表示距离i在范围j以内的权值和 我们还很容易想到维护一个deep[i][j]数组 表示i的子树中距离i在范围j以内的权值和 这个题难就难在距离i在范围j以内的点可能是在i的上头 这时候转移方程就要考虑率容斥一下 对于(u,v)这条边 dp[u][kk]
阅读全文
摘要:分析 考虑多维的dp dp[a][b][c][d][k] 将矩形[a,b][c,d]表示划分k次得到的最大值 明显答案即为dp[1][1][8][8][k] 初始状态为dp[i][j][ii][jj][1]=矩阵和的平方 转移方程: 枚举i<=x<ii dp[i][j][ii][jj][k]=min
阅读全文
摘要:很明显的一道最大流匹配题目 唯一要注意的点是题目要求是一头牛只能搭配一个饮料和事物 所以要拆点 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll long long #def
阅读全文
摘要:首先考虑最短路,从1跑dj用现金,从n跑dj用旅行金,动态修改 因为只要求最少的现金,用multiset维护 有一个坑点,题目说的是一个现金换ai个旅行金,那就是只能换一个现金,不能再换多了 点击查看代码 #include <bits/stdc++.h> using namespace std; c
阅读全文
摘要:分析 一看就知道是个dp 很明显的转移方程: dp[i][j]+=dp[i-1][j-1]+dp[i-1][j]; 但是因为可能会有重复字符,导致两种不同的删除方法最后结果可能会是一样的 这个时候怎么办呢? 可以考虑转移方程再改一改条件,但是思来想去真的不好写 正面不好写那就反向写 考虑容斥,我们只
阅读全文
摘要:之前学二叉树的时候不认真,昨天遇到打比赛遇到一个二叉树的板子题,没做出来,所以就想重新巩固一下 不过还好进我们学校的ACM的校队了 考虑什么情况下前后序都定下来的时候,但中序没定 前序:根节点+左子树+右子树..........(1) 后序:左子树+右子树+根节点...........(2) 中序:
阅读全文
摘要:很容易想到树形dp 设dp[u]表示以u为根所形成的最大联通量 这样设的好处在于只用管理u的儿子到底选或是不选,不用考虑连通性! 转移: 设v为u的一个儿子 if(dp[to]+w>0) 只要大于零就能产生贡献,只要产生贡献就能选 #include<bits/stdc++.h> using name
阅读全文
摘要:题目大意: 一棵树,两个操作 操作一:将x->y路径的每个点的b值加上前一个点的a值 操作二:查询一个点的b值 首先很容易想到树链剖分+树上差分,难点就是细节的处理 对向上向下两个方向的边分别用树状数组维护 #include<bits/stdc++.h> #define LL long long #
阅读全文