自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(87)
  • 收藏
  • 关注

原创 数据结构:线段树

文章目录前言什么是线段树线段树的基本操作线段树的结构体数据更新函数怎么建造一棵线段树单点修改与区间查询单点修改区间查询区间修改第四个节点变量:lazylazylazy为什么要用lazylazylazy?lazylazylazy的作用前言  最近几天一直在线段树上面死磕,现在大概弄懂了较简单的线段树(只支持加减法的那种),来这里写篇大约的笔记,等以后学习了更多还会更新。什么是线段树  线段树是一种二叉树,每个节点都代表一个区间的和(或者最大值等等,可以自己定义。以下用和作为例子)。比如说根节点就代表

2021-08-13 20:03:03 214 2

原创 JZOJ 4879 少女觉

JZOJ 4879 少女觉题解

2022-07-20 20:38:52 129 1

原创 YBT 1223 An Easy Problem

题目描述输入若干个nnn,对于每一个nnn,输出最小的一个比它大mmm,并且使它们在二进制下拥有相同的111题目分析我们可以这样处理每一个nnn:先加上这个nnn的lowbitlowbitlowbit,然后再从最末位逐个添加111直到111的个数相等。以题目中的例子来说明,787878的二进制是100111010011101001110,先加上它的lowbitlowbitlowbit即101010得到101000010100001010000,然后再逐个添加末位的111使它111的个数与原数一样得到1

2022-02-25 18:43:14 394

原创 小陶的疑惑2

题目大意就是区间修改单点查询。题目分析用差分思想,用树状数组维护CodeCodeCode#include<iostream>#include<cstdio>#define lb(x) (x&-x)#define ll long long#define sco 1000010using namespace std;ll n,m,c[sco];inline void xg(ll x,ll y){for(;x<=n;x+=lb(x))c[x]+=y;}

2022-01-12 16:25:24 224

原创 st表的介绍

