摘要: 很好的一道树形dp 具体哪些点选黑选白我们肯定是不知道的 但是题目最后要求的是求贡献 所以只要我们能算出贡献就好了 因为答案是线性的 简而言之就是 ∑每个边的贡献=总贡献 考虑一条边的贡献 边一侧的黑节点数另一侧的黑节点数边权+一侧的白节点数另一侧的白节点数边权 设dp[u,i]表示u子树选i个黑点 阅读全文
posted @ 2022-04-04 21:08 wzx_believer 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 这个题知道是最大流 但是比赛的时候就是不知道怎么建图 #include <bits/stdc++.h> using namespace std; const int N = 1500, M = 10010, INF = 1e9; int n, m, S, T; struct Edge { int t 阅读全文
posted @ 2022-04-04 18:03 wzx_believer 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 不消说 第一个问就是求最长不下降子序列 这个题的重点是第二个问 Dilworth定理:偏序集的最少反链划分数等于最长链的长度 简而言之就是要求最长上升子序列(严格上升的) 点击查看代码 #include<cstdio> #include<cstring> #include<algorithm> us 阅读全文
posted @ 2022-04-04 16:58 wzx_believer 阅读(66) 评论(0) 推荐(0) 编辑
摘要: 没啥说的枚举 这里用到stl里面的set 来保存每条直线的斜率和截距 点击查看代码 #include<bits/stdc++.h> using namespace std; struct point{ int x; //横坐标 int y; //纵坐标 }; int main(){ vector<p 阅读全文
posted @ 2022-04-04 16:16 wzx_believer 阅读(50) 评论(0) 推荐(0) 编辑
摘要: 今天WC的时候想起之前打比赛遇到一道挺有趣的题目 最后才做出来的 我们从上帝视角(就是站的很高很高)看士兵过河 每个士兵就好比是一个蚂蚁 两个蚂蚁相遇分别转向 就好比是两个蚂蚁一直直线行走 这样一个蚂蚁的时间就很好算 我们就能算出 所有蚂蚁的时间 但是a蚂蚁算出来的时间不一定是a蚂蚁走出河岸的时间 阅读全文
posted @ 2022-04-04 12:46 wzx_believer 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 首先要把题目分析清楚 假如每个点作为根节点 所有叶节点到该根节点的路径权值和 除以 以该节点为根节点的叶节点个数 这个除以操作很烦 我们想办法先去掉 (一般这种除以什么的都要先乘上 最后再除) 所以我们先不考虑除以这个操作,因为以该节点为根节点的叶节点个数我们单独维护还是很好维护的-->cnt[]数 阅读全文
posted @ 2022-04-03 13:46 wzx_believer 阅读(20) 评论(0) 推荐(0) 编辑
摘要: 首先第一个是非常不划算的 所以我们想办法先将没有前缀的前放进去 第二就是第三的特殊情况 有公共后缀的一定是连在一起的 几堆不同公共后缀的 一定是先排数量小的一堆 因为这样对后面几堆产生的贡献最小 最后说白了就是先按照sz排序 最后按照dfs序走一遍dfs统计答案就好 #include<cstdio> 阅读全文
posted @ 2022-04-02 18:05 wzx_believer 阅读(19) 评论(0) 推荐(0) 编辑
摘要: 和之前那个题目很像 https://www.cnblogs.com/wzxbeliever/p/16087337.html 我想的是 先建立字典树 依次判断每个字符串 对于同一深度 只要满足该字符比其他字符前面就好 到这里都是没问题的 我开始想的是每层依次判断26个字母满不满足 于是开心的提交了 发 阅读全文
posted @ 2022-04-02 12:30 wzx_believer 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 非常好的一道题!!!! 字典树上的dp题目 首先建立字典树 开始我理解错了 以为只要树上的1是连续的就满足 于是就打了个56分 树上的最大连续和 出题人还是比较好 这样的情况都有56分 实际情况是 就是从高到低再到高这个情况 问题很明显就变成了维护最大值和次大值(更新最大值的时候一定要先更新次大值) 阅读全文
posted @ 2022-04-01 17:36 wzx_believer 阅读(47) 评论(0) 推荐(0) 编辑
摘要: 这个题好难 真的好难 对拓扑排序不是很熟练 但是能明显感觉到强烈的先后顺序 但是就是建不了边 因为这个题要求最后的目标顺序 那我们就按照他的目标顺序进行插入字典树 这样的好处就是 已经在字典树里面同层的点一定是要在现在插入点前面出现的 前缀这个点太容易忽略了 不过题目还算良心 只有两个点有前缀 要是 阅读全文
posted @ 2022-04-01 15:47 wzx_believer 阅读(43) 评论(0) 推荐(0) 编辑
摘要: 字典树很好的一道题 这个题区别于一般的字典树前缀匹配在于 匹配的字符串可能比字典树上的长 也可能比字典树上的短 如果只是维护一个节点会被经过多少次肯定是没法解的 考虑再维护一个endd数组 表示以i节点为结尾的字符串数量 在查找的时候 比匹配字符串短的节点直接+endd数组即可 经过节点数sum就不 阅读全文
posted @ 2022-04-01 10:52 wzx_believer 阅读(42) 评论(0) 推荐(0) 编辑
摘要: 读完题目之后思路就出来了 但是不敢下手怕时间过不去1e7感觉好大 就是类似埃筛的方法将1e7以内该跳过的数都筛出来 加入在set里面 最后查询的话直接log就可以了 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit( 阅读全文
posted @ 2022-03-31 20:10 wzx_believer 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 还是一道很好的树形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 阅读全文
posted @ 2022-03-31 15:39 wzx_believer 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 非常好的一道树形dp 我开始一直陷入了思维误区 认为最优解可能不但是从子树转移过来还可能是从父亲转移过来的 这就非常头疼了 转移方程不好写啊 但实际上直接从下向上转移就好 为什么 因为最优解 保证一定存在一个节点 最优解为该节点最大子树和次大子树之和 最为极端的情况就是 最优解那个节点只有一个子树 阅读全文
posted @ 2022-03-31 12:18 wzx_believer 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 二叉树这个数据结构不会写 但是用数组还是能够写出来 这个题最坑点是最后那个判断是否为完全二叉树 我开始一直把完全二叉树的概念搞错了 导致一直wa 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) 阅读全文
posted @ 2022-03-30 21:29 wzx_believer 阅读(24) 评论(0) 推荐(0) 编辑
摘要: 非常好的一道dp题目!!!! 首先对于普通物品和b-a<=p的魔法物品 直接用a值卖掉就好 卖完之后我们手头有val的钱 分两种情况: 1.假如此时val>=p 那么剩下的魔法物品都可以卖了,因为保证买完一个魔法物品钱一定任大于p 2.假如此时val<p 我们就要先卖魔法物品的a值(因为不够买卷轴) 阅读全文
posted @ 2022-03-30 18:19 wzx_believer 阅读(65) 评论(0) 推荐(0) 编辑
摘要: 假如是有重复元素的全排列怎么办呢? 在dfs枚举每个位置的时候 加一个判断条件 如果这个位置上枚举的数字以前这个位置用过 那就跳过 点击查看代码 //有重复的全排列 #include<cstdio> #include<algorithm> using namespace std; const int 阅读全文
posted @ 2022-03-30 10:16 wzx_believer 阅读(27) 评论(0) 推荐(0) 编辑
摘要: 很容易想到用叉积来表示面积 但是数据范围不允许n立方的复杂度 考虑固定了一个点,怎么取另外两个点使得面积最小 发现一定是围成多边形相临的两个点 考虑用极角排序 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) 阅读全文
posted @ 2022-03-29 21:04 wzx_believer 阅读(41) 评论(0) 推荐(0) 编辑
摘要: 不得不吐槽一下出题人的数据真水 开始我的做法完全错了 但是居然能过19分 开始我想拓扑排序 但发现只需要bfs走一遍就好 这个时候我还用的dp 肯定是不对的 同一个点可能会入队多次 而且dp值会被加多次 实际上就是直接bfs到底就好 遍历每条路径 但是最后一个 点tle 为啥呢? 这种情况下4——> 阅读全文
posted @ 2022-03-29 19:36 wzx_believer 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 比赛的时候没有把题目读清楚 导致这么简单的一道拓扑排序没做 属实有点遗憾 跑一遍拓扑排序 最后统计每个任务如果有没法执行的就impossible 否则就输出所有任务花费时间最长的那个 点击查看代码 #include<bits/stdc++.h> using namespace std; #defin 阅读全文
posted @ 2022-03-29 16:17 wzx_believer 阅读(54) 评论(0) 推荐(0) 编辑
摘要: 很简单的一道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 阅读全文
posted @ 2022-03-29 09:27 wzx_believer 阅读(84) 评论(0) 推荐(0) 编辑
摘要: 就是一道正反两边求lis(最长子序列问题) 吐槽 出题人是个瓜皮 题目上说了保证输出的unique 结果根本就没保证 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll lon 阅读全文
posted @ 2022-03-28 20:34 wzx_believer 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 这个题纯属把我逗乐了 首先分析暴力比较肯定不行,那咋办 这个问题的难点就在于每次比较有多个数,很难搞 于是我们就把多个数压缩成一个值就好了 这个题为啥把我逗乐了 因为我想的是把每个碎片的数平方再加到一起 压缩成一个值 好巧不巧的是 刚好样例就可以hack掉这个压缩 看来出题人是想过这个问题的 那我就 阅读全文
posted @ 2022-03-28 16:05 wzx_believer 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 一道转移类型的树形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]- 阅读全文
posted @ 2022-03-28 15:20 wzx_believer 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 点击查看代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 110; int dp[N][N]; int f[N][N]; in 阅读全文
posted @ 2022-03-27 15:47 wzx_believer 阅读(27) 评论(0) 推荐(0) 编辑
摘要: 别小看这个题,通过率很低的,比赛的时候我改了好多次最后才改出来 考虑什么时候两者的最短路径是唯一的 一:两者刚好在对角线的时候 二:两者同列或者同行 对于第一种情况,如果缺点恰好在其对之间的对角线上(之外的对角线肯定不会造成影响),最短路就会改变+1 对于第二种情况,如果缺点刚好处于同列(行)之间, 阅读全文
posted @ 2022-03-27 13:50 wzx_believer 阅读(26) 评论(0) 推荐(0) 编辑
摘要: 这是一个很经典的树形dp 其实还是很有难度的 dp[u][0]表示u节点一定被自己点亮 dp[u][1]表示u节点一定被父亲点亮 dp[u][2]表示u节点一定被儿子点亮 注意这里的“一定”表示: 比如dp[u][1]表示一定u的父亲是亮的,但是不排除u是亮的或者u的儿子是亮的 尽管这里有个状态是d 阅读全文
posted @ 2022-03-27 11:18 wzx_believer 阅读(34) 评论(0) 推荐(0) 编辑
摘要: 很经典很好的一个树形dp 很明显dp[i][j]表示距离i在范围j以内的权值和 我们还很容易想到维护一个deep[i][j]数组 表示i的子树中距离i在范围j以内的权值和 这个题难就难在距离i在范围j以内的点可能是在i的上头 这时候转移方程就要考虑率容斥一下 对于(u,v)这条边 dp[u][kk] 阅读全文
posted @ 2022-03-25 15:27 wzx_believer 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 分析 考虑多维的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 阅读全文
posted @ 2022-03-24 18:14 wzx_believer 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 很明显的一道最大流匹配题目 唯一要注意的点是题目要求是一头牛只能搭配一个饮料和事物 所以要拆点 点击查看代码 #include<bits/stdc++.h> using namespace std; #define lowbit(x) x&(-x) #define ll long long #def 阅读全文
posted @ 2022-03-23 15:58 wzx_believer 阅读(23) 评论(0) 推荐(0) 编辑
摘要: 首先考虑最短路,从1跑dj用现金,从n跑dj用旅行金,动态修改 因为只要求最少的现金,用multiset维护 有一个坑点,题目说的是一个现金换ai个旅行金,那就是只能换一个现金,不能再换多了 点击查看代码 #include <bits/stdc++.h> using namespace std; c 阅读全文
posted @ 2022-03-22 17:55 wzx_believer 阅读(76) 评论(0) 推荐(0) 编辑
摘要: 分析 一看就知道是个dp 很明显的转移方程: dp[i][j]+=dp[i-1][j-1]+dp[i-1][j]; 但是因为可能会有重复字符,导致两种不同的删除方法最后结果可能会是一样的 这个时候怎么办呢? 可以考虑转移方程再改一改条件,但是思来想去真的不好写 正面不好写那就反向写 考虑容斥,我们只 阅读全文
posted @ 2022-03-22 11:00 wzx_believer 阅读(84) 评论(0) 推荐(0) 编辑
摘要: 之前学二叉树的时候不认真,昨天遇到打比赛遇到一个二叉树的板子题,没做出来,所以就想重新巩固一下 不过还好进我们学校的ACM的校队了 考虑什么情况下前后序都定下来的时候,但中序没定 前序:根节点+左子树+右子树..........(1) 后序:左子树+右子树+根节点...........(2) 中序: 阅读全文
posted @ 2022-03-20 21:08 wzx_believer 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 很容易想到树形dp 设dp[u]表示以u为根所形成的最大联通量 这样设的好处在于只用管理u的儿子到底选或是不选,不用考虑连通性! 转移: 设v为u的一个儿子 if(dp[to]+w>0) 只要大于零就能产生贡献,只要产生贡献就能选 #include<bits/stdc++.h> using name 阅读全文
posted @ 2022-03-09 17:40 wzx_believer 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 题目大意: 一棵树,两个操作 操作一:将x->y路径的每个点的b值加上前一个点的a值 操作二:查询一个点的b值 首先很容易想到树链剖分+树上差分,难点就是细节的处理 对向上向下两个方向的边分别用树状数组维护 #include<bits/stdc++.h> #define LL long long # 阅读全文
posted @ 2022-03-07 17:09 wzx_believer 阅读(32) 评论(0) 推荐(0) 编辑
摘要: 扫描线的过程不做多述 主要讲解代码实现,没有深刻理解是无法完全打出来的 首先离散化X坐标,因为我们要用线段树进行维护,x坐标过大,数组范围是不允许的 再考虑线段树怎么维护 假如维护k[1,3] >两个子节点k1[1,2],k2[3,3] 假如k1的len=X[2]-X[1] 那k2的len=X[3] 阅读全文
posted @ 2022-02-28 21:22 wzx_believer 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 简化题目: 静态维护,离线询问区间种类数 考虑运用树状数组,对每组询问r从小到大排序,依次不断更新前缀 如果该种颜色已经出现过,就在上一次出现的位置-1 然后对该位置+1,将该颜色上次出现的位置更新为该位置 #include<iostream> #include<cstdio> #include<a 阅读全文
posted @ 2022-02-26 17:20 wzx_believer 阅读(28) 评论(0) 推荐(0) 编辑
摘要: 分析:数据比较小,可以用dfs,但是用这个方法怪难受的,重复步骤太多了 考虑先找到边界上能出边界的点集E,将所有的边反向,E能走到的点即为能走出边界的点 分析:又是一道搜索题,用string来表示出每个状态,记录每个状态的0点,深搜四种跳法,环状取模就好 分析:很明显的一道递归题 考虑当前位置分别放 阅读全文
posted @ 2022-02-22 15:22 wzx_believer 阅读(31) 评论(0) 推荐(0) 编辑
摘要: ![](https://cdn.luogu.com.cn/upload/image_hosting/j3y0yb4c.png) ![](https://cdn.luogu.com.cn/upload/image_hosting/jgjm0wra.png) ![](https://cdn.luogu. 阅读全文
posted @ 2022-01-24 23:23 wzx_believer 阅读(67) 评论(0) 推荐(0) 编辑
摘要: 一道简单的送分题,记得最后约分即可 电脑上肯定能知道2000.12.31是星期天,再计算两者之间的天数(判断闰年) 这题开始就有些技巧了 考虑0是怎么来的:2×5 所以计算所有数2的因数和5的因数取最小的即可 这题把我难住了,我一直再考虑究竟怎么排序的 但这个排序是肯定没规律的 换个想法,因为他只要 阅读全文
posted @ 2022-01-23 12:23 wzx_believer 阅读(51) 评论(0) 推荐(0) 编辑