随笔分类 -  c++——算法

摘要:题目大意: 给出一个树, 每次给出2个相同高度的点, 然后依次向父亲走, 问 val[a]*val[b]这些值加起来是多少 思路: 直接map映射关联容器,时间复杂度过大 根号分治? 于是不决, 节点深度 小于根号n的记忆化搜索 大于根号n的暴力搜索 点很少. 对于统一深度 的点又可以离散化 阅读全文
posted @ 2023-03-20 22:19 VxiaohuanV 阅读(16) 评论(0) 推荐(0) 编辑
摘要:思路; 遇到数学公式,一层一层剥开 发现 那个式子就是 求 n 内的 每一个数 的倍数在n 以内的数量, 明显数论分块来处理这个问题 然后就是 因子的^2, ^3 , 这个子问题 1^3+2^3+3^3+……+n^3 = [n(n+1)/2]^2 取模 2^64, 直接用 unsigned long 阅读全文
posted @ 2023-03-17 23:48 VxiaohuanV 阅读(34) 评论(0) 推荐(1) 编辑
摘要:思路: 性质一直都是1,N 的满区间 前面3个直接利用值域线段树即可 后面一个就利用优先队列存被改的数,然后暴力恢复就行, 因为最对被改m次嘛\\ #include<bits/stdc++.h> using namespace std; #define ll long long const ll m 阅读全文
posted @ 2023-03-16 00:15 VxiaohuanV 阅读(20) 评论(0) 推荐(0) 编辑
摘要:思路: 通过题目就可以转化题意为: 让 pi!=i &&pi !=ai 发现合理的队列很多,就通过随机数去产一个队列出来 shuffle: random_device gen; mt19937 rd(gen()); shuffle(p+1,p+1+n,rd); #include<bits/stdc+ 阅读全文
posted @ 2023-03-15 23:16 VxiaohuanV 阅读(21) 评论(0) 推荐(0) 编辑
摘要:法一: 贪心得缩小调价: 让每一个矩阵的值都是一样的 性质: 捞捞利用位运算的性质, 每次+4, 因为4是二ni次, 就是一直在某个位上面加一个东西 然后在第排的时候,加入新的数的时候,发现可以直+ 1<<(lg2m +1) 然后剩下的位保持不变和上面一样就行 最高位两两异或一定是可以^约掉; 法二 阅读全文
posted @ 2023-03-13 23:41 VxiaohuanV 阅读(47) 评论(0) 推荐(0) 编辑
摘要:大佬的思路: #include<bits/stdc++.h> using namespace std; int n,k,l[200010],r[200010],pos[200010]; char c[200010]; vector<int>seq; void precalc(int u) { if( 阅读全文
posted @ 2023-03-08 23:24 VxiaohuanV 阅读(15) 评论(0) 推荐(0) 编辑
摘要:思路: 很多交互题, 大多要用二分, 这道题也不例外, 因为满足递增的条件 但是这个的操作复杂度是 nlogn的, 6000,一定不行的, 不要看到 nlogn 就认为是一定行的(中途想到了,但是还是就放掉了,md) 于是发现都是小写字母 一定要用26这个小写字母特性条件条件 这个东西来优化一下就行 阅读全文
posted @ 2023-03-08 00:25 VxiaohuanV 阅读(18) 评论(0) 推荐(0) 编辑
摘要:思路: 最小的最大值,明显二分思想 ck的时候明显用贪心 发现正着贪心比较难处理 反之贪心,很好搞, 但是又发现他的顺序是固定的 这个时候不要被骗了, 虽然是固定的,但是我们就一定要去正着做吗 依然可以反着做, +一个约束条件就行了 (当前删除的值 要比本身修改前小) #include <bits/ 阅读全文
posted @ 2023-03-07 00:47 VxiaohuanV 阅读(17) 评论(0) 推荐(0) 编辑
摘要:思路: 首先有一个结论, 一个队列里面, 顺序从小到大 , 两两元素的xor 最小, 一定是 某2个相邻元素的最小, 利用这个最小值就可以去解决存在类型的问题啥的 阅读全文
posted @ 2023-03-03 23:51 VxiaohuanV 阅读(14) 评论(0) 推荐(0) 编辑
摘要:一种数据结构而已, 按照字符来储存, 通过以有的信息来优化空间, 从根节点到尾部来表示这个字符串 他的很多功能要利用 树上DP的思想去使用 #include <bits/stdc++.h> using namespace std; #define ri int #define M 3000005 i 阅读全文
posted @ 2023-03-03 23:49 VxiaohuanV 阅读(13) 评论(0) 推荐(0) 编辑
摘要:思路: 发现数据范围500, 时间复杂度为 n^3 于是明显DP 当然这里面有一个贪心思路, 当前的点比前面一个点的速度低,就没有必要删除 但是这里的dp不用这个贪心,不然实现上复杂一点 直接就连续删除就行, 因为DP的时候一定会把最优的更新出来 然后这里有一个问题, 就是不知道那个点删了没有, 就 阅读全文
posted @ 2023-03-02 20:59 VxiaohuanV 阅读(24) 评论(0) 推荐(0) 编辑
摘要:思路: 题目信息: 转化: 选出子序列求一个gcd, 很关键 基底转化: 枚举1-1e6的数, 看能不能产生这个数, 在利用那个那个的性质即可, 贪心让所有合理的数gcd起来是不是1 #include <bits/stdc++.h> using namespace std; #define M 20 阅读全文
posted @ 2023-02-20 12:32 VxiaohuanV 阅读(18) 评论(0) 推荐(0) 编辑
摘要:思路: 首先对队列大小排序(预处理) 直接对 队列 进行分割, 情况很多 利用 2^ni 这个优秀的复杂度, 种类很小 转换枚举对象 暴力枚举这个2段这个即可, 中间处理利用二分来找到相应的割点 阅读全文
posted @ 2023-02-18 12:36 VxiaohuanV 阅读(37) 评论(0) 推荐(0) 编辑
摘要:相关操作; reverse(s.begin(),s.end()); s.substr(postion,length) 当长度比较短的时候可以直接用map处理 阅读全文
posted @ 2023-02-14 15:34 VxiaohuanV 阅读(10) 评论(0) 推荐(0) 编辑
摘要:思路: 可以先想朴素的做法来看看找找思路 可以发现 gcd的元素越多, 这个值就会越小, 是单调的 而且当某个元素不符合时, 最优做法: 把他设成 1e9+7等等数字, 这样弄出来的gcd就是1 于是dp的时候: 对于当前这个数看他有没有一段区间是不符合这个东西, 有 就把这个数设成1e9+7等数 阅读全文
posted @ 2022-12-22 19:48 VxiaohuanV 阅读(18) 评论(0) 推荐(0) 编辑
摘要:思路: 首先可以枚举 a, (全情况的考虑的思想) 然后来确定b, 利用 |的特性, 让 b+某些值后, 能够 a|b=b. 这个b的变换利用位运算的拆解 阅读全文
posted @ 2022-12-22 19:38 VxiaohuanV 阅读(20) 评论(0) 推荐(0) 编辑
摘要:思路: 形式上就很像线段树, 在染色的时候, 关键是对相同颜色的权值一起加, 这个地方要用前缀和处理, 因为没有要求加一次就要实时更新, 于是就用到了在更新,如何更新呢? 就利用前缀和 然后 修改一个区间, 先把这个区间本来的颜色值更新,在减去当前的颜色值, 因为这个时候是从当时开始算的 而且这个修 阅读全文
posted @ 2022-11-23 17:12 VxiaohuanV 阅读(25) 评论(0) 推荐(0) 编辑
摘要:思路: 2个情况都是要方向不要才可以. 于是就二分图判断一下, 然后设一个方向即可. 位置的大小,就用有向图特性来表示 看看有没有环,有环就G, 用 tajain或者其他方法都可. 然后利用拓扑序处理即可 #include <bits/stdc++.h> using namespace std; # 阅读全文
posted @ 2022-11-22 11:31 VxiaohuanV 阅读(49) 评论(0) 推荐(0) 编辑
摘要:大佬思路: Tutorial for CF1641D - tommymio's Notebook - 洛谷博客 (luogu.com.cn) 思路: 关键是转化这一步, 不要以序列为单位去看, 而是以序列的元素去看 这个容斥,可以想到bitset优化处理. 以元素为单位,建立n的bitset, 以w 阅读全文
posted @ 2022-11-21 16:27 VxiaohuanV 阅读(29) 评论(0) 推荐(0) 编辑