ststst表是一种用于解决RMQRMQRMQ问题的工具,O(nlogn)O(nlogn)O(nlogn)的时间建表,只要O(1)O(1)O(1)的时间查询,可以很好地完成查询任务。但是美中不足的一点是,ststst表不支持修改操作,因此有涉及修改的题目,请使用线段树或者其他数据结构。ststst表的建表方法st表的表示方法st表用sti,jst_{i,j}sti,j​表示[j,j+i2−1][j,j+i^2-1][j,j+i2−1]中的区间最小值。那么怎么进行建表呢?首先st0,jst_{0,

2022-01-12 15:40:06 308

原创 树状数组简单介绍

树状数组图解

2021-12-25 11:46:18 423

原创 【树状数组】洛谷P3368

题目大意给出一个数组,有两种操作,一种是把一个区间内的数全部加上k,一种是输出第x个数的值。题目分析线段树做法用一个树状数组,维护差分值,当区间修改的时候,只要修改左端点与右端点的值就可以了,单点查询a[x]a[x]a[x]时,就直接求出xxx的前缀和就好了。CodeCodeCode#include<iostream>#include<cstdio>#define lb(x) (x&-x)#define ll long long#define sco 1

2021-12-25 09:55:19 98

原创 【树状数组】洛谷P3374

题目大意给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和。题目分析两种方法,线段树请点击这里,本文使用树状数组来完成这道题。CodeCodeCode#include<iostream>#include<cstdio>#define lb(x) (x&-x)#define ll long long#define sco 1000010using namespace std;ll n,m,a[sco],c[sco];inlin

2021-12-25 09:22:31 272

原创 【字典树】YBTOJ:前缀统计

题目大意先给出nnn个字符串,再给出mmm个询问,每个询问包含一个字符串,表示询问给出的字符串中有多少个是询问字符串的后缀。题目分析字典树,先根据给出的字符串建立一棵字典树,再根据询问直接查询。CodeCodeCode#include<iostream>#include<cstring>#include<cstdio>#define sco 1000010using namespace std;int n,m,tot=1,ce[sco],trie[sc

2021-12-24 19:14:20 165

原创 【BFS】走迷宫图

题目大意给出一个迷宫,求从一个点走到另一个点的最少步数题目分析裸的BFSBFSBFS,直接暴搜就行CodeCodeCode#include<iostream>#include<cstdio>#include<queue>#define sco 1010using namespace std;int n,sx,sy,tx,ty,mp[sco][sco],dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0},dis[sco][sco]

2021-12-18 16:12:12 83

原创 【KMP】子串查找

题目大意给出一个长字符串与一个短的字符串,求短字符串在长字符串内出现了多少遍题目分析这种题目就十分能体现C++C++C++的优势了,我们可以使用findfindfind函数直接ACACACCodeCodeCode#include<iostream>#include<cstdio>using namespace std;string a,b;int tmp=0,ans=0;int main(){ cin>>a>>b; while((tmp

2021-12-18 10:53:44 417

原创 【并查集】新的开始

题目大意有nnn个矿井,这nnn座矿井需要电力,现在给出连接这些矿井的费用与在这些矿井上面修建发电厂的费用,求让这些矿井全都通上电所需的最小费用题目分析可以建一个超级汇点把所有的矿井都与它连接,边权为在矿井上建立发电厂的费用,然后直接在跑一遍krukrukru就好了。CodeCodeCode#include<algorithm>#include<iostream>#include<cstdio>#define sco 100010using namesp

2021-12-18 09:36:31 58

原创 【并查集】繁忙都市

题目大意给出若干条可以修建的道路,选出其中最少的路线,使这些道路中分值最大的道路分值尽量小。题目分析最少的路线也就是选出n−1n-1n−1条路线,道路中分值最大的道路分值尽量小,我们可以根据分值从小到大枚举每一条道路判断它是否需要修建。于是这道题变成了裸的最小生成树CodeCodeCode#include<algorithm>#include<iostream>#include<cstdio>#define sco 100010using namespa

2021-12-18 08:39:17 164

原创 YBTOJ 【并查集】食物链

题目大意有三种动物,它们彼此之间存在着吃与被吃的关系,现在,有一个人说出mmm句话描述nnn只动物之间的关系,有真有假,程序的任务是统计有多少句假话。题目分析十分经典的并查集拆点题,我们运用拆点思想,使用3n3n3n个点,以节点aaa为例,引用a+na+na+n表示aaa吃的动物,再引用a+2na+2na+2n表示吃aaa的动物。这样,就能十分方便地进行合并操作了。CodeCodeCode#include<iostream>#include<cstdio>#define

2021-12-17 20:08:37 417

原创 洛谷 P3368 树状数组2

题目大意给出一个数组,有两种操作,一种是把一个区间内的数全部加上k,一种是输出第x个数的值。题目分析直接暴力操作,肯定会超时,我们需要树状数组或者简单线段树来优化。Code#include<iostream>#include<cstdio>#define sco 500010using namespace std;int n,m,f,x,y,z,ans,a[sco];struct tree{ int l,r,data,lz;}tr[sco*4];void u

2021-12-03 21:43:07 309

原创 洛谷 P3374 树状数组模板1

题目大意给出一个初始数组,有两种操作,一种是将第x个数加上k,一种是求[x,y]区间和。题目分析直接暴力肯定TLE,我们可以用简单线段树或者树状数组优化,这里作者就采用简单线段树通过#include<iostream>#include<cstdio>#define sco 100010#define ll long longusing namespace std;ll n,m,f,x,y,z,ans,a[sco];struct tree{ ll l,r,data

2021-12-03 18:12:41 177

原创 洛谷P1042 乒乓球

题目大意给出两人乒乓球的比赛记录,输出两人在111111分制与212121分制时的比赛结果题目分析直接模拟,需要注意的就是乒乓球比赛的规则(超过分数界且相差至少两分比赛才结束)与假如刚好结束比赛的话还要输出0:00:00:0。CodeCodeCode#include<iostream>#include<cstdio>#define sco 62510#define ll long longusing namespace std;char ch,s[sco];l

2021-08-23 10:34:31 107

原创 洛谷P1044 栈

题目大意求对一个长度为nnn的序列中的每一个元素都经过了入栈和出栈的操作后可能出现的不同出栈顺序的数量。题目分析设fi,jf_{i,j}fi,j​为有iii个元素待处理,其中有jjj个元素未入栈时可能出现的不同出栈顺序的数量。当j=0j=0j=0时全部元素已经入栈,此时只能按顺序将栈中元素全部出栈,方案数为111所以fi,0=1(1≤i≤n)f_{i,0}=1(1 \leq i \leq n)fi,0​=1(1≤i≤n)当j≠0j \neq 0j​=0时只有两种操作,考虑这两种操作对于f

2021-08-22 22:03:57 124

原创 牛客网:中位数

题目大意  对一个长度为nnn的数组进行kkk次合并,求操作后序列的中位数最小可以是多少题目分析  把原序列进行排序,排序完后每次选最大的两个数合并,就能使中位数最小。  不开longlonglong longlonglong见祖宗CodeCodeCode#include<algorithm>#include<iostream>#include<cstdio>#define sco 200010#define ll long longusing n

2021-08-21 11:19:27 78

原创 LibreOJ #6277 数列分块入门1

题目大意给出长度为nnn的原序列,有nnn个操作,操作有两种:给l∼rl \sim rl∼r这个区间每个数加上ccc查询ara_rar​的值题目分析  应该是分块的一种比较低幼的题,虽说是分块模板,可是若有神犇用线段数做也未尝不可——(虽然本蒟是老老实实用分块做的……)  预处理:开一个blobloblo数组,bloiblo_ibloi​表示iii属于第几个块。每个块长度为n\sqrt {n}n​,共分成n\sqrt {n}n​块,在大部分情况下,最右边应该会留下一个不完整的块。  对于

2021-08-21 11:11:38 107

原创 比赛:20210817:A

题目大意  先给出一个长度为nnn的字符串(以下称为初始字符串),然后还有qqq个询问,每个询问给出一个长度小于505050的字符串(以下称为询问字符串),判断此字符串是否是初始字符串字符串的子序列。题目分析  我们可以预处理一个数组fi,jf_{i,j}fi,j​,表示后iii个字符中第jjj个字符第一次出现的位置。对于每个询问,先求出第一个字符在整个初始字符串(后nnn个)第一次出现的下标,然后再求第二个字符在这个坐标后第一次出现的位置……如果整个询问字符串都能够合法地在初始字符串中出现,那么就可

2021-08-18 07:51:37 95

原创 康托展开公式+代码

文章目录前言康托展开是什么?康托展开公式前言本蒟刚刚学了基本的康托展开,特在此留下学习笔记。康托展开是什么?  康托展开就是求在一个特定长度的全排列中,一个特定的排列在全部排列中排第几个。举个例子:如长度为333的全部排列为1,2,31,2,31,2,31,3,21,3,21,3,22,1,32,1,32,1,32,3,12,3,12,3,13,1,23,1,23,1,23,2,13,2,13,2,1所以1,2,31,2,31,2,3就排第111个,1,3,21,3,21,3,2就排

2021-08-16 22:07:11 332

原创 YBTOJ:拔河比赛

题目大意求最符合拔河比赛要求的分队方法。题目分析用一个三元组(x,y,z)来表示当前的情况:x为当前考虑到第几个人,y为当前已经选择了多少个人到第一个分队里,这队人的体重和为z。当y==n/2或者x>n时结束。用dfs暴搜来实现……CodeCodeCode#include<iostream>#include<cstdio>#include<cmath>#define sco 50using namespace std;int T,n,s,an

2021-08-15 19:24:22 131

原创 单链表的一些基本操作

文章目录前言单链表的的定义在链尾添加新节点在链中插入节点在链中删除节点完整操作实例前言在网上看到了很多奇奇怪怪的链表操作,不仅代码多还难以理解,给出的代码还会编译错误(也许只是小编愚钝……),后来找了很多资料,终于找到一种精简的链表,所以写一篇文章来介绍一下。单链表的的定义十分简单,只要定义一个头指针,尾指针就好了。struct node{ int data; node *next;}*head,*p,*tail;//head头指针,tail尾指针,p用于操作在链尾添加新节点inli

2021-08-15 19:18:03 123

原创 【洛谷CF1110E】Magic Stones

题目大意多个询问,每个询问给出长度为nnn的222个序列a,ba,ba,b每次可以对1<i<n1<i<n1<i<n的aia_iai​进行操作,操作后,ai′=ai−1+ai+1−aia'_i=a_{i-1}+a_{i+1}-a_iai′​=ai−1​+ai+1​−ai​问能否通过若干次操作,使得序列aaa变成bbb题目分析移项原式,得ai′−ai−1=ai+1−aia'_i-a_{i-1}=a_{i+1}-a_iai′​−ai−1​=ai+1​−ai​a

2021-08-14 16:52:33 93 1

原创 洛谷P3372 【模板】线段树 1

题目大意给出一个数列,有两种操作:将某区间每一个数加上kkk求出某区间每一个数的和题目分析假如暴力模拟,时间复杂度O(mn)O(mn)O(mn),最多只能拿七十分。既然已经是线段树的模板题了,那么正解一定是线段树,直接写线段树就好了。时间复杂度O(mlogn)O(mlogn)O(mlogn)CodeCodeCode#include<iostream>#include<cstdio>#define sco 100010#define ll long long

2021-08-13 11:37:04 120

原创 比赛:2021-08-12:D

题目大意给定n,求出所有正整数x,满足小于n,且x^2(%n)=1将满足的x按从小到大的顺序依次换行输出

2021-08-12 21:24:57 42

原创 比赛:2021-08-12:B

题目大意nnn个物品,每次去掉一个之后再询问的010101背包问题。题目分析调整事情顺序,把第iii个去掉的事情放在n−i+1n-i+1n−i+1个位置上,然后再做一次二维010101背包,然后输出fm,n→fm,1f_{m,n} \to f_{m,1}fm,n​→fm,1​(fi,jf_{i,j}fi,j​表示有iii点精力,做前jjj件事情时能取得的最大值)因为第111个被去掉的事情被放在了第nnn个位置上,所以fm,n−1f_{m,n-1}fm,n−1​刚好就是去掉第111件事情后的结果。最

2021-08-12 16:09:46 52

原创 比赛:2021-08-12:A

题目大意若数列A存在位置k,满足①i<k,ai<ai+1②i>=k,ai>ai+1则称该数列为单峰数列给出正整数n,求全排列n中存在多少个单峰数列题目分析对于每个nnn, ans=2n−1ans=2^{n-1}ans=2n−1,为什么我也不知道,暴力的时候找到的规律,用快速幂乘一下真就ACACAC了。CodeCodeCode#include<algorithm>#include<iostream>#include<cstdio&gt

2021-08-12 15:46:25 58

原创 超级快读模板

超级快读模板#define getcha() (S==T&&(T=(S=fsr)+fread(fsr,1,1<<15,stdin),S==T)?EOF:*S++)char fsr[1<<15],*S=fsr,*T=fsr;inline int read(){ int r(0),w(1);char ch; while(ch=getcha(),ch>=58 || ch<=47)w=(ch=='-'?-1:1);r=(r<<3)+(r&lt

2021-08-10 20:04:00 198

原创 比赛:2021-08-10:C

题目大意给出一个长度为nnn的序列AAA描述一个长度为nnn的全排列,AiA_iAi​表示前i−1i-1i−1个有多少个比第iii个数大。题目分析从后往前分析,当前aia_iai​表示有几个数比当前位置的数大,那么当前应该选择的数一定是剩余数字中第aia_iai​大的,暴力模拟匹配,时间复杂度O(n2)O(n^2)O(n2),可以过800080008000的数据范围。CodeCodeCode#include<iostream>#include<cstdio>#defi

2021-08-10 19:53:29 66

原创 比赛:2021-08-09:D

题目大意nnn个人排队打饭,假如相邻的人打的菜一样,就会影响彼此用餐的心情。求这个队伍中有人被影响心情的状态数,对100003100003100003取余。题目分析直接求怎么影响心情难度较大,我们可以反道而行之,求不合法的方案数即求有多少种方法可以不影响心情。第一个人可以随便选,即可以选mmm种菜,后n−1n-1n−1个人每人都可以选与前面的人不一样的m−1m-1m−1种饭菜。所以不合法状态就是m∗(m−1)n−1m*(m-1)^{n-1}m∗(m−1)n−1而全部的状态数就是n个人都有mmm种选择

2021-08-09 16:50:07 58

原创 比赛:2021-08-09:A

题目大意定义一个运算操作,求出一个长度为nnn的数列在经过n−1n-1n−1次合并后能得到几种不同的结果。题目分析首先先来观察一下这个XXX运算:a(X)b=((a&b)+(a∣b))>>1a(X)b=((a\&b)+(a|b))>>1a(X)b=((a&b)+(a∣b))>>1实际上,这个 ((a&b)+(a∣b))>>1((a\& b)+(a|b))>>1((a&b)+(a∣b))>

2021-08-09 16:30:15 47

原创 YBTOJ:喂养宠物

[题目]大意有nnn只兔兔,每只兔兔单独时都需要吃hungerihunger_ihungeri​的食物量,假如有同食者,那么每个同食者会让它需要多吃greedigreed_igreedi​的食物量。假如小明最多能提供totalFoodtotalFoodtotalFood的食物,那么他最多能养多少只兔兔。题目分析养的兔子越多,所需食物量越大,可见答案具有单调性,用二分答案做。答案的上下限:下限很明显就是000,上限就是兔兔的总数即nnn,nnn的最大值是505050,所以上限为505050。再确定

2021-08-08 16:34:07 139

原创 YBTOJ:最大均值

题目分析答案具有单调性,先确定答案的上下限,由于是部分或全部aia_iai​的平均值,且所有的aia_iai​都小于200020002000,所以答案范围为0≤x≤20000\leq x\leq 20000≤x≤2000考虑二分,判定条件是“是否存在一个长度≤L\leq L≤L的子段,平均值不小于midmidmid”求平均值十分麻烦,我们可以把子段内的所有项都减去midmidmid,于是平均值便不小于000,所以说该减去了midmidmid子段和非负。所以判断条件转化成“是否存在一个长度不小于LLL

2021-08-08 15:44:09 80

原创 YBTOJ:雷达装置

题目大意在平面上有许多建筑物,现在要在x轴上安装雷达,求最少的雷达安装数目。题目分析对于任意一个建筑物,都有一个对于它的雷达建造区间,使得它能被雷达探测到。所以问题转化成:给定n个区间,在数轴上建造尽量少的点,使得每个区间内都至少有一个点。麻烦的就是怎么获取左右端点的值根据勾股定理,l=x-sqrt(dd-yy),r=x+sqrt(dd+yy);注意要用double类型再来考虑无解情况很明显,当建筑物所在的点与x轴的距离即y超过d时,这个建筑物就不可能被探测到。Code#include

2021-08-08 11:55:08 137 1

原创 YBTOJ:奶牛晒衣服

题目大意有n件衣服和一台烘干机,每件衣服都有一个湿度,烘干机可以让一件衣服更快地晾干,求晾干衣服的最短时间题目分析原题似乎有点表达不明确,使用烘干机应该是额外晾干B点湿度······这道题很明显就用贪心做了,假如不考虑烘干机,那最后晾干的一定是湿度最大的衣服,所以我们要尽量降低最湿的衣服的湿度,那么每次使用烘干机都应该烘最湿的衣服。用大根堆维护。Code#include<iostream>#include<cstdio>#include<queue>#

2021-08-08 11:54:08 84

原创 YBTOJ:划分数列

题目大意给定一个长度为nnn的数列A,要求划分最少的段数,使得每一段要么单调不降,要么单调不升。题目分析先预处理出两个数组lwi与hgi,lwi表示以i为结尾的单调不升子序列的起点,hgi表示以i为结尾的单调不降子序列的起点。设d[i]为A1到Ai的最少划分数;可得递推关系式:d[i]=min(d[lw[i]−1],d[hg[i]−1]])+1d[i]=min(d[lw[i]-1],d[hg[i]-1]])+1d[i]=min(d[lw[i]−1],d[hg[i]−1]])+1Code#in

2021-08-08 11:53:18 207

原创 YBTOJ:求f函数

题目大意题目给出一个f函数,输入一个n,求f(n)的值。题目分析我们可以证明当n<=100时f(n)=91当100>=n>=90时f(90)=f(f(90+11))=f(f(101))=f(91)=f(f(91+11))=f(f(102))=f(92)=f(f(92+11))=f(f(103))=f(93)=……可以看出,参数一直在增加,当增加到100时f(100)=f(f(100+11))=f(f(111))=f(101)=91所以可以得出当n

2021-08-08 11:51:05 124

原创 YBTOJ:平铺方案

题目大意求用2×12\times12×1或者2×22\times22×2的地砖铺满2×n2\times n2×n的地砖的方案数题目分析我们设f(n)f(n)f(n)为铺满2×n2\times n2×n的地板的方案数,则f(1)=1f(1)=1f(1)=1,f(2)=3f(2)=3f(2)=3开始递推,首先确立递推关系式:当把一块2×12\times12×1的地砖竖着放在最右边时,f(n)有f(n-1)种可能当把两块2×12\times12×1的地砖横着叠在最右边时,占据2×22\times22×

2021-08-08 11:49:33 63

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除