03 2020 档案

摘要:根据数据范围,可以看出能够看出可以构建三维dp状态为前i个分为k段当前是j色,之后按情况更新 #include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #define ull uns 阅读全文
posted @ 2020-03-31 21:43 朝暮不思 阅读(182) 评论(0) 推荐(0)
摘要:对于这种题肯定想到的是前缀和,但是有个问题是我们发现每个星星的颜色不一定一样,这样就多出一个变量不好控制 因此我们想到dp状态 f[k][i][j]表示能量为k的星星的前缀和,这样就方便维护了。因为我们发现星星的能量不超过10 #include<iostream> #include<cstring> 阅读全文
posted @ 2020-03-31 16:52 朝暮不思 阅读(262) 评论(0) 推荐(0)
摘要:这道题有点味道,类似二维前缀和的思想,我们发现行列可以分开求互不影响,所以考虑两个数组代表行列,然后分别求二维前缀,用二维前缀和的方式来求取前面矩阵的里面的行或列的总数 再询问的时候,用类似二维前缀和的方式求取,但是这里的公式与普通二维前缀和不一样。因为我们这个是满足条件的情况 所以如果是边界与边界 阅读全文
posted @ 2020-03-31 16:13 朝暮不思 阅读(150) 评论(0) 推荐(0)
摘要:看数据,很容易想到设计状态f[i][0/1]表示该位是否反转的最大值,第一次看题的时候看成每个字符都要单调递增,其实是每次字符串的字典序要单调递增。 #include<iostream> #include<cstring> #include<cstdio> #include<map> #includ 阅读全文
posted @ 2020-03-30 22:34 朝暮不思 阅读(161) 评论(0) 推荐(0)
摘要:简单dp,设计状态为前i个数取j组的最大值 #include<iostream> #include<cstring> #include<cstdio> #include<map> #include<algorithm> #define ull unsigned long long using nam 阅读全文
posted @ 2020-03-30 21:29 朝暮不思 阅读(112) 评论(0) 推荐(0)
摘要:学到了一手二维哈希,以前只会一维度,就是通过类似前缀和的思想来做 #include<bits/stdc++.h> #define ull unsigned long long using namespace std; typedef long long ll; const int N=555; co 阅读全文
posted @ 2020-03-30 17:10 朝暮不思 阅读(152) 评论(0) 推荐(0)
摘要:这道题只要求出点集的直径,答案就是直径的上取整一半 #include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> #include<cstring> #include<queue> 阅读全文
posted @ 2020-03-28 19:30 朝暮不思 阅读(114) 评论(0) 推荐(0)
摘要:一道线段树染色,但是这里是桶,我犯了经验主义以为是覆盖问题 数据不大,用二进制表示即可 #include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> using namespace 阅读全文
posted @ 2020-03-28 16:49 朝暮不思 阅读(231) 评论(0) 推荐(0)
摘要:这道题有着贪心的性质在里面,首先我们观察题目的变量,可以想到设计dp表示以该节点为根节点的子树的最小次数是多少 但是这样是不够的。我们继续观察,发现这道题虽然叶子节点必须染色,但是染色的顺序是不定的,所以我们可以先找到哪种情况是最小的。 因此定义dp[u][1]和dp[u][2]分别表示已被染色的子 阅读全文
posted @ 2020-03-28 16:04 朝暮不思 阅读(179) 评论(0) 推荐(0)
摘要:这道题能看的出可以离线查询,不难想到莫队,但是寻常莫队每个询问只有一段,这样只需要排序即可 这里有两段,如果只按一段排序,那么复杂度显然得不到保证,以后不知道后面一段怎么样。 因此这里提出了一个想法就是,如果有多段,那么可以通过容斥原理来解决这个问题,把他变成多个询问的加减,这样复杂度就ok了 我们 阅读全文
posted @ 2020-03-28 10:23 朝暮不思 阅读(130) 评论(0) 推荐(0)
摘要:这道题与HDU4858 项目管理一样,都是分为轻重点,因为这样只会最多遍历sqrt条边,但是这题需要合并重边,不然复杂度会走样 分块的思想真的很强大。对于轻点来说,暴力遍历更新答案和重信息,而对于重点来说,只需要更新相邻重点。这样做是正确的是因为重点的信息都会由轻点和重点更新,而轻点是暴力,肯定正确 阅读全文
posted @ 2020-03-26 16:51 朝暮不思 阅读(188) 评论(0) 推荐(0)
摘要:如果这道题没有一个限制,那么就是一道树状数组+dfs序的裸题 第一个请求或许会带来困惑,导致想要动态建树,如果真的动态修改树,那么dfs序必定会改变,很难维护,并且数据很大,暴力应该会T 所以不妨先把全部的节点建好,这样只需要求一次dfs序,而对于第一种操作 我们只需要再那个位置减去在他之前的dfs 阅读全文
posted @ 2020-03-25 22:41 朝暮不思 阅读(236) 评论(0) 推荐(0)
摘要:观察数据范围和题目意思,不难想到用莫队算法,之后暴力查询即可 #include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<map> using namespac 阅读全文
posted @ 2020-03-25 16:40 朝暮不思 阅读(190) 评论(0) 推荐(0)
摘要:从数据范围不难推出可以用f[][][][],表示由两个字符串来表示的最长大小 并且因为是回文串,所以我们要向头尾加字符,来变大,因为这个是回文子串,也就是连续的一段。 #include<iostream> #include<cstdio> #include<algorithm> #include<s 阅读全文
posted @ 2020-03-24 22:23 朝暮不思 阅读(168) 评论(0) 推荐(0)
摘要:简单sg函数 #include<iostream> #include<algorithm> #include<cstdio> #include<unordered_set> #include<cstring> using namespace std; const int N=1e4; int h[N 阅读全文
posted @ 2020-03-24 19:16 朝暮不思 阅读(188) 评论(0) 推荐(0)
摘要:这道题展示了分块的强大,学到一手,虽然因为数据太过友好暴力也能过 这道题边数多,直接遍历复杂度很高,大佬们想到了一种分摊复杂度的方法 对于入度大于指定值例如(sqrt),这也是分块常用指定值的点,我们定义为重点 否则为轻点,重点只和重点连,轻点和轻点连。这基于的原理是,重点的个数不超过sqrt个,并 阅读全文
posted @ 2020-03-24 16:16 朝暮不思 阅读(163) 评论(0) 推荐(0)
摘要:如果了解sg函数,就知道如果全部相异或是0则必败,否则必胜 #include<iostream> #include<unordered_map> #include <unordered_set> #include<cstring> using namespace std; const int N=1 阅读全文
posted @ 2020-03-23 22:17 朝暮不思 阅读(173) 评论(0) 推荐(0)
摘要:这道题也是斜率优化的题目,可以用代数法化简,但是本题有个问题是 直线的斜率不一定递增,所以需要二分查找。 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=2e5+20; 阅读全文
posted @ 2020-03-23 15:17 朝暮不思 阅读(185) 评论(0) 推荐(0)
摘要:这道题因为斜率可能不是一直递增,所以要用二分来维护 #include<iostream> #include<algorithm> #include<cstdio> #include<vector> using namespace std; typedef long long ll; const in 阅读全文
posted @ 2020-03-23 11:51 朝暮不思 阅读(137) 评论(0) 推荐(0)
摘要:这道题我刚开始打算是进行区间更新,但是发现不会维护开方,后来发现原来这道题是单点更新,因为开方几次后基本上就变成了1,这样我们只需要对一段区间都是1的情况直接返回 就能降低复杂度 #include<iostream> #include<map> #include<cstdio> #include<v 阅读全文
posted @ 2020-03-22 22:43 朝暮不思 阅读(135) 评论(0) 推荐(0)
摘要:这题我们很容易想到可以先求出x的取值,再进行比对看看是否可以 但是如果我们直接求出所有x的取值复杂度会超,因为求约数的复杂度较高 所以我们考虑先求去所以质因数,再通过dfs来求约数 之后进行比对即可。 #include<iostream> #include<string> using namespa 阅读全文
posted @ 2020-03-22 17:49 朝暮不思 阅读(186) 评论(0) 推荐(0)
摘要:这题要求求区间内的一个值,我们可以联想到用线段树维护区间,这样查找的复杂度低 这道题的难点不是线段树,而是我们应该维护哪个值,因为我们要求去的是l-r中ax和ay相等的最小距离,由此我们可以维护在当前位置前与他相等的最近的值是哪个位置,没有就是0 因此只需要遍历的时候用map维护pre值即可,但是本 阅读全文
posted @ 2020-03-21 22:06 朝暮不思 阅读(327) 评论(0) 推荐(0)
摘要:这道题我开始的思路是采用普通向量的方法,来维护异或和,将赋值语句存到map中判定,之后再处理分奇偶处理询问 但是我发现了这个算法是错误的,因为这样我无法通过父节点维护子节点的赋值操作,比如 0 1 2,之后再对0赋值,这样其实1的值也知道了。 为了应对这个问题,可以考虑附加一个超级根节点n,将这个值 阅读全文
posted @ 2020-03-21 20:15 朝暮不思 阅读(116) 评论(0) 推荐(0)
摘要:对于这题,首先我们要明确的一点是,直接求面积肯定是不行的,所以要转化求,我们发现,其实整个多边形的面积就是与x轴所形成的两个矩形的差 而矩形的面积就可以用(a+b)*h/2来做,h就是相邻的x的差,那么只需要维护上底和下底就行了,我们发现,其实只需要维护一个等差数列就行了,这点很巧妙 因为我们的y值 阅读全文
posted @ 2020-03-20 22:24 朝暮不思 阅读(259) 评论(0) 推荐(0)
摘要:这道题我们发现其实就是单纯的求lca,但是唯一的问题是他有多个点的lca需要求,但是其实只需要求dfs序最大和最小的两个即可,因为dfs表示的是包含的关系。 本题可以用优先队列保存大小值也可以用set来维护 #include<iostream> #include<queue> #include<ma 阅读全文
posted @ 2020-03-20 09:10 朝暮不思 阅读(147) 评论(0) 推荐(0)
摘要:将式子转化成同余表达式,发现答案就是欧拉函数得约数 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; LL 阅读全文
posted @ 2020-03-18 16:56 朝暮不思 阅读(147) 评论(0) 推荐(0)
摘要:裸题模板 #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #include<stack> #include<string> #include< 阅读全文
posted @ 2020-03-17 20:41 朝暮不思 阅读(108) 评论(0) 推荐(0)
摘要:与这道题相似的还有poj一道贴海报的题目,但这道题更加经典 典型的线段树合并求区间子段和模型,但是不同的是加了一个离散化,这也是最难的地方 本题思路: 1.设计lmax,rmax tmax来表示左边最长连续,总共最长连续和右边最长连续 2.设计懒标记为-1,0,1表示这区间是否都是黑或白或混合,如果 阅读全文
posted @ 2020-03-17 15:19 朝暮不思 阅读(196) 评论(0) 推荐(0)
摘要:模板题: #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #include<stack> #include<string> #include< 阅读全文
posted @ 2020-03-16 22:18 朝暮不思 阅读(107) 评论(0) 推荐(0)
摘要:这道题的我们知道如果在两个点之间有附加边,其实就相当于在这个回路上的每条边都权值+1,这样就可以通过差分数组来快速求取大小 这里的精髓就是在输入的两个位置+1,而在他们的lca上-=2; #include<iostream> #include<queue> #include<map> #includ 阅读全文
posted @ 2020-03-15 20:15 朝暮不思 阅读(147) 评论(0) 推荐(0)
摘要:这道题和之前poj的一道题目有着异曲同工之妙 所以也是考虑一个单调队列维护,首先对第一层进行初始化 这里有个小坑点就是,一行最多move t次,其实我们可以获得t+1个位置的数。因为从上面跳下来不算一次。 这样就可以通过前缀和乱搞了 单调队列本身很简单,就是处理边界问题的时候十分麻烦,需要谨慎处理 阅读全文
posted @ 2020-03-15 09:36 朝暮不思 阅读(139) 评论(0) 推荐(0)
摘要:维护两个单调队列一个递增一个递减 如果两个差值大于l,那么把位置小的往后移,因为这样才能保证合法,不然比如最大值在1处,最小值在2处,现在我们移动最小值是不可能的,因为最小值始终在最大值和右端点的中间,无法移动,只能移动最大值,那么注意的是,如果移动后合法,那么当前的有效区间跟移动后在哪无关,其实是 阅读全文
posted @ 2020-03-14 21:06 朝暮不思 阅读(122) 评论(0) 推荐(0)
摘要:分析可以设置二维的dp状态i天有j块钱的最大收益 对w+1天之前的每天进行初始化,因为在这个时候只能买,也可以不买,但是这个不买在后面进行集体操作 之后就有3种情况,一种是买,一种是不操作,一种卖出 并且只有当满足条件的时候才能进行买卖,那么这个优化方法就明显了,不买的情况就是等于前一天这个钱的大小 阅读全文
posted @ 2020-03-14 19:52 朝暮不思 阅读(134) 评论(0) 推荐(0)
摘要:A题: 我们发现如果任意两个奇偶性不同都不行,因为只要奇偶相同,都能够通过加2操作得到 #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #in 阅读全文
posted @ 2020-03-14 08:13 朝暮不思 阅读(214) 评论(0) 推荐(0)
摘要:这道题是典型的单调队列优化问题,题目虽然说得是交叉点,但是其实你可以把他看成格子,这也是常见技巧 之后你发现这就是求一个前缀和与前一行的值的相互关系,然后求最大值。大于指定长度的删掉 但是本题要注意的要求两遍,因为他可以往左也可以往右,并且注意不要忘记可以用0点更新。 此外,读入很严格,需要读入优化 阅读全文
posted @ 2020-03-13 22:36 朝暮不思 阅读(157) 评论(0) 推荐(0)
摘要:注意点: 要倒序,否则无法刚好二进制拼凑 设置哨兵,0的深度为0,且超过树的根节点的值为=0 #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> 阅读全文
posted @ 2020-03-13 09:14 朝暮不思 阅读(175) 评论(0) 推荐(0)
摘要:模拟题,只需要按题目要求把这些信息排序输出即可,注意有一些减小代码难度的小技巧 #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #includ 阅读全文
posted @ 2020-03-11 21:16 朝暮不思 阅读(365) 评论(0) 推荐(0)
摘要:模板:熟练到5分钟之内打出 #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #include<stack> #include<cstring> 阅读全文
posted @ 2020-03-11 16:21 朝暮不思 阅读(100) 评论(0) 推荐(0)
摘要:这道题细节较多,首先我们定义状态,f[i]表示处理到i的时候最小的个数,其实就是最后一个管的左边界,那么这些i都不能是奶牛所在的地方,因为我们枚举的是左边界 之后我们发现了单调性,其实就是取min+1,但是这个范围要在2a-2b之间,所以进队列的时候要小心 我这次犯的错是因为我把它当作以前的题目而没 阅读全文
posted @ 2020-03-11 16:05 朝暮不思 阅读(149) 评论(0) 推荐(0)
摘要:如何学过单调队列就能发现是裸题,因为题目求的是最大子序和,而我们发现就是跟前缀和相关,也就是说对每个点找到最小前缀和 这里因为是环,所以破环成链,但是这样会导致结束坐标可能超过n,只要%n即可,开始坐标不可能超过n,因为超过n跟从头开始是一样的,所以不会更新到 #include<iostream> 阅读全文
posted @ 2020-03-10 22:54 朝暮不思 阅读(123) 评论(0) 推荐(0)
摘要:#include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<algorithm> #include<stack> #include<cstring> using namespa 阅读全文
posted @ 2020-03-10 20:31 朝暮不思 阅读(214) 评论(0) 推荐(0)
摘要:/* 设计状态f[i][j]表示前i人涂前j个,然后进行转移 发现其中一部分可以通过单调队列维护降低复杂度 */ #include<iostream> #include<queue> #include<map> #include<vector> #include<cstdio> #include<a 阅读全文
posted @ 2020-03-10 11:39 朝暮不思 阅读(157) 评论(0) 推荐(0)
摘要:男人八题中的签到题,因为懒得用单调队列优化,所以用了二进制优化,但是这样很卡时限 我第一次是用int数组来表示dp数组,然后通过01背包的加法求,之后判断,但是这样memset的时间会很长,所以建议用bool数组+或判断,因为我们只在乎是否存在而不在乎多少 #include<iostream> #i 阅读全文
posted @ 2020-03-08 22:39 朝暮不思 阅读(122) 评论(0) 推荐(0)
摘要:#include<iostream> #include<cstring> using namespace std; const int N=3e5+10; int h[N],e[N],ne[N],idx; int w[N]; double f[N]; int in[N]; void add(int 阅读全文
posted @ 2020-03-08 17:34 朝暮不思 阅读(101) 评论(0) 推荐(0)
摘要:这道题和poj1823 一毛一样 可以参考我的另一个题解 唯一的区别是,他要找的是最左边的,那么我们自然可以考虑越左越好 如果当前点的lmax能满足,直接返回 不然的话,如果当前点的左儿子的tmax满足,就去左节点 如果是横跨区间的,也直接返回 如果在右儿子,就去右儿子 注意,我之前已经特判过不满足 阅读全文
posted @ 2020-03-08 15:39 朝暮不思 阅读(140) 评论(0) 推荐(0)
摘要:这道题主要是第三问较为复杂,但是我们曾经学过求一维上的最大子段和,这样自然想到设计lmax,rmax和tmax来表示最长连续的0 然后本题的懒标记可以设计为三种状态,但是在传递的时候只需当当前是全空和全满的时候传递,不然这个传递没有意义,传递下去就是为了更改子节点,如果当前父节点都是有空又满 那么只 阅读全文
posted @ 2020-03-08 14:45 朝暮不思 阅读(113) 评论(0) 推荐(0)
摘要:这道题很容易看出是求最大值的最小值,然后我们发现每个边的取值范围都是一段区间,这就是常见的用区间表示是否满足题意,当左边界大于右边界的时候就不满足 #include<iostream> #include<queue> #include<map> #include<vector> #include<c 阅读全文
posted @ 2020-03-08 10:19 朝暮不思 阅读(108) 评论(0) 推荐(0)
摘要:这道题相当精彩。推荐一个博文 https://blog.csdn.net/tc_to_top/article/details/51476095 另外还有几个坑点 1.需要特判相等的情况竟然还有相加为奇数不符合条件的情况 我连二分的判断条件都想不到,这个想法太缜密了 可见遇到题目需要思考性质,例如本题 阅读全文
posted @ 2020-03-07 22:58 朝暮不思 阅读(136) 评论(0) 推荐(0)
摘要:一遇到异或前缀和以及最大,一定要想Trie树,因为这是经典做法,通过贪心来找 本题可以二分异或值,来进行判定,这题我学了一下trie用结构体的模板 #include<iostream> #include<vector> #include<algorithm> #include<cmath> #inc 阅读全文
posted @ 2020-03-07 13:14 朝暮不思 阅读(227) 评论(0) 推荐(0)
摘要:分析:对于本题,因为数据,不难想到是nlogn左右的算法本题的数据具有单调性,在排序之后,一定是以分界线为边,一边是2分一边是3分我们可以暴力枚举分界线,并且根据分界线二分求得左右,之后计算最小我们知道,分界线的种类只需要枚举a中所有数以及b中所有数再加上0的位置和无穷大的位置就可以表述所有情况 # 阅读全文
posted @ 2020-03-06 17:16 朝暮不思 阅读(186) 评论(0) 推荐(0)
摘要:这道题很明显需要是暴力枚举第一维并且二分第二维,因为第二维是单调的 有几个坑点,首先可以都不用,其次可以只用一个,另外,我在做这题犯了一个巨大的错误,就是我光顾着判断二分情况的花费有没有超,却忘记了第一步的花费也可能超过要求 因此这里要注意一下 #include<iostream> #include 阅读全文
posted @ 2020-03-05 21:09 朝暮不思 阅读(184) 评论(0) 推荐(0)
摘要:这道题本身比较简单,因为发现具有单调性,所以只需要枚举一下天数就行了 但是有个问题,这个数据直接算会爆long long ,我第一次就是直接枚举二分的 现在换一个思路,就是我们知道前m天肯定是放满的,所以只需要从m+1天开始枚举,在最后天数的时候在加上m #include<iostream> #in 阅读全文
posted @ 2020-03-05 19:59 朝暮不思 阅读(141) 评论(0) 推荐(0)
摘要:经典的向量法,只要找出数学关系就行了 #include<iostream> #include<algorithm> #include<string> #include<cstring> #include<vector> #include<cstdio> #include<map> using nam 阅读全文
posted @ 2020-03-04 15:49 朝暮不思 阅读(152) 评论(0) 推荐(0)
摘要:我们发现字符串的个数不多,就会想到搜索或者是状态压缩 这题如果能将两个合并而且减少长度,那就意味着一个字符串的末尾和一个字符串的开头有相同之处 ,这样我们就可以先预处理一下 我们定义状态为f[i][j]表示在i集合中,当前以j开头,我们定义j开头是为了找最小字典序好找一些 我们知道最小长度可能多种, 阅读全文
posted @ 2020-03-03 19:58 朝暮不思 阅读(151) 评论(0) 推荐(0)
摘要:首先我们发现,因为可以在任意地方翻转,所以最后的答案就是一个合法子串和他的补集的子集中个数和最大的那个 因此我们先枚举每一个合法状态,记录他的合法个数有几个。 然后我们从头枚举每一个状态,计算状态的子集中的最大个数。 这样我们最后只要枚举状态和补集,就能计算出真正的答案了 #include<iost 阅读全文
posted @ 2020-03-03 10:10 朝暮不思 阅读(224) 评论(0) 推荐(0)
摘要:本题就是经典的哈密顿回路,但是有一个附加条件,就是如果有三个相邻,那么可以附加值 这样我们就可以枚举4维,判断条件后再加上 本题有几个坑点 1.爆int 2.有可能不存在这样的路 3.题目定义的路是不重复的,所以要/2 4.本题应该先预处理两个的情况,再用他推大的情况,我们普通的是用小的来维护现在, 阅读全文
posted @ 2020-03-01 20:05 朝暮不思 阅读(131) 评论(0) 推荐(0)
摘要:分析:本题是一道经典的TSP问题,但是不同的是,这个题目他每个点可以走很多次,这也就意味着我们需要用最短路算法来求两点之间的最小距离。本题数据范围很小,因此用floyd傻瓜算法是代码量最小的,floyd的本质是动态规划,过程是枚举每一个点作为中间节点之后就用状压dp来做,我在查询资料的时候发现,因为 阅读全文
posted @ 2020-03-01 10:50 朝暮不思 阅读(137) 评论(0) 推荐(0)