自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 三分查找&&2021ICPC济南站D题题解

对于单调函数,用二分查找,但是对于非单调函数呢?对于单峰的凹凸函数可以用三分查找。在2021的ICPC济南站中有这么一道题 :给定一个数列,你可以对任意的一个数字进行减一或者加一的操作,求让这个数列变成等差数列的最小操作次数。其实就是求解f(d)函数(可以证明这题里这是一个凹函数,不证也可以猜是)的最小值,那么如何求解f(d)函数的极值呢?为什么这道题答案的大小主要取决于公差d的大小而不是首项a1的大小呢?我的看法(我觉得没毛病):这是因为对于最优解的公差d和其他解的公差d,当他们使

2021-11-18 17:27:32 496

原创 数位dp&&树形dp

数位dp数位dp常用的思想就是从高位往低位考虑,考虑区间问题时搞前缀和之差,题目的形式多变在于取数的规则,在数据比较大时需要结合字符串的一些算法进行处理(好吧AC自动机都不会不配写这种题)...

2021-11-09 22:29:48 195

原创 平衡树学习

#include<bits/stdc++.h>using namespace std;const int maxn=2e6;int n;struct node{ int num,num1,val,ch[3],key;}shu[maxn];int ans=0;void up(int k){ shu[k].num=shu[shu[k].ch[0]].num+shu[shu[k].ch[1]].num+shu[k].num1;}void romate(int &k,.

2021-11-02 17:26:11 101

原创 博弈论学习

硬币游戏1:给x个石子,然后给k个数字,首先取完所有石子的获胜。可得x=0时,为必败态;如果j-ai为必败态的话,j即为必胜态;如果对于任意的j-ai都是必败必胜态的话,那么j就是必胜态。可用动态规划从小到大求出胜负态,这样就能知道谁会获胜。像这样,通过考虑各个壮态的胜负条件,判断必胜态和必败态,是有胜败的游戏的基础。A Funny Game:给定n枚硬币,围成一个圈,每次可以取走一或两枚硬币,问谁最后能赢。事实是,除了特判条件下,先手的必输。在这类游戏中,作出对称状态后在完全模仿对手的

2021-10-21 16:27:12 195

原创 高精度板子

#include<cstdio>#include<algorithm>#include<cmath>#include<vector>#include<iostream>using namespace std;struct Bigzhenshu{ static const int base=10000; static const int width=4; vector<int> s; Big.

2021-07-29 15:42:05 110

