- 博客(51)
- 收藏
- 关注
原创 POJ-2184 (01背包的负数处理)
在标准的01背包里,我们看见j>j-TS[i],也就是说我们要想求dp[j],我们必须用到上一层的dp[j]和dp[j-TS[i]],也就是要用到上一层的他自己dp[j]与自变量j-TS[i]小于自己的[j]的dp[j-TS[i]],如果正序的话,dp[j-TS[i]]就会被破坏掉。同样的,如果TS[i]是负数,j-TS[i]>j,如果我们要求dp[j],我们要用到上一层的dp[j]与上一层的自变量j-TS[i]大于j的dp[j-TS[i]],如果按照逆序循环,dp[j-TS[i]]会被破坏掉。
2023-03-28 19:58:38
144
原创 区间贡献问题
出现的质数的个数-多余(区间未出现的质数),利用每个数的最小质因子去分解质因数并存其出现过的位置,那么在未出现的一段区间len(就是两次出现的位置相减-1),即ans减去(len+1)*len/2,注意减去尾部空白段。先假设每个子数组都含有所有质数(数组中的数含有的质数),然后依次减去不包含某个质数的区间。方法二 : 这题我们还可以直接根据每个质数出现的位置,得到所有含有这个质数的区间个数。题意:求所有子数组的lcm的质数个数之和。
2023-03-26 19:46:24
83
原创 李白打酒加强版
状态转移方程:dp[i][j][k]=dp[i-1][j][k/2](i>1&&k%2==0) + dp[i][j-1][k+1](j>1);状态设计:dp[i][j][k]的值表示遇到i家店,j朵花,酒壶中还剩k斗酒的可能情况数;最后一次肯定遇到的是花,那么最后的结果便是dp[N][M-1][1];va 初始值为 2,要求经过 n+m次操作后 va=0的方案数取模。边界设计:除了dp[0][0][2]=1,其他元素全为0;(1)va=va*2(一共n次)(2)va=va-1(一共m次)
2023-03-24 17:37:57
113
原创 trie树 + 树形dp
如果在trie上一个节点往下有分叉,那么我们序列中必然有数该位上为1和0,那么任何X异或后,最终值的该位上必为1,所以要使最终值最小,此时最终值应为 min(left,right) + (1
2023-03-05 10:30:26
153
原创 Floyd :最短路前提下最大价值
题目多次询问:每次询问两个城市u到v 的最短路径,并在最短路径的前提下使他购买的纪念品的总价值最大化。因为询问次数多,并且数据量不大,最大只有300个点,所以我们考虑floyd。
2023-01-22 23:09:03
58
原创 k倍区间问题
如果只是这样的话,其实是不对的,因为我们少考虑了一种情况,例如k = 5时,sum[i]%k = -1 和sum[j]%k = 4的这段区间和也是k的非负整数倍,首先可以看出sum[i]时负数, sum[j]是正数,因此sum[j] - sum[i] 也是正数,并且余数4 - (-1) = 5 能被k整除。已知a
2023-01-17 11:41:43
123
原创 均分纸牌问题
这题和上题不大一样,每次移动只能移动一个,问移动次数。并且行和列都要均分,但是行内交换不会影响到列,列内交换也不会影响到行,所以我们分别进行两次环形均分纸牌操作就行了。最后就转换成了一个经典问题:给你一组点的位置,求某个位置到所有点的距离最小是多少,最小值就是(所有点到其中位数的距离之和)由于每次移动可以移动若干张牌,问移动几次,所以我们只需要看x[1]~x[n-1]中非零的个数。x[i]代表i向i+1移动的牌数,负数时代表i+1向i移动。
2023-01-12 18:59:25
71
原创 二分查找算法模板
二分模板一共有两个,分别适用于不同情况。中, 每次将区间长度缩小一半,当。算法思路:假设目标值在闭区间。,此时为了防止死循环,计算。时,我们就找到了目标值。
2023-01-10 14:23:43
68
原创 最长公共上升子序列(LCIS)
而且是在a[i] == b[j]的时候成立,且可以发现,在每一次进行第二层循环时,a[i]是不变的,这也就可以推出,与a[i]进行配对的b[j]的值也是暂时不变的,那么把b[j]等价转化为a[i],并将maxv提至第一层循环内,在每一次比较a[i]和b[j]时,一起讲maxv处理出来,这样就可以将其优化为如下的O(n ^2)的代码。(1)若是 a[i]!若是a[i] == b[i] 如果不想要a[i]与b[j]进行配对,是不是也会得到上面的结果,故当。1 2 3 9 8 7 6 5 4序列。
2023-01-09 21:56:03
272
原创 染色法判断二分图
二分图当且仅当图中不含奇数环 环当中的边的数目为奇数。二分图可以把所有的点划分在两边 使得集合内部没有边。2.如何使用染色法判定图是不是二分图?如果不含奇数环的话 则一定是二分图。在染色过程中出现了矛盾 不是二分图。在染色过程中不出现矛盾 是二分图。
2022-12-18 19:29:36
77
原创 vector 开动态二维、三维数组
行和列的下标都是从0开始,即(0 ~ n - 1 , 0 ~ m - 1);数组元素值默认为 0。初始化为value。
2022-10-31 22:49:49
380
原创 线段树区间修改,区间查询最大值
分析: 我们可以把树上问题转换为序列问题, 跑一遍dfs得到dfs序, in[], out[], 然后可以得到每个节点x为根节点的子树在dfs序中的范围 in[x] ~ out[x]. 然后问题就转换为线段树区间修改,区间查询最值。题意:给你一颗树,多次操作,操作一: 给两个数x , k,让以x为根节点的子树(包括它自己) 中所有节点值 + k;操作二: 给一个数x, 问以x为根节点的子树(包括它自己) 中所有节点值的最大值。最开始所有节点值为0;
2022-10-29 22:06:53
514
原创 unordered_map 和 map 的区别
缺点:空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点和红。黑性质,使得每一个节点都占用大量的空间。当插入操作少,查询操作多时,用unordered_map。适用:对于有顺序要求的问题,用map会高效一些。当有大量的插入和查询操作时, 用map更快;,有可能还会哈希冲突(开链法避免地址冲突)优点:有序性,内部实现的红黑树的查找,优点:因为内部实现哈希表,因此其。适用:常用于查找问题。
2022-10-24 19:29:58
667
原创 高斯消元
它本质上是通过elementary row operation(初等行变化),将线性方程组的Augmented matrix(增广矩阵)转化为row echelon form(行阶梯型矩阵)。Gaussian elimination(高斯消元法)是线性代数中求解线性方阵组的一种算法,它也可用来求矩阵的秩,以及求可逆矩阵的逆矩阵等等,用途十分广泛。这里面就有另外一个知识点:线性方程组有解的充要条件是增广矩阵的最右列不是主元列,当没有自由变量时有唯一解,有自由变量时,有无穷多解。容易发现,这是一个满秩矩阵。
2022-10-03 11:32:41
213
原创 快速幂求逆元
因此 当 a m ≡ 1(mod p), m即为 a 在mod p 意义下的逆元。(需要注意只有a和p互质,a才有关于p的逆元) 时,作为对比,费马小定理 a ^(p − 1) ≡ 1 ( mod p) , 其中 p为质数),实际上就是欧拉定理的特殊情况。当 a m ≡ 1(mod p), m即为 a 在mod p 意义下的逆元。(需要注意只有a和p互质,a才有关于p的逆元)。对任意两个正整数 a , n ,若两者互质,则。就是a 在 mod p 意义下的逆元。一个质数 p 的欧拉函数值。
2022-09-19 16:35:24
70
原创 线性筛法求欧拉函数值
在线性筛法中,每个合数n只会被它的最小质因子p筛一次。我们恰好可以在此时执行以上两条判断,从phi(n/p)递推到phi(n)此题数据量很大,所以要用到线性筛法求欧拉函数。定义:欧拉函数表示1-N中与N互质的数的个数;用希腊字母φ表示,φ(N)表示N的欧拉函数.3.当N为奇数时,φ(2*N)=φ(N);因为除了p的倍数之外,其他数都与N互质;4.若N是质数p的k次幂,φ(N)=1.欧拉函数是积性函数(非完全);5.当N是质数时,φ(N)=N-1;2.除了N=2,φ(N)都是偶数;若将N表示成质因子分解式。
2022-09-07 22:47:04
286
原创 求N的所有约数
所以我们可以枚举 b1的所有约数,然后依次判断是否满足 lcm(x,b0)=b1 以及 gcd(x,a0)=a1 即可。所以一个数n的质因数只可能有一个大于sqrt(n)的,所以只用预处理出来。x和b0的最小公倍数是b1,所以x一定是b1的约数。如果直接用试除法求 b1 的所有约数,那么总计算量是。,会有一个测试数据超时。
2022-09-05 21:21:13
89
原创 可持久化线段树
我们发现需要进行离散化,因为此时建树的依据是数值的大小,左子树存放的数比右子数的存放的数要小,而不是下标,又因为原本的数据取值太大,因此需要通过离散化将所有数据离散为一个较小范围,离散后我们并不在意它们的真实值,只需要某个数在所有数中的位置,通过位置可以找到在原数据中的真实值。当我们插入一个元素的时候,我们其实只需要修改其中一条链的数据,对于其他剩余的节点我们就直接复制,同时复制旧版本的节点到新的树上,复制完后新版本的节点加上新的版本号。区间[1,1]的线段树(蓝色节点为新节点)...
2022-08-07 13:40:22
121
原创 判断一个度数序列是否可以构成简单无向图
如图片两个定理: 利用握手定理及其推论:下面给出几个例子一. 1,1,1,2,3显然度数之和为偶数,也有偶数个奇数度。首先进行降序排列:3,2,1,1,1删去最大度数3,将其后面的3个度数减一:1,0,0,1重新排序:1,1,0,0删去最大数1,将其后面的1个度数减一:0,0,0发现最后所有度数都变成了0,则可以构成简单无向图。二.2,2,2,2,2显然度数之和为偶数。首先进行降序排列:2,2,2,2,2删去最大度数2,将其后面的2个度数减一:1,1,2,2重新排序:2,2,1,1
2022-08-05 00:48:20
2714
原创 数独(DFS+优化搜索顺序+位运算)
row[N],col[N],cell[N][N]都用9位的二进制数表示(初始状态下全为1,代表1-9都可以填),判断在坐标x,y上填某个数是否合法,只需要row[x]&col[y]&cell[x/3][y/3],例如结果是000010001,表示1,5可以填。很明显这里面check判定很多,我们必须优化这个check,所以我们可以对于,每一行,每一列,每一个九宫格,都利用一个九位二进制数保存,当前还有哪些数字可以填写.很明显,我们肯定是从当前能填合法数字最少的位置开始填数字。...
2022-07-22 21:46:30
151
原创 树的果实(dfs序+莫队算法)
对于1节点的子树贡献为(32)^2+(62)^2+(72)^2+(51)^2+(81)^2+(91)^2+(1*1)^2=547。查询一个节点的子树值,就是查询一个连续区间的值,用普通莫队就可以做出,细节就不多说了,因为这里和莫队模板题很接近了。对于5节点的子树,贡献为(71)^2+(81)^2+(31)^2+(61)^2=158。对于7节点的子树,贡献为(81)^2+(31)^2+(6*1)^2=109。树遍历dfs序使一个点的子树成为连续的区间。对于6和10节点的子树内。...
2022-07-15 00:17:02
82
原创 莫队算法
是莫涛发明的一种解决区间查询等问题的算法,基于思想,复杂度为;一般来说,如果可以在O(1)内从【l,r】的答案转移到【l-1,r】、【l+1,r】、【l,r-1】、【l,r+1】这四个与之紧邻的区间的答案,则可以考虑使用莫队。1先将所有查询记录下来,然后排序(排序规则如果左端点在同一个块中(a.l/sqrt(n)==b.l/sqrt(n)),则看右端点谁大(a.r...
2022-07-14 20:36:10
120
原创 三角函数,反三角函数
B - Counterclockwise Rotation (atcoder.jp)Time Limit: 2 sec / Memory Limit: 1024 MBIn an xy-coordinate plane whose xx-axis is oriented to the right and whose y-axis is oriented upwards, rotate a point (a, b) around the origin d degrees counterclockwise an
2022-07-11 12:20:24
628
原创 次小生成树
例题:秘密的牛奶运输农夫约翰要把他的牛奶运输到各个销售点。运输过程中,可以先把牛奶运输到一些销售点,再由这些销售点分别运输到其他销售点。运输的总距离越小,运输的成本也就越低。低成本的运输是农夫约翰所希望的。不过,他并不想让他的竞争对手知道他具体的运输方案,所以他希望采用费用第二小的运输方案而不是最小的。现在请你帮忙找到该运输方案。注意::如果两个方案至少有一条边不同,则我们认为是不同方案;费用第二小的方案在数值上一定要严格小于费用最小的方案;答案保证一定有解;输入格式第一行是两个整数 N,M,表示销
2022-07-01 17:49:16
91
原创 multiset
c++语言中,multiset是<set>库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是有序的,而且序列中可以存在重复的数。找默认排序(从小到大)的第一个/最后一个值:*s.begin()/*s.rbegin()*s.begin()/*prev(s.end())如果是prev的话,prev(s.end())返回的是当前迭代器的前一个迭代器,复杂度不确定。C - Max - Min Qu
2022-05-29 10:50:04
122
原创 AtCoder E - Prefix Equality
题目链接:E - Prefix Equality (atcoder.jp)题意:给两个序列a,b,每次询问给出 i 和 j,问(a1,a2.....ai)和(b1,b2.....bj)中出现过的元素是否相同。由于询问量很大,所以要预处理,把每次询问时间复杂度降到O(1);思路:哈希。把出现序列中出现过的数赋一个2^64的随机数,然后一个集合的哈希值就是把这集合里元素被赋予的随机数的和。#include<bits/stdc++.h>using namespace std;ty
2022-05-11 23:31:35
62
原创 分解质因数
1、 对 n 进行分解质因数,应先找到一个最小的质数 k,k 的值应该从 2 开始,然后按下述 步骤完成:2、 如果这个质数恰等于 n,说明分解质因数的过程已经结束,打印出即可。3、 如果 n > k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整 数 n,重复执行第一步。 如果 n 不能被 k 整除,则用 k + 1 作为 k 的值,重复执行第一步。#include <iostream>using namespace std;i.
2022-04-08 14:49:35
79
原创 扩展欧几里得(最小正整数解)
题意:两只青蛙在一个循环坐标轴上,朝一个方向同时开始跳,问何时两只青蛙能落在同一个点上。列出方程:(x + m * t) % L = (y + n* t) % L根据同余定义:如果 a-b能被n整除,则a≡b(mod n), 即a%n==b%n,a和b同余n。则上式可写成:(x+m*t)-(y+n*t)==k*L(x-y)+(m-n)*t==k*L(m-n)*t - L*k== y-x到这一步可以比较明显的看出来是一个 ax+by=k*(gcd(a,b)),可...
2022-04-07 17:46:05
196
原创 Kattis - earlyorders (单调栈)
题意:从给定的序列中找出k个数包含1到k,并且字典序较小。解题思路:用单调栈。单调栈中保持单调递增的序列,如果出现某个数大于栈顶的元素,就把该元素加进去,如果出现某个数小于栈顶的元素,判断在序列后面是否还有栈顶元素,如果有的话可以去掉,如果没有的话,该元素直接加进去。#include<iostream>#include<map>#include<stack>using namespace std;const int N=2e5+5;int n...
2022-03-16 23:12:07
65
原创 归并排序求逆序数
AC代码:#include<iostream>using namespace std;const int N=5e4+5;const int INF=0x3f3f3f3f;int a[N],a1[N/2],a2[N/2];inline int read(){ register int s=0,w=1; register char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')w=-1...
2022-03-10 20:39:47
88
原创 合法括号序列
()()() 合法(())合法()( 不合法)()( 不合法())( 不合法lb --> 当前前缀有多少个未匹配的左括号合法条件:lb最后为0;且当lb=0时没有遇到右括号例题:来源:牛客网小沙觉得括号真是一个神奇的东西,以至于他看什么都觉得这东西像一串括号,小沙买来了切糕,他准备将它分成几份拿来吃,但是小沙突然希望把他眼中的括号切糕全部切成合法的括号切糕。请问小沙有多少种切法,不同的切法仅看 切的位置,如果有一个位置切的不同,那么切法就不一样。如果你无论如
2022-03-05 23:13:13
697
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