- 博客(302)
- 收藏
- 关注
原创 P6218&&ybtoj【动态规划】3章2题【Round Numbers S】
Round Numbers S题目P6218解析算是一个比较奇奇怪怪的数位DP考虑数位DP,为了方便,采用DP而非DFS,然后递推组合数计算即可只能计算到n-1!!!code:#include<cstdio>using namespace std;int l,r,dp[33][33],ch[33],tot,C[33][33];inline int bf(int n){ if(!n)return 0; tot=0; int o0=0,o1=0,ans=0; for
2021-07-07 20:26:53
312
1
原创 ybtoj【动态规划】5章2题【最短路径】
最短路径题目解析发现n≤20n\leq 20n≤20,不妨考虑复杂度为O(n2n)O(n2^n)O(n2n)的算法发现每个点只有两种状态,考虑二进制状压,然后设dpi,jdp_{i,j}dpi,j为状态j(i=popcount(j)i=popcount(j)i=popcount(j))(popcount即二进制下1的个数),枚举状态转移即可code:#include<cstdio>#include<cstring>using namespace std;inl
2021-07-07 14:55:41
227
原创 ybtoj【数学基础】1章4题【最短路径】
最短路径题目解析点太多,考虑离散化离散化完发现可以使用O(23t3logn)O(2^3t^3\log n)O(23t3logn)的矩阵乘法加速,改一下式子就好了zi,j=min(xi,k+yk,j)(1<=k<=tot)z_{i,j}=min(x_{i,k}+y_{k,j})(1<=k<=tot)zi,j=min(xi,k+yk,j)(1<=k<=tot)code:#include<cstdio>#include<algori
2021-06-19 16:43:25
256
原创 UVA10140&&ybtoj【数学基础】2章2题【Prime Distance】
Prime Distance题目UVA10140解析发现LLL和RRR都大到不可做,但R−LR-LR−L却被限制在了100000010000001000000以内,考虑筛出222到R\sqrt RR内的质数,然后每次筛出LLL至RRR的合数,最后线性跑一下就好了code:#include<cmath>#include<cstdio>#include<cstring>using namespace std;int p[1000010],tot;lo
2021-06-19 15:12:51
103
原创 P6474&&ybtoj【基础算法】5章4题【荆轲刺秦王】
荆轲刺秦王题目P6474解析显然,这是一道广搜先考虑给每一个士兵能看到的点打标记,发现暴力打标记是O(n2m2)O(n^2m^2)O(n2m2)的,可以通过前缀和优化到O(n2m)O(n^2m)O(n2m)打完标记,直接慢慢敲广搜即可注意事项个人提醒:本人曾经写过95分,后来发现是第18个数据跑了7秒,所以请各位把register拆出来,并吸氧等以卡常,写得优美一些code:#include<queue>#include<cstdio>#include<
2021-06-19 11:47:38
330
原创 ybtoj【基础算法】5章3题【立体推箱子】
立体推箱子题目解析考虑设三个状态:dx,y,0d_{x,y,0}dx,y,0表示立在(x,y)(x,y)(x,y)dx,y,1d_{x,y,1}dx,y,1表示倒在(x,y),(x,y−1)(x,y),(x,y-1)(x,y),(x,y−1)dx,y,2d_{x,y,2}dx,y,2表示倒在(x,y),(x−1,y)(x,y),(x-1,y)(x,y),(x−1,y)直接BFS即可code:#include<queue>#include<cstdio>
2021-06-19 11:26:50
101
原创 P4667&&ybtoj【基础算法】5章5题【Switch the Lamp On】
Switch the Lamp On题目P4667解析显然,这一道题中,每个元件都可以旋转,因此本题等价于一道01BFS,只需使用deque即可01BFS:在边权只有0/1的情况下,我们可以使用01BFS在O(n+m)O(n+m)O(n+m)的时间内解决当边权为0时,我们把它塞入队头反之塞入队尾,即可维护两段性和单调性ybtoj带多测code(洛谷):#include<deque>#include<cstdio>#include<cstring>
2021-06-19 11:14:46
133
原创 P1297&&ybtoj【数学基础】6章1题【单选错位】
单选错位题目P1297解析显然,当两道题选项数不同时,做对的概率为较大的一个,因此直接做即可code:#include<cstdio>#include<algorithm>using namespace std;int n,A,B,C,a[10000010];double ans;int main(){ scanf("%d%d%d%d%d", &n, &A, &B, &C, a + 1);for (register int
2021-06-19 11:06:09
109
原创 P1092&&ybtoj【基础算法】4章3题【虫食算】
虫食算题目P1092解析当然了,这题可以用高斯消元做,但是暴搜不香吗?友情提示:本人代码存在适当压行,仅有26行,请谨慎使用考虑进位,不难发现进位最多只有1,于是根据这样剪一下枝,就从O(n!)O(n!)O(n!)变成了O(可过)O(可过)O(可过)code:#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;int n,a[30],b[30],c[30],d
2021-06-19 10:46:18
77
原创 P4170&&ybtoj【动态规划】2章2题【涂色】
涂色题目P4170解析仿照石子合并的DP,不难弄出一个转移方程:dpi,i=1dp_{i,i}=1dpi,i=1dpi,j={min(dpi,j−1,dpi+1,j)(si==sj)min(dpi,k+dpk+1,j(i<=k<j))(si!=sj)dp_{i,j}=\left\{\begin{matrix}min(dp_{i,j-1},dp_{i+1,j})(s_i==s_j)\\min(dp_{i,k}+dp_{k+1,j}(i<=k<j))(s_i!=s_j)\
2021-06-18 21:01:48
92
原创 ybtoj【动态规划】1章4题【硬币方案】
硬币方案题目解析显然的背包,考虑用记录到一个方案的最少当前硬币数量,不难转移,于是就AC了code:#include<cstdio>#include<cstring>using namespace std;int n,m,a[110],t,tot[100010],ans;bool dp[100010];int main(){ while(scanf("%d%d",&n,&m)&&n&&m) { mems
2021-06-18 20:31:12
112
原创 P1776&&ybtoj【动态规划】1章3题【宝物筛选】
宝物筛选题目宝物筛选解析考虑直接多重背包,但发现数据过大,直接二进制优化即可不懂二进制优化的可以看一下这篇题解code:#include<iostream>#include<cstdio>using namespace std;int q,dp[40010],x,y,z,n,s=0;void ddp(int xx,int yy){ for(int i=n;i>=xx;i--)dp[i]=max(dp[i],dp[i-xx]+yy); return;
2021-06-18 20:25:34
103
原创 P1463&&ybtoj【数学基础】2章4题【反素数】
反素数题目P1463解析1,打表(需要其他做法)2,DFSDFS十个质数即可3,利用高合成数的特性来做code:#include<cstdio>#define int long longusing namespace std;int n,pr[11]={0,2,3,5,7,11,13,17,19,23,29},ch[11],ans=1e18,anss=1;inline void dfs(int x,int y,int z){ if(x==11){if(z>
2021-06-18 20:15:51
89
原创 P3805&&ybtoj【字符串算法】2章2题【【模板】manacher算法】
【模板】manacher算法题目P3805解析关于回文子串问题,有很多种做法:1,O(n3)O(n^3)O(n3)直接O(n2)O(n^2)O(n2)枚举,然后O(n)O(n)O(n)判断2,O(n2)O(n^2)O(n2)O(n)O(n)O(n)枚举中点,O(n)O(n)O(n)扩展3,O(nlogn)O(n\log n)O(nlogn)O(n)O(n)O(n)枚举中点,O(logn)O(\log n)O(logn)二分相等长度,哈希判相等4,O(n)O(n)O(n)枚举中点
2021-06-18 20:00:44
72
原创 P5020&&ybtoj【动态规划】1章2题【货币系统】
货币系统题目P5020解析答案显然,直接上bool数组判一下可行,直接dp即可code:#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[110],n,T,ans;bool dp[25010];int main(){ scanf("%d",&T); while(T--) { scanf("%d",&n),ans=n
2021-06-18 19:28:57
77
原创 P1784&&ybtoj【基础算法】4章2题【数独】
数独题目P1784解析暴力DFS会当场T飞,考虑优化:1,优先DFS数量少的位置2,位运算code(洛谷):#include<cstdio>#define rr register intusing namespace std;int ma[9][9],a[9],b[9],c[9],ha[257],ch[512],tot;inline int f(int x,int y){return x/3*3+y/3;}inline int lowbit(int x){return
2021-06-18 19:11:29
85
原创 ybtoj【基础算法】4章1题【拔河比赛】
拔河比赛题目解析暴力DFS枚举套背包模板即可code:#include<iostream>#include<cstring>#include<cstdio>using namespace std;int n,a[30],b[30],m,x,y,t;bool dp[2410][30];int ab(int d){return max(d,-d);}int main(){ scanf("%d",&t); while(t--
2021-06-18 18:59:43
181
原创 P1404&&ybtoj【基础算法】3章3题【平均数】
平均数题目P1404解析发现直接做很麻烦,考虑判定一个答案,发现只需要判定是否>0,于是有显然的线性做法然后既然有了判定,显然二分答案直接上code:#include<cstdio>#include<iostream>using namespace std;inline bool idigit(char x){return (x<'0'|x>'9')?0:1;}inline int read(){ int num=0,f=1; char
2021-06-18 18:47:12
58
原创 ybtoj【基础算法】3章2题【防具布置】
防具布置题目解析发现直接算答案不好做,考虑二分答案首先先判无解,然后二分答案即可code:#include<cstdio>#define int long longusing namespace std;inline bool idigit(char x){return (x<'0'|x>'9')?0:1;}inline int read(){ int num=0,f=1; char c=0; while(!idigit(c=getchar())){
2021-06-18 18:20:15
87
原创 P2444&&ybtoj【字符串算法】5章5题【病毒】
病毒题目P2444解析首先要明白:若存在合法解,则一定有无限循环于是考虑构造AC自动机,发现一个点的危险标记可以转移到一个nxtnxtnxt为它的点,于是BFS时处理即可,然后DFS找环,找到就TAK,找不到就NIE当然了,要对每个节点只进行一次访问,不然ybtoj会T掉两个点(洛谷脚造的数据,这都不卡)code:#include<queue>#include<cstdio>#include<cstring>#include<cstdlib&
2021-06-14 11:29:06
85
原创 ybtoj【字符串算法】5章4题【屏蔽词删除】
屏蔽词删除题目解析先拿屏蔽词建AC自动机,然后拿S去跑AC自动机,同时维护一个栈,每压入一个字符,check一下有没有屏蔽,有的话就弹出∣该屏蔽词∣|该屏蔽词|∣该屏蔽词∣个即可最后栈中剩下的字符即为答案code:#include<queue>#include<cstdio>#include<cstring>#include<iostream>using namespace std;char s[100010],q[100010],s
2021-06-13 16:40:13
112
原创 ybtoj【字符串算法】5章3题【前缀匹配】
前缀匹配题目解析查询串考虑前缀,故不难想到拿查询串建,母串跑,跑到的点的nxtnxtnxt显然也合法,跳失配标记,就标记出了母串的子串然后再拿查询串跑一遍,就好了code:#include<queue>#include<cstdio>#include<string>#include<cstring>using namespace std;inline int f(char s){return (s=='S')?0:((s=='E')?
2021-06-13 15:40:32
152
原创 ybtoj【字符串算法】5章1题【单词查询】
单词查询题目解析AC自动机,顾名思义,就是能自动AC前置知识:KMP,trie众所周知,当只有一个串时,可以使用KMP来解决这个问题但是,当有多个串时,文本串会匹配n次,继而产生O(nm)O(nm)O(nm)的复杂度那么我们考虑用一些奇奇怪怪的数据结构来解决这个问题,而单论存储,显然trie是最优的插入完后考虑查询,首先需要预处理nxtnxtnxt,为了同时匹配多个模式串,我们需要使得nxtnxtnxt可以跨模式串转换于是我们考虑使用一个BFS处理,然后要利用trie的性质,加上跳转移
2021-06-13 10:55:05
151
原创 P4551&&ybtoj【字符串算法】4章3题【最长异或路径】
最长异或路径题目P4551解析考虑推一下两个点之间的距离式子:dx,y=dx,LCA(x,y) xor dLCA(x,y),yd_{x,y}=d_{x,LCA(x,y)}\;xor\;d_{LCA(x,y),y}dx,y=dx,LCA(x,y)xordLCA(x,y),y再异或上两个d1,LCA(x,y)d_{1,LCA(x,y)}d1,LCA(x,y)得dx,y=d1,x xor d1,yd_{x,y}=d_{1,x}\;xor\;d_{1,y}dx,y=d1,xxord
2021-06-13 10:07:43
80
原创 ybtoj【字符串算法】4章2题【最大异或对】
最大异或对题目解析看一眼数据范围,发现要带一只log考虑如何计算:我会线性基!我会AC自动机!我会Trie!考虑异或是可以单位处理,且高位贡献比低位贡献优,就可以把原数拆成二进制,然后当成字符串插入然后再依次检索,检索时为了更优,只需要判断相反路径可不可以走就可以了时间复杂度O(nlogSIZE)O(n\log SIZE)O(nlogSIZE)因为logSIZE\log SIZElogSIZE固定在323232所以是线性的code:#include<cstring>
2021-06-13 09:59:17
88
原创 ybtoj【字符串算法】4章1题【前缀统计】
前缀统计题目解析字典树(trie):一种用于实现字符串快速检索的多叉树结构,空间复杂度为O(NS)O(NS)O(NS),支持插入/检索它的插入/检索方法是这样的:初始时设当前节点为1,然后扫描该字符串,每扫描到一个字符,就从当前节点走向对应的子节点,若没有子节点,则采用类似于线段树动态开点的方法,新建一个节点它的优势是什么呢?1,实现简单2,可以线性检索前缀学会这一点后,我们只需要插入N个字符串,再检索一遍就可以了code:#include<iostream>#in
2021-06-13 09:46:55
68
原创 ybtoj【字符串算法】3章4题【子串拆分】
子串拆分题目解析先看数据范围……卡常O(n2)O(n^2)O(n2)还是考虑使用KMP(常数小的线性做法),考虑枚举左端点,设A=Sl,∣S∣A=S_{l,|S|}A=Sl,∣S∣,对AAA跑KMP,求出nxtnxtnxt数组,然后再跑一次KMP,额外在尝试匹配后不断跳长度过大的失配,最后判断即可code:#include<iostream>#include<cstring>#define rr register intusing namespace std;
2021-06-13 09:08:28
95
原创 P3435&&ybtoj【字符串算法】3章3题【OKR-Periods of Words】
OKR-Periods of Words题目P3435解析线性做法,不妨考虑KMPDC3是什么鬼东西求出nxtnxtnxt后,因为nxtnxtnxt是最大公共前后缀的长度,所以i−nxtii-nxt_ii−nxti就是一个周期(因为显然有s1,nxti=si−nxti+1,ns_{1,nxt_i}=s_{i-nxt_i+1,n}s1,nxti=si−nxti+1,n)于是直接沿nxtnxtnxt记忆化路径压缩递归即可code:#include<cstdio>#inc
2021-06-13 08:50:35
64
原创 ybtoj【字符串算法】3章2题【重复子串】
重复子串题目解析看一眼数据,就猜得到只能用线性做法考虑线性做法,用KMP求出nxtnxtnxt数组,此时显然有s1,nxtn=sn−nxtn,ns_{1,nxt_n}=s_{n-nxt_n,n}s1,nxtn=sn−nxtn,n,那么只需要考虑nnn模(n−nxtn)(n-nxt_n)(n−nxtn)是不是0就可以判断有没有了,而nn−nxtn\frac{n}{n-nxt_n}n−nxtnn就是有时的答案code:#include<cstdio>#include&
2021-06-13 08:38:07
134
原创 P3375&&ybtoj【字符串算法】3章1题【【模板】KMP字符串匹配】
【模板】KMP字符串匹配题目P3375ybtoj只需要输出出现次数解析KMP算法的名字是来源于三位发明者*Knuth(D.E.Knuth)&Morris(J.H.Morris)&Pratt(V.R.Pratt)*的名字,其特点是线性考虑设nxtinxt_inxti为s1,is_{1,i}s1,i的最大公共前后缀(即题意中的border)显然有nxt1=0nxt_1=0nxt1=0考虑nxtnxtnxt递推,发现可以成为nxtinxt_inxti的备用解只有nxti−
2021-06-12 20:23:06
65
原创 ybtoj【字符串算法】1章3题【单词替换】
单词替换题目解析发现直接查找很麻烦(难以判断是否独占一个单词),所以在三个字符串的左右两边都加上一个空格,然后使用find函数就可以了可以保存上一个查找到的位置,以优化效率code:#include<cstdio>#include<string>#include<iostream>using namespace std;string x,y,z;char t;int ly,k,l;int main(){ x=" "; do{cin>
2021-06-12 19:27:04
124
原创 ybtoj【字符串算法】1章2题【移位包含】
移位包含题目解析直接暴力移位,然后用find判一下即可code:#include<iostream>#include<cstdio>#include<string>using namespace std;string x,y;int main(){ cin>>x>>y; if(x.size()<y.size())swap(x,y); for(register int l=x.size(),i=x.size();
2021-06-12 16:44:50
59
原创 P1307&&ybtoj【字符串算法】1章1题【数字反转】
数字反转题目P1307解析显然的字符串翻转,先特判掉负号,再判掉结尾0即可code:#include<cstdio>#include<cstring>using namespace std;char a[11];int n,len;int main(){ scanf("%s",a); if(a[0]=='-')putchar('-'),n=1; len=strlen(a)-1; while(a[len]=='0')--len; while(len&
2021-06-12 16:30:21
54
原创 P2272&&ybtoj【图论】4章3题【最大半连通子图】
最大半连通子图题目P2272解析看一下定义,发现强连通分量一定是半连通子图,直接tarjan缩点建DAG然后想一下,发现剩下的在DAG上都是单链结构,于是拓扑DP统计即可发现建重边会影响答案,去重即可code:#include<queue>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;inline int max(int x,int y
2021-06-12 11:15:00
69
原创 P3387&&ybtoj【图论】4章1题【【模板】缩点】
【模板】缩点题目P3387解析发现权值非负,显然多走更优珂以设置一个像bellman-ford一样的东西,不断更新,但显然会T考虑拓扑,但会出现环万恶的tarjan算法出现了!先扔概念:DFS树(搜索树):DFS中访问到的点及走过的边DFS序(dfn):DFS中访问顺序的id树枝边:即走过的边深度:在DFS树上与根节点的距离前向边:从深度小的节点指向深度大的节点的非树枝边后向边:从深度大的节点指向深度小的节点的非树枝边横叉边:横跨两段树枝的非树枝边连通:可以互相到达连通分
2021-06-12 10:59:50
67
原创 P4009&&ybtoj【图论】3章4题【汽车加油行驶问题】
汽车加油行驶问题题目P4009解析这是一道费用流题,然而却被spfa等做法暴切考虑分层图最短路,按剩余油量分层,枚举各种转移即可PS:本来想打堆优化dij,后来打挂了,最后选择了spfacode:#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;int n,k,sx,sy,ss,use,tx,ty,dx[4]={
2021-06-12 10:01:06
164
原创 P1073&&ybtoj【图论】3章3题【最优贸易】
最优贸易题目P1073解析这道题有很多种解法:暴力DP,tarjan缩点+拓扑DP,两遍spfa等等这里我们讲分层图+spfa分层图:在残量网络中,满足d[y]=d[x]+1的边(x,y)构成的子图被称为分层图将每个状态作为一层图,并在可转换的层间建图,即为分层图像这样:(图片 by fy1234567ok)于是直接跑一遍spfa即可这种鬼畜图是卡不了spfa的,所以复杂度为O(k(n+m))O(k(n+m))O(k(n+m))code:#include<cstring&
2021-06-12 09:39:41
63
原创 P3385&&ybtoj【图论】3章2题(崩了)【【模板】负环】
【模板】负环题目P3385解析如何判负环:1,判入队次数2,判经过点数判松弛次数可以卡掉ybtoj直接上代码,因为std崩了(多测没清空队列),导致数据崩了(而且输出的还是YE5和N0)code(洛谷判入队次数1.03s):#include<queue>#include<cstdio>#include<cstring>using namespace std;int n,m,x,y,z,head[2010],ans[2010],sum[2010
2021-06-12 08:54:34
49
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人