自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LCA

树上倍增:链上信息维护倍增:把链进行二进制分解,把每个长度为2的i次方的链的信息求出来,然后再累加原理:任何一个数都可被二进制分解操作:1.调到相同的深度2.若已重合,则y是x的祖先3.若没重合,则一起向上跳:枚举i从s到0,2s为小于到根的最大距离p[x][i]:x号点向上走2i步能到的点预处理p[x][i]:p[x][i]=p[p[x][i-1][i-1],因为2* 2i-1=2i,即走两次i-1就到i了根节点的深度是 1,从根节点往下,每层深度都 +1,叶节点和叶节点深度可能不一样

2020-12-06 11:50:40 145

原创 解题综合

1.宝物:复杂度分析+搜索状态太复杂,故不用dp(加,乘)对于每种物品,都有选和不选两种。所以复杂度2n1.小样例暴力计蒜客

2020-11-04 21:43:48 159

原创 初赛

排列:Α¹₃=n!/(n-m)!Cmn=n!/m!*(n-m)!插入法(要求几个元素不能挨着):先让无约束的元素排列,在将有约束不能相邻的元素插空捆绑法(要求几个元素必须在一起):先捆绑成一起与其它元素排列,再在内部进行排列剩余法(当取法太多不好算时):算剩余(因为有多少种取法就有多少种剩余法)对等法(限制条件的肯定与否定是对等的(语文要在数学前=数学要在语文前)):最后排完乘½排异法(正面考虑太复杂):总数-限制的反面隔板法(将问题转换为类似插隔板的样子)...

2020-10-08 17:36:23 199

原创 贪心

1.删数问题(黄p266)思路:(1)先删高位(2)先删大的数例:输入:175438 4输出:13误区:1.思路:算最后留下几个数,那为保证最大就一定是递增错误:因为可能删去几个数后仍无法保证全部递增2.思路:将数串中找出其最长上升子序列,然后从高向低删除错误:为保证最长,会使得错过高位上一些大的数,而去找相对较低位的大数正解:将错误分析,发现错在1.有特定的删除数量限制2.为低位而舍去了高位。所以,我们直接从高位开始,一旦出现递减,就将前面的数删除,最后如果剩下递增,就取前面几位

2020-10-04 22:05:03 129

原创 图论总结

拓扑排序1.用ru[]存入度,用vector存对应的点2.找入度为0的点,入队3.while循环dijkstra:贪心+松弛操作使用前向星

2020-10-03 22:42:02 85

原创 dp画表法

1.黄p379编辑距离发现:1.遇到相同的字母,直接可以是上次减1,或为0(最开始)2.遇到不同字母:(1)插入为竖着+1(2)交换为对角线+1(3)删除为横着+1然后思考初始化:第0列:有a无b,那就把b一个个插入同理第0行...

2020-09-08 23:18:20 658

原创 斐波那契数列的三种解法

1.直接递归int f(int n){ if(n==1 || n==2){ return 1; }else{ return f(n-1)+f(n-2); }}2.记搜——出现多次重复访问int vis[100];int f(int n){ if(vis[n]!=0){ return vis[n]; } if(n==1 || n==2){ return 1; }else{ vis[n]=f(n-1)+f(n-2); return vis[n]; }}

2020-08-30 22:36:24 127

原创 dp真题

1.方格取数枚举步数 区间dp#include <bits/stdc++.h>using namespace std;int n;int a[15][15];int dp[110][15][15];//枚举步数,dp数组的意义要与循环保持一致 int main(){// freopen("paperPass.in","r",stdin);// freopen("paperPass.out","w",stdout); cin>>n; int x,y,z; w

2020-08-29 21:36:48 151

原创 KMP和字典树

KMP作用:字符串查找(在主串T中找模式串P)关键:fail数组——充当失配函数,记录最长相同前缀和后缀长度fail作用:已经有一段匹配上,但到某个字符匹配不上了,就可以直接到下一个有前面符合的字符的字符串开始搜。(利用已知的信息加速匹配过程)时间:线性注意:fail记录的不是回文子串,是通过循环j(j<i),满足s0——j = si-j——i,不存在就为-1实现:fail初始化-1跟着fail不断往下跳,匹配上就记录const int maxn = 100;int fail[m

2020-08-23 17:01:01 371

原创 康拓展开

作用:网络图的状态存储,将二维转一维(一行行拼接,形成一个数),进行判重实质:一个自然数映射一个数列原理:所有的排列从小到大排序后,所处的位置,算出多少个数比它小

2020-08-18 21:43:20 101

原创 模拟

1.原理:模拟过程2。注意:(1)变量要有意义(2)注意输出时的行末空格(3)使用STL(4)封装函数3.特点: 题面极长–详细STL:1.map定义:map<关键字类型,映射值类型> dicdic[x]=y;按关键字升序排列 map<int,int> dic; dic[1]=5; dic[6]=3; dic[4]=6; map<int,int>::iterator it; for(it=dic.begin();it!=dic.end()

2020-08-17 06:38:09 133

原创 Attention

待练习:1.斜率优化2.强联通分量3.剪枝4.并查集5.前缀和 差分6.线段树

2020-08-10 11:28:37 164

原创 斜率优化

摆渡船要写一个函数来计算斜率,斜率越大,直线越陡,越能拿到最优解所以要保证单调性,通过将动规方程拆,将目标(要求的东西),移到y,将不变的东西作为x注意还要通过队列,用首位指针,进行答案的保存,方便存和弹出 const int maxT = 4000105; int n, m, t, ti, ans = 1e9, l = 1, r, cnt[maxT], sum[maxT], q[maxT], f[maxT]; inline double getSlope(int u, i

2020-08-10 11:27:25 183

原创 洛谷8

1.operation:根据简单推导,得出规律,(只有两种情况,倍数……)int main(){ long long a,b,c,d; cin>>a>>b>>c>>d; if(a==0 && b==0){ cout<<0; }else if(a==0 || b==0){ cout<<d; }

2020-08-10 11:14:09 147

原创 结构体

1.定义结构体:struct node{int a;bool b;double c;}2.定义结构体数组struct node{int a;bool b;double c;}s[100];优点:兼数组和结构体,每个可以存多个,多类型的值...

2020-08-10 10:24:24 109

原创 剪枝例题

火柴棒

2020-08-10 10:24:05 355

原创 实用技巧之map

寻找元素 vector<int> v; v.push_back(1); vector<int>::iterator ret = find(v.begin(), v.end(), 15); if(ret==v.end()){ cout<<1; }else{ cout<<2; }迭代器vector::iterator ret = find(v.begin(), v.end(), 15);给定一个字符串,找到它的第一个不重复的字

2020-08-10 10:23:34 92

原创 二分答案例题

1.奇怪的函数https://www.luogu.com.cn/problem/P2759这道题好像没有什么方法可以巧妙地解决问题,所以想到枚举答案。但面临枚举会想到二分答案(更快),判断:1.二分性:找到一个答案,如果小了,没达到,就往后找,如果大了,已达到,就往前找。直到找到最优答案2.如何判断:首先要知道:所以判断数位就可以转为判断x*log10(x)>=(n-1)代码注意点:1.边界:从1到答案可能出现的最大值即(2e9)2。二分不能l=r,因为当l=r,mid=l=r

2020-08-10 10:22:54 199

原创 贪心例题

1.https://www.luogu.com.cn/problem/P4393#include <bits/stdc++.h>#define ll long longusing namespace std;int n;ll ans,a[1000100];int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%ld",&a[i]); } for(int i=1;i<n;i++

2020-08-10 10:22:25 139

原创 搜索

模拟的过程不同状态的转移解决:1.方案数2.从起始到目标状态花费最小BFS:适用:1.状态适合储存(方格图,网格图)2.很深的问题3.一个状态有多种转移方式

2020-08-10 10:21:45 121

原创 剪枝

应用于深搜1.可行性剪枝:发现某些状态无论如何都不能找到最终的解注意:负数……(别剪错)2.最优性剪枝:——调到答案那步与其进行比较最优解的一类问题,通常可以用最优性剪枝,比如在求解迷宫最短路的时候,如果发现当前的步数已经超过了当前最优解,那从当前状态开始的搜索都是多余的,因为这样搜索下去永远都搜不到更优的解。通过这样的剪枝,可以省去大量冗余的计算。常用:步数(总之就是达到目的,再剪)方法:定义范围或if()return; 传入个参数3.重复性剪枝:一个方案可能会被搜索很多次,这样是

2020-08-08 21:58:15 203

原创 生日蛋糕——真题

题解:DFS+剪枝表层思考:超了,少了(当前运算已经超过最大,小值)—体积,表面积–》边界的选取远瞻:如果当前的值选的太过临界,会导致后面的值超了,少了,所以可以预处理一个更小的范围直指答案:——最优性剪枝已经算出答案#include <algorithm>#include <cmath>#include <cstdio>#include <iostream>using namespace std;const int INF = 0

2020-08-08 21:13:44 341

原创 线性dp

https://www.luogu.com.cn/problem/P5017技巧:1.画数轴:-》转化问题条件:1.有多组量 2.dp 3.感觉使用:此题令时间为数轴(因为要解决的问题是时间)。数轴上不同点代表人(有人那个点就有意义),要求等车时间,其实知道车来的时间就知道等车时间,所以将数轴分段,且每段大于等于m(一次最少需要的时间)。故等车时间之和,自然就转换成所有点到各自所属段右边界的距离之和。2.前缀和:条件:当需要重复算某个累加(减……)的值多次时注意:为了方便求,前缀和

2020-08-07 20:33:28 122 1

原创 图论——连通性

割点:1.无向图2.删去这个点及其所连边后,图不再联通点双连通图:1.无向图2.没有割点(删去任意一个点图仍联通)点双联通分量:无向图G中所有子图G’如果G’1.是点双联通子图2.不是其他点双联通子图的真子集,则G’是G的极大点双联通子图,也称点双联通分量。桥(割边):1.无向图2.删此边(不删其连着的点),剩下的图不再联通边双连通图:1.无向图2.删任意一边,剩下的图仍联通边双联通分量:无向图G中所有子图G’如果G’1.是边双联通子图2.不是其他边双联通

2020-08-01 13:10:03 1559

原创 实用技巧——二分答案

1.使用原因:一道题正面求难,但是如果知道答案,然后验证答案的对错,相对简单。2.实现:枚举答案 反面验证如何枚举?二分查找O(logn)3.思考问题:(1)判断具有二分性,即二分查找到一个mid后,如果离检验希望出现的答案远,那这个数前面就都不满足(也就不用找了),如果离检验希望出现的答案近,那就往能靠近检验成功的方向找。(借张好图)换句话来说:就是你找的答案一定要与你要判断的东西有必然联系(类似:一个多,另一个就多)注意:出现“最”字但这里注意:如果这道题不满足二分性,但却“枚举答

2020-07-24 17:02:11 128

原创 实用技巧——数状数组

1.划分区间区间结尾是R,区间长度等于R的 二进制分解 下最小的2的次幂,即lowbit®7->[7,7],[6,5],[4,1](分的过程就是求出7->6->4->0)lowbit实现while(x>0){ cout<<x-(x&(-x))+1<<" "<<x<<endl; x-=x&(-x);}...

2020-07-22 22:33:51 574

原创 动规优化

二进制优化:1.对象:多重背包问题2.目的:转换为01背包,同时减少时间复杂度3.操作:原理:易证任何一个数都可以由20 到 2n组成,其中2n为不超过n的最大二进制数所以我们就可以从原物品的数量下手把 num个这种物品分成价值和大小分别为原来物品的价值和大小20 到 2n倍的新物品,(2x这里的x指新生成物品的价值和大小是原来这种物品的x倍)注意:1.20 到 2n是连续的,2.每次生产新的物品要将原来这个物品的数量减去这个物品所代表的原物品的x倍(1)照常输入该物品的价值,大小,数量

2020-07-20 21:46:53 101

原创 线段树

应用中,线段树是一个工具一个能快速完成查询,修改,的工具!你的任务(题目描述)就是线段树上的权值处理任务的方法就是线段树修改的方法

2020-07-16 20:39:23 103

原创 并查集路径压缩

基础知识不再赘述1.寻找祖先两种方式:第一种从下到上直接找,O(n^2)将儿子挂到这棵树上//非递归int find(int x){ while(father[x]!=x){ x=father[x]; } return x;}第二种方式就是路径压缩 优化,O(a)将父亲直接与祖宗相连int find(int x){ if(father[x]!=x){ father[x]=find(father[x]); } return father[x];} 注意:fa

2020-07-16 18:13:36 370

原创 扫描线

差分的过程,维护最值扫描线法:1.将图形分块2.用一条竖直直线扫过坐标系,则直线上被图形覆盖的长度只会在矩形边界处发生变化实现:1.输入,并排序(决定扫的顺序)2.处理(例如将矩形的左边上点的值作为+右边上点的值作为-),然后开始扫3.查询最值——线段树维护写法:离散化(坐标范围较大且不一定是整数)https://www.luogu.com.cn/problem/P5490权值线段树:一般使用结构体在线段树上赋值(建个线段树,把权值(坐标…)插到点上)时间戳cnt:1.表示次数

2020-07-15 22:21:41 270

原创 离散化

一串数:1,23424,242,65466,242,0排序:0,1,242,242,23424,65466去重:0,1,242,23424,65466离散化:1,3,2,4,2,0流程:1、用一个辅助的数组把你要离散的所有数据存下来。2、排序,排序是为了后面的二分。3、去重,因为我们要保证相同的元素离散化后数字相同。4、索引,再用二分把离散化后的数字放回原数组。const int MAXN=1e+6;int a[MAXN],f[MAXN];//f为a的副本 int main(

2020-07-15 20:58:24 102

原创 单调栈/队列

单调栈:1.海报https://www.luogu.com.cn/problem/P3467思路:单调栈1.必有一个楼房被完全覆盖2.将次被覆盖的房子向左移,看其能否覆盖上一个,如果能,就加上上一个能覆盖的房子数,然后继续直到无法延伸。注意:1.向左和向右是一样的,(从后往前,从前往后),且向左做可以利用上一步算出的信息2.对于宽:不用管,因为最后直接是一个矩形覆盖,不是后面的楼房覆盖代码 int n; cin>>n; int f[n+1]; f[0]=0; int

2020-07-12 10:38:17 89

原创 背包问题——P6567 [NOI Online #3 入门组]买表

https://www.luogu.com.cn/problem/P6567思路:给了钱币数钱币分为面额和张数还有几块表感觉就是有n个物品,每个物品的大小和数量已知,求能不能正好放进这个背包区别:动态方程:完全背包的方程是将其转换为01背包后,求在有限的容量内,以特定的物品能产生的最大值即for(int i=1;i<=n;i++){ for(int j=m;j>=a[i];j--) { if(dp[j-a[i]]+c[i]>dp[j]){

2020-07-06 20:23:00 310

原创 前缀和——[NOI Online #3 提高组]水壶

题目:https://www.luogu.com.cn/problem/P6568分析:这道题求连续k个数的最大值,且每个数大于等于0,所以采取前缀和正统前缀和模板int n;cin>>n;int a[n+1],ary[n+1];ary[n+1]=0;//这里需要将第一个数赋初始值,因为它会影响计算//并不需要将全部数赋初始值,因为后面的数是由前面的数和输入的数计算得来//本身的值对结果无影响for(int i=1;i<=n;i++){ cin>>a[i]

2020-07-06 20:00:28 234

原创 蒜普6

题目:https://www.jisuanke.com/contest/9297/challenges题解:第一题80 ——模拟#include <bits/stdc++.h>using namespace std;struct node{ int pos,len;}a[10000];bool cmp(node a,node b){ return a.pos<b.pos;}int main(){ int n,x0,y0,x,y; cin>>n>&

2020-06-21 18:11:36 158

原创 实用技巧之函数

绝对值:abs(x) 返回x的绝对值,要求x为整数fabs(x) 返回一个浮点数的绝对值

2020-06-21 17:31:05 102

原创 实用技巧——函数返回问题

问题:函数返回要多个值,有不方便用void,只能用int,怎么返回?可以使用vector

2020-05-07 22:22:45 141

原创 实用技巧之快速幂及高精度

快速幂1.求2^nint poww(int x){ if(x==0){ return 1; }else if(x==1){ return 2; } return poww(x/2)*poww(x/2)*poww(x%2); }2.求a^bint mod=1000000007;long long quickpoww(long long a,long long b){...

2020-05-01 22:18:21 138

原创 实用技巧之位运算

实用技巧快速幂int poww(int x){ if(x==0){ return 1; }else if(x==1){ return 2; } return poww(x/2)*poww(x/2)*poww(x%2); }求2^n

2020-04-24 19:22:37 147

原创 蒜头君的花园

题目描述蒜头君的花园里有 n个花盆,每个花盆可以种一株花,现在花椰妹给了蒜头君三种花的方案但是花椰妹的每种方案种的都是同一种花,只是形状不同全部种 A 花,第 i 盆花的价格为 ai全部种 B 花,第 i 盆花的价格为 bi全部种 C 花,第 i 盆花的价格为 ci可是蒜头君觉得整个花园都是同一种花不好看,但是他又不想浪费了花椰妹的好意,所以他决定依旧是按照花椰妹的方案来买花,也就是...

2020-04-10 18:49:49 395

空空如也

空空如也

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

TA关注的人

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