原创 玄学dp(雾

Atcoder上的ABC210中的D题题目大意:给定一个H*W的地图然后,每个Aij都赋予一个权值,给定一个常数C,从Aij到Ai`j`的花费是cost=Aij+Ai`j`+C*绝对距离现在要建立两个站点然后在两个站点之间修路,求最小的花费。思路:(dp的玄学内容来了)先建立一个前提,第一个站点的建立一定在第二个站点的左边(上下需要分开讨论,这里举例用的是下)将整个问题分解为两步实现,第一步:假设第一个站点已经建好求当前在Aij最小的花费,方程是:dp[i][j]=min(a

2021-07-18 16:00:57 114

原创 文件包含漏洞

几乎所有的脚本语言都提供文件包含功能,但是php的漏洞居多,而asp,jsp的比较少,这主要是因为语言设计本身的弊端。主要介绍php的文件包含漏洞实际的漏洞触发点:include()函数和require()函数//这些函数可以回显打开一个或者多个文件,文本,php,cpp都能打开漏洞分为两种:本地的和远程的。本地的:就是include()等函数的直接使用,而且include()有时还会通过warning暴露出绝对路径(但是现在很多服务器框架都不会回显warning的内容了)远程的(RFI

2021-06-29 16:18:15 129 2

原创 单调队列优化dp 单调队列优化多重背包

单调队列的应用:查询定区间的最小值或者最大值,相对于RMQ来说是线性级别的算法。单纯的单调队列实现起来就那两行,相当简单,比较复杂的是用单调队列的定区间查询功能优化dp以及其他算法。单调队列优化dp的典型例子:单调队列优化多重背包。完成这个优化的前提是要对状态转移方程进行一定的变换,这里面包含的思维过程往往比单调队列本身复杂得多。单调队列优化的多重背包复杂度:O(nm)考虑把O(c )的转移压缩为O(1)变形:a=j/w[i]b=j%w[i]j=b+aw[i]思路:承重为j时

2021-05-09 21:53:46 221

原创 2021-ICPC昆明站M-Stone Games(思维+主席树)

题目链接:M-Stone Games_第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)(重现赛) (nowcoder.com)对于【L,R】区间所能表示的【1,x】,其中x即是所能表示的连续的最大值,也就是表示不了x+1了,记不能表示的最小值为mex如何扩展?对于a[r+1]来说:如果a[r+1]>x+1,那么肯定表示不了x+1,有效值域还是原来的【1,x】如果a[r+1]<=x+1,那么有效值域就能扩展到【1,x+a[r+1]】因此如果我们让这段区间

2021-04-27 17:30:32 448

原创 回滚莫队||不删除莫队

回滚莫队也叫做不删除莫队,对于某些在莫队中的操作,不好统计删除操作是就可以回滚。回滚的意思就是,先撤销对某个点的操作然后再增加回来(所以同理有不增加莫队)如果块中的两点在同一个块上,那么暴力即可。这样每次操作的复杂度为根号n如果不在同一个块中,那么需要将左端点置与块中的末端,右端点置于下一块的首端,可以知道对于同一个块中的右端点总是递增的所以统计一个块右端点的复杂度为n,有根号n个块,那么总复杂度为n根号n所以总体复杂度还是n根号n级别的。...

2021-04-17 11:09:47 461

原创 LCA 学习笔记

据我所知,实现LCA有三种方法:基于二分搜索、基于RMQ、树链剖分基于二分搜索其实就是对父子节点做一个2^k表,也就是倍增的思想,但是这个二分搜索的搜索方式有点与众不同int lca(int u,int v){ if(depth[u]>depth[v]) swap(u,v); for(int k=0;k<max_log_v;k++) { if((depth[v]-depth[u])>>k&1) {

2021-04-10 15:28:05 167

原创 网络流最大流学习心得

Ford-Fulkerson起点是s,终点是t残余网络:满足f(e)<c(e)的边和f(e)>0的反向边(这个边是一开始就可以加上去,设为0)这是一个寻找增广路的工具,这里涉及到一个退流的概念,如果找到一条可以更新的路径,那么可能需要把原来的某段流退回去一部分(当然也有可能完全不退)增广路:利用残余网络找到的s-t路径我们可以用最大流最小割定理间接证明这个算法是正确的。算法实现:不断对残余网络进行搜索,知道找不到增广路为止算法复杂度为o(FE),实际应该比估算要快一点

2021-04-08 21:38:33 313

原创 线性筛以及欧拉函数和莫比乌斯函数

线性筛也叫欧拉筛,是欧拉函数和莫比乌斯函数的前置知识。首先线性筛在筛素数时比埃氏筛快3到4倍(在数据较小时比后者稍慢,据说是由于模运算的缘故)线性筛的基本思想就是对于每一个合数只被筛一次而且只会被最小质因数筛掉。代码如下:for(int i=2;i<=maxn;i++) { if(!vis[i]) prime[++num]=i; for(int j=1;j<=num&&i*prime[j]<=maxn;j++)

2021-03-17 21:15:38 234

原创 二分图匹配 一般图匹配 带花树

一些常用概念和定理:Hall定理:  二部图G中的两部分顶点组成的集合分别为X, Y; X={X1, X2, X3,X4, .........,Xm}, Y={y1, y2, y3, y4 , .........,yn}, G中有一组无公共点的边,一端恰好为组成X的点的充分必要条件是:X中的任意k个点至少与Y中的k个点相邻。(1≤k≤m)匹配:  给定一个二分图G,在G的一个子图M中,M的边集中的任意两条边都不依附于同一个顶点,则称M是一个匹配。图一中红线为就是一组匹配。未盖点:  

2021-03-14 17:48:52 222

原创 区间dp及平行四边形优化

dp[i][j]=dp[i][k]+dp[k+1][j]+cost[i][j]这是区间dp最常见最普通的转移方程平行四边形优化的证明步骤:1、证明cost()函数为凸2、证明dp()为凸3、证明决策单调性,即s[i][j-1]<=s[i][j]<=s[i+1][j](似乎只要满足四边形不等式的都满足决策单调性)不同题型内的证法都不同。如果花费函数满足区间包含单调性和四边形不等式,那么dp就满足四边形不等式;如果dp满足四边形不等式,那么s(i,j)决策函数就满足决策单

2021-03-05 22:16:42 238

原创 数论 学习笔记

注意点一:矩阵不满足乘法交换律。矩阵快速幂:就是吧快速幂中的乘法换成矩阵的乘法例一:http://poj.org/problem?id=3070题目:斐波那契数列f(n),给一个n,求f(n)%10000,n<=1e9;(这题是可以用fibo的循环节去做的,不过这里不讲,反正是水题)矩阵快速幂是用来求解递推式的,所以第一步先要列出递推式:f(n)=f(n-1)+f(n-2)第二步是建立矩阵递推式,找到转移矩阵:,简写成T * A(n-1)=A(n),T矩阵就是那个2*2.

2021-03-02 18:46:03 1136

原创 莫队 学习笔记

莫队的前身是滚动的尺取法。莫队是一个很神奇的算法,我们仅仅改变一下问题求解的次序就能得到一定程度上的优化。归根结底是分块思想,一般分为根号n块,这样每组数据的算法复杂度就是(n+m)根号n。这是一个必须离线的算法。...

2021-02-25 22:11:44 159

原创 different intergers

题意:给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R(1≤L,R≤n)。对于每个询问,输出a[1...L]和a[R...n]的不同数字的个数。

2021-01-25 09:55:54 173

原创 强联通分量 割点 割边 2-sat问题

树的直径:两次dfs求。任意一个点的距离最远的一个点总是在直径(s,t)上。证明:引理:在一个连通无向无环图中, x 、y 和 z 是三个不同的结点。当 x 到 y 的最短路与 y 到 z 的最短路不重合时, x 到 z 的最短路就是这两条最短路的拼接。定理:在一个连通无向无环图中,以任意结点出发所能到达的最远结点,一定是该图直径的端点之一。分两种情况:当出发结点在直径上,当出发节点不在直径上(当最远路与直径相交,或者不相交)画图看一下即可。...

2021-01-15 20:58:58 225

原创 线段树套线段树 二维线段树

二维线段树的维护用于pushdown操作不能实现(你会发现不断递归才能找到正确答案)而对于pushup操作,似乎也不方便(待会可以试试)这时引入一个标记永久化的概念,我们在维护线段树时会使用一个max数组维护数量关系而对于永久化而言,所有子区间同样适用,这样需要另开一个数组tag维护永久化的内容刚开始用于tag数组只会更新内层出现错误,后来想想,标记永久化同样需要max子数组,因为同一块永久化内容里面也可能会出现分歧,我们需要更新塔,避免出现错误但是这样的更新对于tag内容是一种

2021-01-11 17:10:44 204 1

原创 最小生成树 学习笔记

连通图才有生成树,所以假定图是连通的。而且对于任意一个点作为树根,都能见一颗最小生成树,所以最小生成树在形式上不是唯一的。prim算法:实现:设T为生成树的子图,不断选取T连接剩下点集的最短边。证明:设T为生成树的子图,设e为所说的最短边,假设不连e边,连其他任意边f,我们都可以通过删除f连e边建立一个新的树,树的总权值只会更小。用堆维护。实现起来很简单就不帖代码了。kruskal算法:实现:把所有边的权值排序一遍,只要不产生圈加入就行。证明:很显然是对的。...

2020-12-08 18:03:03 126

原创 位运算 学习笔记 持续更新

集合的整数表示当集合中的元素较少时,我们可以通过二进制码来表示集合,这样枚举子集什么的就更加方便快捷吗,有多快可以从下面的代码看出空集 0只含有第i个元素的集合{i} 1<<i含有全部n个元素的集合 (1<<n)-1判断第i个元素是否属于集合S if(S>>i &1)向集合中加入第i个元素 S|(1<<i)从集合中去除第i个元素 S&~(1&...

2020-11-18 17:36:48 125 1

原创 最短路 差分约束系统 学习笔记

关于最短路,就学了几种基础算法,分别是:最简单的bfs求路径、dijk、bellman、floyed、以及基于bellman的SPFA。其实单纯最短路算法在比赛中几乎很少用到(比如像acm这样的正式比赛,它们在我看来只是提供算法基本思路的形象例子之一)bfs最为简单不说了。dijk基于贪心思想,解决的是单源最短路问题。其实现步骤大致如下:找出一个距离起点最近的未用过的点(这个距离本身就可以认为是起点到这个点最短的距离了),然后通过这个点不断更新这个点能够达到的点。所有点都用过之后,d[s][t]

2020-11-18 12:18:08 267

原创 STL常见容器知识的整理 持续更新中

1.vector简单说,就是一个不定长数组,而且我们可以通过指针对数组的元素进行删除操作2.queue分为queue普通和priority_queue普通queue是先进先出的这是性质没什么好多的出列用pop(),入列用push(),取队首用top().关于优先队列,基本操作的普通队列一样;就是队列的优先级可以自己调一下,要学会怎么调优先级常见的就是对node的排序priority_queue在申明的时候可以简写也可以略写完整形式为priority_queue<基本

2020-11-08 21:02:08 147

原创 线段树及树状数组 学习笔记 持续学习更新中

这个星期重温了下原本就“脆弱”的线段树(好吧是我太菜了)才。。。。发现。。。原来线段树里面还有懒惰标记这玩意儿。。。看起来挺复杂的。。。的确刚开始看时懵逼了好一阵子主要是因为,某些博客上贴的代码实在有点这样那样的问题,建议找板子的要找靠谱的,看代码的主要看个大概就行验证一下思路,因为你会发现,有些代码经不起抠好吧正式进入正文哈哈哈哈哈哈先来简单回顾一下线段树基础:线段树以二进制为载体(我个人觉得这算是位运算衍生出来的一种数据结构),主要思想还是二分(仔细想想到底是不是),..

2020-11-03 23:34:00 226

空空如也

空空如也

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

TA关注的人

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