- 博客(130)
- 收藏
- 关注
原创 换根呀呀啊呀
登录—专业IT笔试面试备考平台_牛客网#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=2e5+5000;struct edge{ ll to,next,w;}e[N*2];ll head[N],tot,flow[N],deg[N],sum,ans[N];void addedge(ll u,ll v,ll z){ e[tot].to=v; e[t
2022-05-31 16:02:30 81
原创 线性递推转化为矩阵快速幂
方程的根通过移项可以得到低次向高次的线性递推,通过变形目标式得到目标式的线性递推,最后用矩阵乘法快速幂处理#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod =998244353;int nn=3;const int maxn=10;struct mat{ ll m[maxn][maxn]; mat(){ memset(m,0,sizeof(m
2022-05-05 20:50:21 285
原创 数据溢出考虑
1.乘法产生:qmul2.qpow产生(并且qmul处理不了,采取_int128(max)#include<bits/stdc++.h>#define int __int128using namespace std;int read(){ int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=f*-1;ch=getchar();}while(ch>='0'&&ch&l.
2022-04-26 11:21:42 216
原创 搜索问题呀
搜索复杂度估计:状态数*状态转移(因为会记录下已经搜索过的状态,防止重复搜索)输出路径的时候需要递归输出,这里将这些所有信息包含一个结构体中方便输出#include<bits/stdc++.h>using namespace std;struct one{ int now; int last; int pos; int way; int step;};one a[1<<16];bool vis[1<<1..
2022-04-26 11:15:00 112
原创 数学递推式(参入数论)
问题:在1e9内所有素数中放回抽取,直至累乘积为目标值,求期望抽取次数递推公式(有回退性):记f[x]表示目标值为x时的期望次数f[x]=1+(( f[ x/prime[i] ]*p[i] )+f[x]*pp )得到x的期望等于这次没抽到x素因子的概率乘期望+抽到概率*剩余期望+1(这一次的递推)这里pp为定值,移项化简得到递推,递推特征是子状态的素因子一定在x中,记录所有素因子,然后每次枚举其素因子可重复的个数即可,这种没那么规整的递推多使用记忆化搜索,用个数组记录即可
2022-04-26 11:09:02 112
原创 依附背包呀
物品间有主次品的依附关系,这里就将依附关系的物品讨论成几种情况,能拿几种分别做成一个新的物品,这几个新物品相当于是互斥关系 最多选一个 最后就当分组背包处理这里由于只有一层依附关系,若有多层就从最底层出发分类处理。[NOIP2006 提高组] 金明的预算方案 - 洛谷#include<bits/stdc++.h>using namespace std;int dp[40000];vector <int> cc[40000];int main (){ ..
2022-04-23 20:24:12 139
原创 数论求a^b(a,b为1e12级别)的因子之和
1.首先考虑将a质因子分解,筛出1e6内的a的质因子及幂次,若a还有质因子(未被筛成1的话)则有一个大于1e6的大质因子(至多一个)(补上即找到所有质因子)2.将b放入幂指数3.考虑一个生成函数a^b的因子之和=(p1^0+p1^1.....+p1^k1)(p2^0+.....+p2^k2).....(pm^0+...pm^km)这个生成函数的每一项都是一个不同的因子(此处p为a的质因子)4.最后就是处理一系列等比数列的和,方法一是等比求和,但由于mod过小 有可能出现q为1的情况 ,.
2022-04-22 21:46:12 290
原创 分组背包呀
所有物品分成k组,组内互斥对组01背包,最后一维枚举组中哪个#include<bits/stdc++.h>using namespace std;int dp[1005];struct one{ int m,w;};vector <one> v[1005];int main(){ int n,m; cin>>m>>n; int a,b,c; for(int i=1;i<=n;++i) .
2022-04-22 17:55:39 159
原创 二维01背包
直接二维倒序枚举#include<bits/stdc++.h>using namespace std;int dp[205][205];int main(){ int n,m,t; cin>>n>>m>>t; int mm[105],tt[105]; for(int i=1;i<=n;++i) { cin>>mm[i]>>tt[i]; } for
2022-04-22 17:16:28 141
原创 混合背包呀
1.滚动数组dp空间优化2.对不同背包讨论直接分类处理01: 倒序枚举完全:正序枚举多重背包:二进制分组3.!.注意输入别用自加 分开写!#include<bits/stdc++.h>using namespace std;int t1,m1,t2,m2;int dp[100006];int w[2000005],st[2000006],cc[2000006];int main(){ scanf("%d:%d %d:%d",&t1,&am.
2022-04-22 13:06:13 96
原创 抽象dpp
给定一个数列,求其中所有等差数列个数(包含1、2个元素)1.子状态:从左往右枚举,每次以新出现元素为结尾新增的等差数列个数2.状态:dp[i][j]表示以第i个数为结尾,公差为j的数列的个数(元素个数大于等于2)(找一个角度来划分目标)3.递推公式:dp[i][j]+=(dp[k][j]+1)(k=1.2.....i-1) (这里的+1是关键的地方,体现在若前面的数没有再前面的数则+1(做两个元素的等差数列)若有 则表示额外多了一个元素多的个数,而个数本身是由两个两个叠加起来的。这里计数注意只.
2022-04-22 09:43:07 93
原创 dp 优化
「SWTR-03」Golden Sword - 洛谷1.确定子状态:选完了前i个,当前剩下j个2.dp柿子:dp[i][j]表示如上含义3.递推公式:dp[i][j]=maxdp[i-1][j-1],j..j+s-1;4.去重(无)这里对区间最值做一个单调队列的优化(从后往前的滑动区间)先理清写出思路!好好写代码#include<iostream>#include<cstring>#include<vector>#inclu.
2022-04-21 12:19:36 135
原创 树形dp基础
1.给定中序遍历1,2,3....n,作用:越小的号码放在“越左子树”,对树的形状并没有什么限制。2.给定计算方式为左子树分数*右子树分数+根节点分数,所以对一个已知确定的树只需要摆定他的根就可以确定其得分 对此可以递归子树加枚举处理,而如何确定一个数(根可不定)由于中序遍历给定,所以对于任一个区间[i,j]可以达到需要,对于每个区间递归枚举根即可(这里采用记忆化搜索)#include<iostream>#include<cstring>#include<ve.
2022-04-21 00:04:19 1013
原创 经典字符dp
给三种操作,删任意位置字符,添任意字符于任意位置,改任意字符为任意字符,求将串a变为串b的最小操作数dp四部曲:1.定义子状态:进行多次操作后将a变成b的所需操作数2.定义状态:dp[i][j]表示将串a的前i个字符转化为串b的前b个字符(提炼出的本质问题)3.递推公式:对于前两个操作即转化为dp[i-1][j] dp[i][j-1]取较小的再加一分别表示删去最后a最后一个和添b最后一个的子问题,对于第三个操作要讨论a[i-1]是否等于b[j-1]若等于再和dp[i-1][j-1]取..
2022-04-20 20:42:29 1084
原创 最大不下降序列
1.求不下降就把上升序列中的lowerbound改成upperbound 即可(模版注意下标)2.最多需要多少,每次lowerbound贪心即可(若未找到会返回末尾位置,建议数组0开始)变量该局部局部全局全局 方便不易错 影响不大[NOIP1999 普及组] 导弹拦截 - 洛谷#include<iostream>#include<cstring>#include<vector>#include<cstring>#include&l
2022-04-19 21:56:14 111
原创 排列中的最长公共子序列nlogn
1.首先通过离散化将第一个序列的顺序映射为升序排列,并依此离散函数将第二个函数转化,从而将求公共子序列问题转化为求一个最长升序子序列,通过贪心二分(lowerbound)可直接处理2.注意最后得到的数组不是最长升序子序列本身,但长度是。#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<a.
2022-04-19 21:15:46 279
原创 记忆化搜索
dp动规思想结合搜索,再搜索的过程中对搜索到过的最优子结构进行记录,当下次再递归搜索到时直接访问停止递归,以防止重复的拓扑搜索。记忆化搜索是对dp的扩充,当dp情况多样难以枚举时,可以考虑结合搜索处理[SHOI2002]滑雪 - 洛谷#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<
2022-04-19 17:06:52 124
原创 无限转冲,连续的力量
kotori的设备 - 洛谷这里一个充能点问能维护n个费能点多久,由于这里充能点的转变不需要浪费任何时间,所以,能维护一堆机器工作t时的充要条件是 :能提供的电量大于等于消耗电量,这里把电量看作对象,一个机器用掉多冲的电量的时间完全可以用来充满另一个,总的电量是一定的,只要将电量在极小的时间内平分就一定能持续不用管b【i】#include<iostream>#include<cstring>#include<vector>#include<..
2022-04-14 12:55:01 81
原创 蓝桥杯 cr
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;typedef pair<int,int> pii;#define aa first #define bb secondconst int maxx=4e7+8;const int nn=100005;cha.
2022-04-09 15:18:40 151
原创 转换等价处理
[NOIP2015 提高组] 跳石头 - 洛谷最后一颗不能动的石头让我怀疑二分贪心策略的正确性,但仍是正确的,因为出现这种情况,去掉当下的石头可以解决,若不能去掉,则一定完不成,因为贪心一定是最小花费的最优情况,所以对与check仍旧等价(因为只差一个,所以既然不存在最优,这个就一定能排到最优)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int inmax=40000008;c.
2022-04-07 16:19:32 99
原创 二分查找stl
lower_bound 返回第一个范围内大于或等于查找值的地址单位,若没查找到则返回end地址,反之通过减去首地址+首地址下标得目标地址upper_bound返回第一个小于目标值。。。。注意精度给的对象是谁ll快快读模版:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int inmax=40000008;char IN[inmax+5],*ipos;#defin..
2022-04-07 11:57:30 120
原创 期望dp1.0
1.dp用以处理相邻间有递推关系的(可以复杂多维)如这里第i个的选择只会影响前一个和后一个2.记录状态,三维dp[i][j][k]代表当前是第i个,j表示前i-1个有多少个已经选择,k表示当前是否选择这里第二维的范围是限制,跑的时候可以跑大一些,最后更新ans可以按题目限定的范围内跑就可以#include<bits/stdc++.h>using namespace std;typedef long long ll;int a[305][305];int c[2005],.
2022-04-06 17:53:42 214
原创 给定种数及数目物品,不放回取出,连续取出所有不同种物品,触发效果,求期望效果
类比纸箱子先后不放回抽奖,前面的结果不会影响当下结果的概率,所以前面取完了k个不影响后面七个触发效果,每个点触发效果的概率,从情况数可求,所以各个点累加期望即可小魔女帕琪 - 洛谷#include<bits/stdc++.h>using namespace std;typedef long long ll;ll a[8];ll s;double s1;double ss;double s7;int main (){ s1=1; s7=1; ..
2022-04-06 13:39:25 328
原创 期望线性性
每多一个1带来的贡献增值是:(x+1)^3-x^3=3*x^2+3*x+1,这里的x是前面已经累计的连续1的个数,而对于每一位的期望贡献就是p[i]*E(3*x^2+3*x+1)=p[i]*(3E(x^2)+3E(x)+1,在累加即得答案,所以这一要求得每一位的E(x^2)与E(x),有递推:x=x-1+1E(x)=(E(x-1)+1)*p[i]x^2=(x-1)^2+2*(x-1)+1E(x^2)=(E((x-1)^2)+2*E(x-1)+1)*p[i]写出一般等式,在求两边期望.
2022-04-01 15:30:23 226
原创 期望dp(难
1.无限n种物品,等概率抽取,求集齐所有种类物品的期望情况。首先每轮概率给定,期望情况是固定的。而期望价钱与期望次数相联系,所以先求期望次数,影响期望次数的变量是还需要集齐的种数,设f[i]表示当前已经收集i种是需要进行f[i]次才能收集全,递推:f[i]=i/n*f[i]+(n-i)/n*f[i+1]+1;(转变需求目标,分步处理)2.接着联系价钱,设g[i]为已经集齐i种还需要花的钱,这里由于考虑的是期望价格,所以每个g[i]都是固定的,为了方便计算价格,就把价格降序,所以考虑一个递推式:.
2022-04-01 11:32:36 181
原创 等概率跑图(
绿豆蛙的归宿 - 洛谷广搜记录每条路径的每个点的概率,重复路重复记录,按权重累计求和#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=998244353;const int nn=1e5+50;inline int read(){ int x=0,f=1; char c=getchar(); while(c<'0'||c>'9') { .
2022-03-31 19:38:57 154
原创 dp优化(
[CSP-S2019] Emiya 家今天的饭 - 洛谷1.首先通过问题取反,将找都小于k/2的情况,转化为找大于k/2的情况,而这种最多有一个大于所有的一半,而每一种菜不一样,考虑枚举每一种菜2.因为可以不取,所以多的与剩下的各有自由度,所以考虑三维dp,dp[i][j][k],每一轮dp在选定的最长列为mj,所以dp[i][j][k]=dp[i-1][j-1][k]*(a[i][mj])+dp[i-1][j][k-1]*(sum[i]-a[i][mj])+dp[i-1][j][k],j为最.
2022-03-31 16:57:20 142
原创 完全背包+容斥
[HAOI2008]硬币购物 - 洛谷给定4⃣️种硬币价值,多次提问给定各个硬币个数,和商品价值,求付款方式数1.完全背包o(值域)计算不限制硬币个数在值域范围内的付款种数2.状压容斥去重#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<algorithm>using.
2022-03-30 17:22:58 156
原创 判断所有范围n,m范围内的组合数是否能被k整除,多次询问
1.对k取模,组合数到20爆int,30爆ll,判断整除问题可以用取模简化2.一些累计个数问题且有一维或多维线性累积关系时,考虑用数组递推dp处理[NOIP2016 提高组] 组合数问题 - 洛谷#include<bits/stdc++.h>using namespace std;typedef long long ll;const int nn=2000;int c[nn+5][nn+5];int ans[nn+5][nn+5];int main (){..
2022-03-25 17:25:08 293
原创 查找字符串内的子串是否存在
开个二维数组记录,第一维是所在字符下标第二维是所有种类的字符,含义为该下标往后的第二维字符最早出现的下标,从后往前预处理,对于每个子串顺序遍历即可(类似于tire)登录—专业IT笔试面试备考平台_牛客网#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mod=1e9+7;int nex[100005][27];int a[27];char s[100005];int ..
2022-03-25 16:13:30 1717
原创 二维dp求划分个数
盒子与球 - 洛谷#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;int f[15][15];int main(){ int n,r; cin>>.
2022-03-24 02:16:58 147
原创 求上一个排列
1.stl直接求#include<bits/stdc++.h>using namespace std;int n,a[10000];int main(){ cin>>n; for(int i=0;i<n;i++) //读入数据 cin>>a[i]; if(prev_permutation(a,a+n)) //如果为真就输出数组 for(int i=0;i<n;i++) .
2022-03-23 22:35:05 264
原创 打表暴力验证题目猜想的部分结论
[Celeste-B]Golden Feather - 洛谷节点值为(i+1)^2-1. 求n个点生成一颗生成树的最短总路径猜想总能找到前面的互质的数暴力打表发现只有4和10和之前的数没有互质情况,且经验证当n==4与n==10,4与10最小为3所以特殊输出,而只要往后一个就可以化解所以即利用打表暴力,将问题限制到一个有限简单的问题来处理#include<iostream>#include<cstring>#include<vector>.
2022-03-23 17:54:42 3609
原创 线性筛求欧拉函数
定点共线条件可转换为gcd即一个互质对应一条边,即求欧拉函数(注意n==1的特殊情况)[SDOI2008] 仪仗队 - 洛谷#include<bits/stdc++.h>using namespace std;const int maxn=4e4+50;//1e9超126M int phi[maxn],pri[maxn];bool ispri[maxn];int n;void solve(){ int cnt=0; memset(ispri,true,si..
2022-03-23 17:42:42 166
原创 excrt扩展剩余定理#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#
n个同余方程顺序做n次exgcd,每次以累计lcm作exgcd主元,以新mod作mod,每次ans累加一个exgcd最小值,记得每次ans取累计lcm保证最小正【模板】扩展中国剩余定理(EXCRT) - 洛谷#include<iostream>#include<cstring>#include<vector>#include<cstring>#include<cmath>#include<algorithm>#
2022-03-23 12:01:33 159
原创 中国剩余定理
求多个同余方程公共解qmul防止乘法爆ll[TJOI2009] 猜数字 - 洛谷#include<bits/stdc++.h>using namespace std;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y){ if(b==0) { x=1; y=0; return a; } ll d=exgcd(b,a%b,x,y);...
2022-03-23 09:43:22 553
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人