![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ybtoj高效进阶
crazy morning
去西之西处,驾驭长风
展开
-
《ybtoj高效进阶》第五部分第四章例题5 山谷数
题目大意当一个数字,从高位到低位上的数字没有出现先递增接着递减的现象,就被称作山谷数。求[1,n][1,n][1,n]的山谷数有多少。多组数据,结果对1e9+71e9+71e9+7取模。思路套路,设fi,j,kf_{i,j,k}fi,j,k为填i位,第i位为j,目前上升(k=1)和下降(k=2)状态为k(0表示未知)记得判前导0。code:#include<cstdio>#include<algorithm>#include<cmath>#includ原创 2021-05-27 21:13:39 · 319 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第四章例题1 B数计数
题目大意求n以内被13整除且含连续字符串13的数个数,多组数据。思路设fi,j,kf_{i,j,k}fi,j,k为前i位,%13=j,字符串包含情况为k的个数。k=0:已带有13字符串k=1:i位为1k=2:无连续13且第i位不为1。然后套路。code:#include<cstdio>#include<algorithm>#include<cmath>#include<iostream>#include<cstring>原创 2021-05-27 17:19:52 · 123 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第六章例题4 燃放烟火
题目大意一个城镇有n个烟火点,从左到右编号为1~n,每个烟火点之间距离1个单位长度。节日中有m个烟火要放,给定放的地点aia_iai,时间tit_iti。如果点燃第i个烟花时你在烟火点x,你可以获得bi−∣ai−x∣b_i-|a_i-x|bi−∣ai−x∣的开心值。你每个单位时间可以移动不超过d个单位距离。你的初始位置是任意的(初始时刻为1),求你通过移动能获取到的最大的开心值。保证烟火按时间顺序从小到大给出思路显然根据套路,设fi,jf_{i,j}fi,j为正在放第i个烟火,在j观看的最原创 2021-05-25 21:00:33 · 226 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第五章例题3 涂抹果酱
题目大意n*m的网格,有1~3任意填入,不能空,已填好第k行,问四联通不同的方案数%1e6的值。思路设fi,jf_{i,j}fi,j表示第i行填j号状态的方案数,有方程:fi,j=∑1<=k<=总数且k不与j冲突fi−1,kf_{i,j}=\sum_{1<=k<=总数且k不与j冲突}f_{i-1,k}fi,j=∑1<=k<=总数且k不与j冲突fi−1,kcode:#include<iostream>#include<algorith原创 2021-05-24 20:47:38 · 150 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第五章例题2 最短路径
题目大意给n个点,从0~n-1编号,再给出两两之间最短路径长度(必有路),求不重不漏的经过每个点(起点000,终点n−1n-1n−1)的最短路径长度。思路显然装压dp。设fx,yf_{x,y}fx,y为终点x,点遍历状态为y(二进制下1为走过,0反之),显然有f0,1=0f_{0,1}=0f0,1=0,剩余部分方程为fx,y=min(fz,yxor(2i)+disx,z)(0<=y<2n,0<=x<n且x在y的状态为走过,0<=k<n且该位合法f_{x,y}=m原创 2021-05-14 16:59:15 · 156 阅读 · 0 评论 -
《ybtoj高效进阶》第六部分第五章例题4 剪纸游戏
题目大意给定一张N∗MN*MN∗M的矩形网格纸,两名玩家轮流行动。在每一次行动中,可以任选一张矩形网格纸,沿着某一行或者某一列的格线,把它剪成两部分。首先剪出1∗11*11∗1规格的网格纸的玩家获胜。两名玩家都采取最优策略行动,求先手是否必胜。多组数据。思路设SG(i,j)SG(i,j)SG(i,j)表示i∗ji*ji∗j的SG值,按题意求解即可。code:#include<ios>#include<map>#include<new>#include&l原创 2021-05-26 20:01:09 · 204 阅读 · 1 评论 -
《ybtoj高效进阶》第六部分第五章例题3 魔法珠
题目大意Freda和rainbow玩一个游戏,起初有nnn堆魔法珠,其中第iii堆有aia_iai颗。Freda和rainbow可以轮流进行以下操作:选择nnn堆中魔法珠数量大于1的任意一堆。记该堆魔法珠的数量为ppp,ppp有b1,b2,b3,…,bmb_1,b_2,b_3,…,b_mb1,b2,b3,…,bm这mmm个小于ppp的约数。施展魔法把这一堆魔法珠变成mmm堆,每堆各有b1,b2,b3,…,bmb_1,b_2,b_3,…,b_mb1,b2,b3,…,bm颗魔法珠。选原创 2021-05-26 16:56:20 · 241 阅读 · 1 评论 -
《ybtoj高效进阶》第六部分第一章例题5 最短路径
题目大意给出一个无向图,起点sss,终点eee,ttt条边和一个正整数nnn,求从sss到eee走过最多nnn条边的最短路径长度。思路节点离散化后抽象成邻接矩阵,更新公式为fi,j=min(fi,k+fk,j)f_{i,j}=min(f_{i,k}+f_{k,j})fi,j=min(fi,k+fk,j),发现类似于矩阵快速幂,于是就这么愉快地结束了……#include<iostream>#include<cstdio>#include<algorithm>原创 2021-05-22 08:55:23 · 237 阅读 · 1 评论 -
《ybtoj高效进阶》第六部分第三章例题2 约数之和
题目大意给A,BA,BA,B,求AB的约数和mod 9901A^B的约数和\mod 9901AB的约数和mod9901思路A=p1k1∗p2k2∗…∗pnkn=>AB=p1Bk1∗p2Bk2∗…∗pnBknA=p_1^{k_1}*p_2^{k_2}*…*p_n^{k_n}=>A^B=p_1^{Bk_1}*p_2^{Bk_2}*…*p_n^{Bk_n}A=p1k1∗p2k2∗…∗pnkn=>AB=p1Bk1∗p2Bk2∗…∗pnBknAB的约数和mod 9原创 2021-05-22 08:00:53 · 262 阅读 · 0 评论 -
《ybtoj高效进阶》第六部分第一章例题4 矩阵求和
题目大意给方形(长为n)矩阵A,求(A+A2+A3+…+Ak)mod mA+A^2+A^3+…+A^k)\mod mA+A2+A3+…+Ak)modm思路设B(2n∗2n)B(2n*2n)B(2n∗2n)左上角为A,右上,右下角为单位矩阵,剩下为0,显然我们的结果是Bk+1B^{k+1}Bk+1的右上角减一个单位矩阵。code:#include<iostream>#include<cstdio>#include<algorithm>#include<原创 2021-05-20 16:06:21 · 197 阅读 · 0 评论 -
《ybtoj高效进阶》第六部分第一章例题1 序列的第k个数
题目大意给序列前3个数,该序列要么等差要么等比,求第k个数%200907的值,多组数据思路上公式就好了连公式都懒得放,上代码了code:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring> using namespace std;long long t,a,b,c,myd=200907,k;long long原创 2021-05-14 19:43:57 · 115 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第四章例题5 字符串排序
题目大意给你一个字符串,然后有一些操作,每次把一个区间的子串按升序排序或降序排序。要你输出最后的字符串。(by SSL_TJH,他太巨了)思路上26个线段树,然后把修改改成对26棵同时操作即可,详见代码/jkcode:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring> using namespace std;原创 2021-05-12 20:39:56 · 152 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第六章例题3 耗费体力
题目大意跳跳虎喜欢在树林间跳跃,它从一棵较高的树跳到一棵较矮的树不需要消耗体力,否则消耗一点体力。给出一排树,在一轮游戏的开始,跳跳虎在第111棵树,它要跳到第nnn棵树。每轮游戏有一个步伐限制 ,跳跳虎只能从第iii棵树跳到第j(i<j<=i+x)j(i<j<=i+x)j(i<j<=i+x)棵树 ,求每轮游戏最少耗费多少体力。思路显然单调队列优化dp。设fif_ifi为前i个耗费最小体力值。有fi=min(fj+是否需要耗费体力)(max(0,i−x)&l原创 2021-05-11 21:15:22 · 268 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第四章例题3 最长距离
题目大意询问树上最长距离,多组数据思路见herecode:#include<iostream>#include<algorithm>#include<cstring>#include<deque>#include<cstdio>#include<map>using namespace std;int n,a[1000101][3],tot=1,m,fa,fa2,u[1000101],head[1000101],t原创 2021-05-10 20:54:51 · 227 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第三章例题4 矩阵最值
题目大意如题,k次询问矩阵最大值,无修改思路二维st表板子code:#include<iostream>#include<string>#include<cstring>#include<map>using namespace std;int f[251][251][11][11],n,m,kkk,d[251][251],lg[251];int x,xx,y,yy;inline int read(){ int ret,c,f=原创 2021-05-10 20:38:11 · 105 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第三章例题3 与众不同
题目大意求某个给定序列a中l到r中最长的连续子序列,要求选择序列中不能有重复数字。同一序列,多个询问思路显然,设pip_ipi为以i结尾的最长序列起始点,显然有pi=max(pi−1,lastai+1)(1<=i<=n)p_i=max(p_{i-1},last_{a_i}+1)(1<=i<=n)pi=max(pi−1,lastai+1)(1<=i<=n),其中lastlastlast表示某个数上一次出现的位置,我们有ppp不下降。再设fif_ifi为i原创 2021-05-07 20:05:54 · 285 阅读 · 0 评论 -
《ybtoj高效进阶》第五部分第一章例题4 硬币方案
题目大意给n种货币,有面值和数量,求1至m间可拼出几种,多组数据。思路设aia_iai为面值,bib_ibi为数量,fif_ifi为是否可拼成,ci,jc_{i,j}ci,j为i需要多少张j种货币显然有fi=max(fi−aj(当aj<i且张数不超限)),ci,j=ci−aj,j+1(与fi同时更新)(1<=i<=m,1<=j<=n)f_i=max(f_{i-a_j}(当a_j<i且张数不超限)),c_{i,j}=c_{i-a_j,j}+1(与f_i同时原创 2021-05-06 16:51:10 · 198 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第二章例题3 严格上升子序列数
题目大意如题,多组数据思路开多个树状数组优化dpcode:#include<cctype>#include<cerrno>#include<cfloat>#include<ciso646>#include<climits>#include<clocale>#include<cmath>#include<csetjmp>#include<csignal>#include<原创 2021-05-05 10:16:12 · 105 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第二章例题5 单点修改区间查询
题目大意二维树状数组板子思路板子要什么思路#include<cctype>#include<cerrno>#include<cfloat>#include<ciso646>#include<climits>#include<clocale>#include<cmath>#include<csetjmp>#include<csignal>#include<cstdarg&原创 2021-05-05 10:08:15 · 92 阅读 · 0 评论 -
《ybtoj高效进阶》第三部分第四章例题4 恒星的亮度
题目大意给n个点,点权为>=1的整数,给m个关系,形如c x y,表示点x与点y的关系(c=1为相等,c=2为>,c=3为<=,c=4为<,c=5为>=),求最小点和思路差分约束系统建图: for (long long i=1;i<=m;i++) { cin>>yyyyy>>x>>y; if (yyyyy==1) add(x,y,0),add(y,x,0); if (yyyyy==2) add(x,y,1);原创 2021-05-04 15:18:54 · 159 阅读 · 0 评论 -
《ybtoj高效进阶》第三部分第三章例题2 负环判断
题目大意给定一个 n 个点的有向图,请求出图中是否存在从顶点 1 出发能到达的负环。负环的定义是:一条边权之和为负数的回路。有输出YE5,否则输出N0(我没打错字)思路显然spfa判断负环的水题code:#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int head[2001],d[2001],n,m,k,tot原创 2021-03-30 21:11:57 · 182 阅读 · 0 评论 -
《ybtoj高效进阶》第三部分第二章例题4 构建完全图
题目大意给树一颗,求以该树为最小生成树的完全图的最小边权和思路既然是最小生成树,显然我们需要用到并查集。同时,我们发现2个联通块相互连接时,花费如下:设块1点的个数为x,块2为y,该最小生成树的边中连接2块的边权为v。则为:(x∗y−1)∗(v+1)+v(x*y-1)*(v+1)+v(x∗y−1)∗(v+1)+v.最后,记得long long。code:#include<iostream>#include<algorithm>using namespace std原创 2021-03-30 20:43:08 · 68 阅读 · 0 评论 -
《ybtoj高效进阶》第三部分第二章例题3 公路建设
题目大意动态求最小生成树边长/2的值思路每次kraskal一次求解,同时是动态,所以用插排,最后,如果前面未被加入的显然可以滚了code:#include<cstring>#include<algorithm>#include<cmath>#include<iostream>#include<cstdio>using namespace std;int n,m,x,y,z,tot=1,u;int ans;int f[500原创 2021-03-30 20:38:19 · 115 阅读 · 0 评论 -
《ybtoj高效进阶》第三部分第二章例题2 新的开始
题目大意PRIM模板思路模板要什么思路code:#include<cstring>#include<algorithm>#include<cmath>#include<iostream>#include<cstdio>#include<queue>using namespace std;struct f{ int x,id;} x;bool operator <(const f &x,cons原创 2021-03-30 20:33:46 · 90 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第五章例题3 屏蔽词删除
题目大意有一个字符串,然后又一些指定的小串。你会从头开始找到第一个字符串的子串使得它是某个小串,然后把这个串从字符串中删除。然后继续重复这个操作,知道找不到这些小串在字符串中出现。问你最后的字符串。思路把屏蔽词插入自动机,然后跑AC自动机,按题目要求删除字符即可。code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cs原创 2021-03-26 21:31:04 · 121 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第五章例题3 前缀匹配
题目大意给n个子串和一个母串,求每个子串前缀在母串上的最大匹配长度思路先把母串能够匹配的节点标记一次(AC自动机),再把所有子串跑一次自动机,若跑到的节点有标记,则至少匹配到现在枚举的那一位。code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<queue> using原创 2021-03-26 20:47:35 · 135 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第五章例题2 单词频率
题目大意有 n 个单词,然后问你每个单词在这些单词中出现了多少次。思路显然的AC自动机,这时我们考虑每一个节点到根的字符串是多少字符的前缀即可。code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<queue> using namespace std;int trie[原创 2021-03-26 20:26:28 · 148 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第五章例题1 单词查询
题目大意AC自动机板子,多组数据思路不说了,详见代码code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<queue> using namespace std;int trie[1000006][26],tot=1,ed[1000006],nxt[1000006],n,原创 2021-03-26 20:01:46 · 132 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第四章例题1 前缀统计
题目大意有一堆字符串,然后每次有一个询问,问一个有多少个字符串是一个给出的字符串的前缀。思路这不就是trie计数板子题?code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<cmath> using namespace std;int trie[1000006][26]原创 2021-03-25 21:03:33 · 57 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第三章例题4 子串拆分
题目大意问你在一个字符串中,有多少个ABAABAABA形的子串(B的长度>=1)。位置不同其他性质相同的子串算不同子串,位置相同但拆分不同的子串算同一子串。思路我们暴力枚举该字符串左端点,然后对新串KMP求解。大概就是考虑现在匹配到的位置前面是否有同样的一段且中间至少空了一个。code:#include<iostream>#include<cstdio>#include<algorithm>#include<string>using原创 2021-03-25 20:32:42 · 146 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第三章例题2 重复子串
题目大意设一个字符串是由x个重复的子串构成的,求x的最大值多组数据,以输入’.'为结束。思路显然一个自我KMP匹配,设该串为A,则若∣A∣mod (∣A∣−p∣A∣)=0|A|\mod(|A|-p_{|A|})=0∣A∣mod(∣A∣−p∣A∣)=0,有重复子串,重复次数为∣A∣(∣A∣−p∣A∣)|A|\over(|A|-p_{|A|})(∣A∣−p∣A∣)∣A∣,否则为1.code:#include<iostream>#include<cstdio>#i原创 2021-03-25 16:56:22 · 89 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第三章例题1 子串查找
题目大意KMP求匹配串在模式串中出现的次数。思路KMP板子不解释。code:#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;int p[1000006],n,m,ans;string a,b;inline void f(){ p[1]=0; int i=1,j=0; while (i<m)原创 2021-03-25 16:43:24 · 75 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第二章例题5 子正方形
题目大意给2个正方形,求最大公共子正方形的边长。2个正方形边长<=50思路显然可以通过二维hash+二分答案+暴力枚举达到目的code:#include<iostream>#include<cstdio>#include<algorithm>#include<cstdlib>using namespace std;int a[1001][1001],b[1001][1001],ans;int n,m;unsigned long原创 2021-03-24 20:24:15 · 90 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第一章例题5 生日相同
题目大意在一个大班级中,存在两个人生日相同的概率非常大,现给出每个学生的名字,出生月日。试找出所有生日相同的学生。对所有的输出,要求按日期从前到后的顺序输出。对生日相同的名字,按名字从短到长按序输出,长度相同的按字典序输出。思路额,显然是结构体+排序,过分的水code:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct f{ int x,y;原创 2021-02-17 12:03:26 · 425 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第一章例题4 字符串环
题目大意有两个由字符构成的环。计算这两个字符环上最长连续公共字符串的长度。思路不想解释……这题,不要KMP,不要最小表示法,只要暴力就能过……code:#include<iostream>#include<cstdio>using namespace std;int main(){ string a,b,c; cin>>a>>b; if (a.size()>b.size()) swap(a,b); int n=a.size(原创 2021-02-17 11:57:12 · 165 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第一章例题3 单词替换
题目大意输入一个字符串,以回车结束。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。思路就是考察选手的字符串处理,水题code:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;s原创 2021-02-17 11:33:54 · 144 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第一章例题2 移位包含
题目大意给2个字符串,求一个是否是另一个的循环同构串的子串思路枚举循环起始点比较(有手就行)code:#include<iostream>#include<algorithm>#include<string>#include<cmath>using namespace std;string a,b;int main(){ cin>>a>>b; if (a.size()<b.size()) swap(a,原创 2021-02-05 11:23:19 · 83 阅读 · 0 评论 -
《ybtoj高效进阶》第二部分第一章例题1 字符串翻转
题目大意给一个不一定非负的整数,翻转它,不要前导0思路有手就行先判负,然后去0,最后递归倒序输出code:#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>using namespace std;string n;void g(string x){ if (x=="") return; g(x.su原创 2021-02-05 11:17:32 · 66 阅读 · 0 评论 -
《ybtoj高效进阶》第四部分第二章例题2 程序自动分析&P1955
题目描述在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。考虑一个约束满足问题的简化版本:假设 x1,x2,x3,⋯x_1,x_2,x_3,\cdotsx1,x2,x3,⋯ 代表程序中出现的变量,给定 n 个形如 xi=xjx_i=x_jxi=xj 或 xi≠xjx_i\neq x_jxi=xj 的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件为:x1=x2,x2=x3,x3=x4,x4原创 2021-01-23 11:33:39 · 228 阅读 · 0 评论 -
《ybtoj高效进阶》第一部分第四章例题3 虫食算&P1092
题目大意给一组n进制加法竖式,位数必为n,可以有前导零,每个字母对应一个不同的数字,求一组解。保证有解且唯一。思路我们显然只能用dfs解决该题目,所以需要剪枝剪枝1:我们模拟手动计算,如果在当前情况下已经无解马上回溯剪枝2:因为解有且唯一,我们一旦找到解就马上输出并结束程序code:#include<cstdio>#include<queue>#include<iostream>#include<map>#include<cstri原创 2021-01-23 07:26:46 · 111 阅读 · 0 评论