
《YbtOJ——高效进阶》
文章平均质量分 51
《YbtOJ——高效进阶》
SSL_kyx
简~介
展开
-
树状数组 “详” 解
简介树状数组就是一种能在O(log n)内查询或修改的数据结构,它的代码极其简洁,是水题党的好帮手 适合解决单点修改与区间查询。其大概的结构是这样的:其中AAA数组就是我们的树状数组,Ai=1A_i=1Ai=1~ iii之和,即前缀和。val代表数据的权值。思路每次将一个点进行修改时,就将它所对应的树状数组以及它的父节点更新:void update(int x,int y){ for(; x<=n; x+=x&-x) A[x]+=y;}每次查询时,...原创 2021-12-25 15:13:21 · 429 阅读 · 0 评论 -
YbtOJ——字典树【例题2】最大异或对
B. 【例题2】最大异或对题目思路两个数不同位越靠前,异或结果越大,将每个二进制数当做一个字符串从高位到低位存入trie,然后对于每个数,在trie中寻找最优解。代码#include<bits/stdc++.h>using namespace std;const int mx=32;long long trie[10000001][2],lt=1,n,m,a[10000001],ans;void in(long long s){ int p=1; for(int i原创 2021-12-11 16:53:53 · 390 阅读 · 0 评论 -
YbtOJ——最小生成树【例题1】繁忙都市
A. 【例题1】繁忙都市题目思路模板最小生成树,用kruska,将边按权值从小到大排序,然后用并查集判断一边的两端点是否在同一棵树中,如果不在,则将此边加进最小生成树中。代码#include<bits/stdc++.h>using namespace std;int fa[100001],ans1,ans2,n,m;struct node{ int u,v,c;}a[100001];bool cmp(node x,node y){ return x.c<y.c原创 2021-12-18 09:34:56 · 199 阅读 · 0 评论 -
YbtOJ——最小生成树【例题2】新的开始
B. 【例题2】新的开始题目思路最小生成树,先将每个点与0号点相连,边权为建立发电站的费用,然后用kruska,将边按权值从小到大排序,然后用并查集判断一边的两端点是否在同一棵树中,如果不在,则将此边加进最小生成树中。代码#include<bits/stdc++.h>using namespace std;int fa[100001],ans,n,m,t;struct node{ int u,v,c;}a[100001];bool cmp(node x,node y)原创 2021-12-18 10:26:10 · 419 阅读 · 0 评论 -
YbtOJ——并查集【例题1】【模板】并查集
A. 【例题1】【模板】并查集题目思路模板并查集代码#include<bits/stdc++.h>using namespace std;int fa[100001],n,m,x,y,z; int find(int x)//查找{ if(fa[x]!=x) return fa[x]=find(fa[x]); return x;}void merge(int x,int y)//合并{ int fx=find(x),fy=find(y); fa[fx]=fy;原创 2021-12-11 17:20:34 · 333 阅读 · 0 评论 -
YbtOJ——字典树【例题1】前缀统计
A. 【例题1】前缀统计题目思路字典树的模板题。代码#include<bits/stdc++.h>using namespace std;long long trie[100001][300],lt=1,n,m,end[100001];string s;char ch;void in(string s)//插入字符串{ long long n=s.size(),p=1; for(int i=0;i<n;++i) { int ch=s[i]-'a'; i原创 2021-12-04 11:16:55 · 250 阅读 · 0 评论 -
YbtOJ——Hash 和 Hash 表【例题1】字符串哈希
A. 【例题1】字符串哈希题目思路设 p[i]p[i]p[i] 表示字符串111 ~ (i−1)(i-1)(i−1)的最长相同前缀后缀,则:若 n%(n−p[n])==0n\%(n-p[n])==0n%(n−p[n])==0,答案为 n/(n−p[n])n/(n-p[n])n/(n−p[n])否则,答案为 1。代码#include<iostream>using namespace std;string s;char ch;int n,p[1000001];void pr原创 2021-08-08 19:51:01 · 166 阅读 · 0 评论 -
YbtOJ——KMP 算法【例题3】周期长度和
C. 【例题3】周期长度和题目思路设 p[i]p[i]p[i] 表示字符串111 ~ (i−1)(i-1)(i−1)的最长相同前缀后缀,则:若 n%(n−p[n])==0n\%(n-p[n])==0n%(n−p[n])==0,答案为 n/(n−p[n])n/(n-p[n])n/(n−p[n])否则,答案为 1。代码#include<iostream>#include<cstdio>#include<cstring>using namespace st原创 2021-08-08 19:34:24 · 179 阅读 · 0 评论 -
YbtOJ——KMP 算法【例题2】重复子串
B. 【例题2】重复子串题目思路设 p[i]p[i]p[i] 表示字符串111 ~ (i−1)(i-1)(i−1)的最长相同前缀后缀,则:若 n%(n−p[n])==0n\%(n-p[n])==0n%(n−p[n])==0,答案为 n/(n−p[n])n/(n-p[n])n/(n−p[n])否则,答案为 1。代码#include<iostream>using namespace std;string s;char ch;int n,p[1000001];void pre原创 2021-08-08 11:55:48 · 178 阅读 · 0 评论 -
YbtOJ——KMP 算法【例题1】子串查找
A. 【例题1】子串查找题目终于学会了KMP !板子就不解释了,贴上一篇别人的KMP好文:数据结构KMP算法配图详解(超详细)代码#include<iostream>using namespace std;string a,b;int p[100001],n,ans;void in(){ cin>>a>>b;}void pre(string s)//预处理最长相同前缀后缀{ p[0]=-1; p[1]=0; int j=0,k=-1;原创 2021-07-09 15:18:52 · 261 阅读 · 0 评论 -
YbtOJ——字符串处理【例题5】生日相同
E. 【例题5】生日相同题目代码#include<iostream>#include<cstring>using namespace std;string s,s1,s2;int l1,l2;void in(){ cin>>s, s1=s+s;//模拟首尾相连的环 cin>>s, s2=s+s;//模拟首尾相连的环 l1=s1.size(); l2=s2.size(); if(l1>l2)//短的在前,长的在后 { s原创 2021-07-08 11:44:35 · 209 阅读 · 0 评论 -
YbtOJ——字符串处理【例题4】字符串环
D. 【例题4】字符串环题目将源输入的字符串复制一份插到后面,模拟首尾相连的环。然后查找连续公共子串即可。代码#include<iostream>#include<cstring>using namespace std;string s,s1,s2;int l1,l2;void in(){ cin>>s, s1=s+s;//模拟首尾相连的环 cin>>s, s2=s+s;//模拟首尾相连的环 l1=s1.size(); l2=s原创 2021-07-08 11:31:18 · 170 阅读 · 0 评论 -
YbtOJ——字符串处理【例题3】单词替换
C. 【例题3】单词替换题目被输入坑了几次,OJ上测是不能直接getline的。我用了一种比书上简单点的方法,注释里看。代码#include<iostream>#include<cstring>using namespace std;string s[100001],a,b;int n;void in(){ char space; do { cin>>s[++n];//输入单词 space=getchar();//输入空格 } w原创 2021-07-08 09:58:30 · 155 阅读 · 0 评论 -
YbtOJ——二分算法【例题3】最大均值
C. 【例题3】最大均值题目若一个长度不小于LLL的子段平均值为midmidmid,那么该子段的每个数都减去midmidmid后,子段和为0。若一个长度不小于LLL的子段平均值小于midmidmid,那么该子段的每个数都减去midmidmid后,子段和为负。若一个长度不小于LLL的子段平均值大于midmidmid,那么该子段的每个数都减去midmidmid后,子段和为正。二分答案midmidmid,将序列每数减去midmidmid,找出前缀和求出平均值最大的子段之和,并做上面的判断。代码#i原创 2021-07-08 09:28:19 · 182 阅读 · 0 评论 -
YbtOJ——二分算法【例题2】防具布置
B. 【例题2】防具布置题目设S(i)S(i)S(i)为0~iii中所有的防具若破绽在位置mid,那么S(l)S(l)S(l)为偶数,S(r)S(r)S(r)为奇数(l<mid≤rl<mid\leq rl<mid≤r)二分答案代码#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#include<queue>#defi原创 2021-07-07 21:22:34 · 122 阅读 · 0 评论 -
YbtOJ——二分算法【例题1】数列分段
A. 【例题1】数列分段题目题解假设最优解为sumsumsum,那么sumsumsum越大,分成的段数就越小;sumsumsum越小,分成的段数就越大。所以答案符合单调性,可以用二分判定:若最优解为sumsumsum分成的段数小于mmm,则说明sumsumsum太大,需往左区间查找。反之亦然。代码#include<iostream>#include<algorithm>#include<cstring>#include<cstdio>#原创 2021-07-07 19:53:02 · 271 阅读 · 0 评论 -
YbtOJ——递推算法【例题5】平铺方案
E. 【例题5】平铺方案题目题解对于2∗i2*i2∗i的矩阵:若在第 iii 列竖着放一个1∗21*21∗2的瓦片,则有f[i−1]f[i-1]f[i−1]种方案。若在第 iii 列和第 i−1i-1i−1 列横着放两个1∗21*21∗2的瓦片,则有f[i−2]f[i-2]f[i−2]种方案。若在第 iii 列和第 i−1i-1i−1 列放一个2∗22*22∗2的瓦片,则有f[i−2]f[i-2]f[i−2]种方案。所以f[i]=f[i−1]+f[i−2]+f[i−2]=f[i−1]+2f[原创 2021-06-28 17:08:05 · 153 阅读 · 0 评论 -
YbtOJ——广度搜索【例题3】立体推箱子
C. 【例题3】立体推箱子题目题解求最少步数,当然用广搜。队列里记录当前这一步的三个状态,分别是:坐标(x,y)和箱子状态( t )。其中箱子的状态有三种:立着,横躺着,竖躺着。分别用0,1,2表示。箱子横着躺或竖着躺占两个格子,对于横躺,将其坐标记作右边的格子;对于竖躺,坐标记作下面的格子。再加些处理0()代码#include<iostream>#include<algorithm>#include<cstring>#include<cs原创 2021-06-20 11:57:12 · 156 阅读 · 0 评论 -
YbtOJ——深度搜索【例题2】数独游戏
B. 【例题2】数独游戏题目题解经过不断地debug,终于用自己的方法做出这题了。我的方法跟书上的不同,自认为更简单些。用三个二维数组分别记录每一行、列、宫中是否出现1~9,即判重,来进行剪枝。dfs每个输入时就储存下来的空着的格子,枚举1~9并根据判重数组判断能否填入该数字。填完所有空格后,输出并直接退出,最后别忘了初始化那三个判重数组,因为有多组数据。若点(x,y)(x,y)(x,y)的数为 ttt,三个判重的数组可以这样写:fx[x][t]=1;//行fy[y][t]=1;//列原创 2021-06-13 12:01:30 · 300 阅读 · 3 评论 -
YbtOJ——递推算法【例题4】传球游戏
D. 【例题4】传球游戏题目链接内存限制:256 MiB时间限制:1000 ms标准输入输出题目类型:传统评测方式:文本比较题目描述上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的: n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个原创 2021-06-12 19:52:52 · 1806 阅读 · 3 评论 -
YbtOJ——深度搜索【例题1】拔河比赛
A. 【例题1】拔河比赛题目题目链接题解由于本题数据过水,用爆搜即可过掉。只考虑一个队伍,搜索每个人加不加进这个队伍里,若不加其实就是加进另一个队。若当前加的人数未达半数,即可加进去;若当前没加的人数未达半数,即可不加进去代码#include<iostream>#include<cmath>using namespace std;int t,n,m,ans,a[100];void dfs(int dep,int c1,int c2,int sum,int原创 2021-06-13 08:56:17 · 315 阅读 · 1 评论 -
YbtOJ——贪心算法【例题3】畜栏预定
C. 【例题3】畜栏预定题目链接内存限制:256 MiB时间限制:1000 ms标准输入输出题目类型:传统评测方式:Special Judge题目描述有 头牛在畜栏中吃草。每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏,给出第 头牛开始吃草的时间区间 ,求需要的最少畜栏数和每头牛对应的畜栏方案。输入格式第一行一个正整数 。接下来 行,第 行两个正整数 。输出格式第一行一个整数,表示需要的最少畜栏数。接下来 行,第 行一个整数表示第 头牛的对应畜栏,原创 2021-06-12 20:18:14 · 700 阅读 · 0 评论 -
YbtOJ——字符串处理【例题2】移位包含
B. 【例题2】移位包含题目题解设长度长的一个字符串为s1s1s1,短的为s2s2s2。枚举s1s1s1的移位,对于它的每一次移位,判断s2s2s2是否为其的子串。代码#include<iostream>#include<cstring>using namespace std;string s1,s2;int l1,l2;int main(){ int n; cin>>s1>>s2; l1=s1.size(); l2=s2.s原创 2021-06-13 16:46:09 · 121 阅读 · 0 评论 -
YbtOJ——广度搜索【例题2】山峰和山谷
B. 【例题2】山峰和山谷题目题解先解释一下样例:红笔圈着的是两个山峰,其余的形成一个山谷。每次从未访问过的点开始BFS,对它相邻的点(八连通)进行搜索:若搜索的点等于当前点,则加入队列若搜索的点大于当前点,则标记它不可能为山峰若搜索的点小于当前点,则标记它不可能为山谷代码#include<iostream>#include<algorithm>#include<cstdio>#include<queue>using na原创 2021-06-19 11:12:22 · 271 阅读 · 0 评论 -
YbtOJ——字符串处理【例题1】数字反转
A. 【例题1】数字反转题目题解有点困,于是在YbtOJ找了道水题,但也让我学到了点东西:sprintf(原创 2021-06-13 16:13:40 · 143 阅读 · 1 评论 -
YbtOJ——贪心算法【例题2】雷达装置
B. 【例题2】雷达装置内存限制:64 MiB时间限制:1000 ms标准输入输出题目类型:传统评测方式:文本比较题目描述有 个建筑物,第 个建筑物在笛卡尔坐标系上的坐标为 ,你需要在 轴上安装一些雷达,每个雷达的侦察半径均为 ,要求每个建筑物都至少被一个雷达侦测到,求最少要安装几个雷达。输入格式第一行两个正整数 。接下来 行,第 行两个整数 。输出格式输出一行表示答案,若没有解决方案,则答案为 。样例样例输入3 21 2-3 12 1样例输出2数据范围与原创 2021-06-12 19:29:10 · 513 阅读 · 0 评论