自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 诱导公式的个性化利用

奇变偶不变,符号看象限,可把角当做锐角,看目标函数的象限,相当于反过来,但我这种是正向推,方便。

2022-03-15 00:24:56 200

原创 【考试】list1

目录知识点题目[NOIP2017 提高组] 宝藏1.[NOI2001] 炮兵阵地2.[NOIP2001 提高组] 数的划分3.[CSP-S2019] 树的重心4.[CSP-S2019] Emiya 家今天的饭5.[CSP-S2019 江西] 多叉堆6.[CSP-S 2021] 廊桥分配7.[CSP-S 2021] 括号序列8.[CSP-S 2021] 回文9.[CSP-S 2021] 交通规划10.[十二省联考2019]异或粽子11.[NOIP2020] 字符串匹配12.[NOIP2020] 微信步数13.

2021-11-17 23:07:08 204

原创 【考试】list2

目录知识点题目1.邮票 Stamps2.木棍加工3.种树4.钓鱼5.[NOIP2015 普及组] 推销员6.[NOIP2013 普及组] 车站分级7.Work Scheduling G8.[NOIP2015 提高组] 斗地主9.扇区填数10.[AHOI2018初中组]分组11.三角形牧场12.[NOI2014] 起床困难综合症13.[NOIP1999 提高组] 旅行家的预算14.[NOIP2012 提高组] 国王游戏15.[国家集训队]特技飞行16.[NOIP2010 提高组] 关押罪犯17.[HAOI20

2021-11-17 20:23:56 2637

原创 【基础】贪心整理

贪心思路注意思路1.sort之后,发现样例中的规律,硬搞2.可以不用sort,直接找规律for循环3.手模样例,发现规律4.注意

2021-11-08 22:21:45 148

原创 【基础】易错点总结

​问题:1:开数组的时候看好数据范围,尤其是建边的时候,有的时候双向建边就会炸数组2:数组开的时候和数组赋初值注意n,m的意义,和0x3f的大小,会不会炸3:必须看清题目中的边的数目,可能有重边,不能根据点的开,最多开到n*(n+1)//2,还有mle的问题,同时也要考虑4.priority_queue是大跟堆,重载运算符的时候注意符号方向问题5.正常情况下,迭代加深搜索比一般的搜索剪枝慢很多,迭代加深无法最优化剪枝,快300ms6.kmp计算的时候,是用i和j+1比较。j要从0开始,因为j+

2021-11-08 19:26:41 98

原创 【图论】浅析费用流

目录模板直接应用费用流之二分图最有匹配最大权不相交路径网格图模型拆点费用流之上下界可行流模板EK#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=

2021-11-07 12:00:06 108

原创 【图论】网络流模板

网络流最大流,最小割费用流最大流,最小割dinic#include<iostream>#include<cstdio>#include<cstring>#include<queue>#define ll long longusing namespace std;const int Maxn=2e2+5,Maxm=(5e3+50)*2,INF=1e8;struct edge{ int to,nxt; ll f;}e[Maxm];int

2021-11-07 10:25:50 67

原创 【图论】二分图

二分图结论二分图的判定最小点覆盖(二分图)最大独立集(二分图)最小路径覆盖(DAG)最小路径重复点覆盖(DAG)结论1.最大匹配数=最小点覆盖=总点数-最大独立集=总点数-最小路径覆盖2.一个图是二分图=图中不存在奇数环=染色法没有矛盾3.匹配:任意两条边都没有公共点4.匹配点:在匹配中的点5.最大匹配=不存在增广路径二分图的判定定义:看一个图中的点能不能分成满足下面条件的两部分,同一个集合内部的点之间没有直接边相连,图中的边只存在与相邻的两个集合中方法:染色法,就是dfs或bfsd

2021-11-07 10:16:50 164

原创 【图论】浅析最大流

​@[TOC] [目录]dinic模板inline bool bfs(){ while(!q.empty()) q.pop(); q.push(S); memset(dep,0,sizeof(dep)); dep[S]=1;cur[S]=head[S]; while(!q.empty()) { int now=q.front();q.pop(); for(int i=head[now];i>1;i=e[i].nxt) { int nx=e[i].to; if

2021-11-07 08:25:09 262

原创 【图论】浅析最小割

​最小割割的定义最小割模板dinic最小割的直接应用最大权闭合图最大密度子图最小点权覆盖集(二分图)最小割之最大独立点集(二分图)割的定义割就是一个点集,可以是图上任意几个点的任意组合,只要把图分成两个不相交的子集就可以,我们可以发现,一个图会有2^(n-1)个割最小割模板dinic最小割的直接应用就是直接用dinic算出最小割最大权闭合图// u,v,cfor(int i=1,t;i<=n;i++){ t=read(); add(i,T,t);}for(int i=1,a

2021-11-05 08:30:12 1680

原创 【图论】匈牙利算法(二分图最大匹配)

注意几个问题:1.#include<iostream>#include<cstdio>#include<cstring>using namespace std;inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1;ch=getchar(); } while(ch>='0'&&ch&l.

2021-11-02 10:13:06 218

原创 【动态规划】动态规划总结

数组表示一个集合,表示的值是集合的一个特性(可以自己定),每一个集合都有几个限制条件,求出的值必须满足这个特性。转移方程的推导可以看做是把一个集合划分成几个不同的子集,这些子集的特性是已知的,就可以转移。1.状态表示:集合、属性2.状态转移:划分集合注意问题:1.每一个存在和合理的状态的值都必须存在,且值必须是正确的。如果有一个状态不合理,必须和所求的属性赋值一个极大的相反值2....

2021-10-30 19:33:35 190

原创 【动态规划】最大子段和(子矩阵)优化

1.最大子段和的优化我们可以看出来,一个数,要不就是一段序列的结尾,要不就当开头,如果前面的成一个下降趋势的话,就可以得出当前的和前面的结合肯定是劣于自己当头,所以好理解的方式就是开一个数组,记录到 i 的最大子串和,就可以顺理成章的转移了int n,ans=-1e9;int f[Maxn];int main(){ n=read(); for(int i=1,t;i<=n;i++) { t=read(); f[i]=max(t,f[i-1]+t); ans=max(a

2021-10-28 15:39:10 156

原创 【基础】高精度(和 差 积 商 余)

重点说一下除法的操作除法就是枚举除数的1ek倍,然后用被除数减去这个数,给ans的第k位++取模运算就是每次减去被除数的1ek倍,直到不能减为止,就是ans加法减法和乘法就是先算好,然后一位一位处理就行了,最后再去掉前导0最后要注意的是,输入的时候忙吧最低位放在1,好进位,就是翻转一下struct data{ int num[Maxn]; int len; char op; data(){ memset(num,0,sizeof(num));len=1;op='+';}};.

2021-10-27 18:08:28 93

原创 【图论】lca复习记录

1.lca可以求树上两点之间路线的距离,再开一个数组进行倍增处理最小值,或者最大值的限制,讲ans和这个新开的倍增数组进行比较,得ans2.lca可以和其他的结合在一起考,很恶心比如何最小生成树一起,这样,拿到题的时候就不一定能看出是不是一个树上的问题了...

2021-10-22 21:10:52 88

原创 【数据结构】浅析字典树(Trie)

字典树是一种比较容易的数据结构,个人觉得理解起来比较简单,只要掌握几个基本要点就可以了1.字典树有一个超级原点是0点2.因为超级原点的存在,所以在查询的时候(比如说查前缀的数量),要加的不是当前节点的cnt[now],而是son[now][u]的cnt,这样就可以避免自己忘了在最后加上cnt[now]3.插入的操作也是比较简单,注意的是把now循环到最后一点的时候再加cnt,也就是在for循环外侧进行懒惰标记,方便以后查找4.字典树里的懒惰标记就是以当前节点为结尾的字符串有多少个5.怎么

2021-10-21 16:41:05 181

原创 【数论】浅析康拓展开

康拓展开利用了字典序的关系,其实就是一个暴力的思路和排列组合的知识,把一个序列离散化城几个数字,这样对一种情况的记录,或者是状态的转移更加方便,高效如果对于空间有要求,开不下树状数组的话,可以考虑直接有cantor展开的暴力写法暴力代码inline ll contor(ll t[]){ ll base=1;f[0]=1; for(ll i=1;i<=n;i++) f[i]=(f[i-1]*i)%mod; ll s=1; for(int i=1;i<n;i++) {

2021-10-21 10:12:36 72

原创 【数据结构】树状数组的简单操作

树状数组可以求和,也可以利用差分数组进行单点查询,和区间修改最重要的莫过于lowbit函数,就是俗称的low逼函数(low到爆)查询和修改其实很简单,利用了二进制的特殊性质,把一个区间的前缀和查询更改成二进制分块后的多个点加和求值更新函数inline void update(int x,int k){ for(;x<=n;x+=(x&-x)) tre[x]+=k;}查询函数inline int query(int x){ int t=0; for(;x.

2021-10-21 10:04:50 62 1

原创 【数论】浅析中国剩余定理

中国剩余定理,本质思想是用一个假设出来的通解求出需要满足这个通解的性质,然后根据这些性质去反推x的通解。这个思想还是很好理解,不敢苟同于过于长的题解假设

2021-10-21 08:08:04 567 1

原创 【基础】二分模板

整数的二分查找模板一while(l<r){ int mid=(l+r)>>1; if(a[mid]>=x) r=mid; else l=mid+1;}模板二while(l<r){ int mid=(l+r+1)>>1; if(a[mid]<=x) l=mid; else r=mid-1;}二分答案模板while(l<=r){ mid=(l+r)>>1;.

2021-10-20 08:33:21 61

原创 【动态规划】容斥原理的巧妙dp

实在想不出来容斥原理,我太弱了关键就在于每次询问如何利用重复的信息暂且先当成完全背包,每种硬币可使用无限次,预处理f数组,f[i]f等于买价值ii的东西的总方案数然后就要从中减去不合法的。首先肯定会有一种硬币超额使用,第jj中硬币等于说强制选了dj+1个,剩下的依然随便选,那么第j种硬币超额的不合法的方案数等于,于是从答案里减去还要注意,第一种第二种都超额、第一种第三种都超额、第一种第四种都超额、第二种第三种都超额、第二种第四种都超额、第三种第四种都超额的方案在上一步中都被减了两次,所以.

2021-10-18 16:30:53 140

原创 【图论】判环

在有向图中判断是否有环可以采用以下算法1.tarjan求强联通分量2.并查集判环3.spfa判断负环4.dfs暴力判环下面给出并查集判环的代码可以判最小环,也可以判断最大环using namespace std;int f[200002],d[200002],n,minn,last; //f保存祖先节点,d保存到其祖先节点的路径长。 int fa(int x){ if (f[x]!=x) //查找时沿途更新祖先节点和

2021-10-18 10:53:14 287

转载 【贪心】经典贪心问题(任务安排)

将奶牛的路径转化为线段,以右端点为第一关键字,左端点为第二关键字,按第一关键字从小到大排序,若第一关键字相同则按第二关键字从大到小排序。然后按序枚举线段,看看是否可以放(区间最小值>0>0),如果可以,则区间内所有的数-1−1,答案+1+1,用线段树维护区间最小值。这为什么是对的呢?第一个结论证明比较显然,左端点从大到小取最优(假设右端点全都是r)。然后我们证明第二个结论,右端点从小到大取最优。第一条线段一定要加入。假设已经到了第ii条线段,端点为l_i,r_ili​,r

2021-10-10 11:36:24 186

原创 【图论】最短路的路径计数

floyd算法例题P1841 [JSOI2007]重要的城市在算一般的图的时候可以使用int fi[205][205];int ki[205][205];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) { fi[i][j] = 0x3f3f3f3f; } fi[i][i] = 0; }

2021-10-10 09:32:06 94

原创 【数据结构】单调栈 单调队列

就是一个贪心的思想,但是思维量大,容易写炸单调栈:P1823 [COI2007] Patrik 音乐会的等待n=read();for(int i=1,x;i<=n;i++){ x=read();t=1; while(a[0]>0&&x>=a[a[0]]) { if(a[a[0]]==x) t++; ans++;a[0]--; } if(a[0]>0) ans++; while(t--) a[++a[0]]=x;}printf(

2021-10-04 18:07:21 59

原创 模板整理

一:组合1 . 错排定义:n个有序的元素应有n!个不同的排列,如若一个排列使得所有的元素不在原来的位置上,则称这个排列为错排;2.可重集排列组合定义:可以重复排列组合C(n+r-1,r)3. 二项式定理4.卡特兰数特征:1 1 2 5 14 42 132 429 1430 4862初值:5. 全排列while(next_permutation(a+1,a+n+1))6.杨辉三角倒叙循环二:图论1.最短路...

2021-10-03 17:30:41 167

转载 【数据结构】对顶堆的应用

对顶堆顾名思义,对顶堆是两个堆组成的特殊的数据结构如果说上面是个小根堆,下面是个大根堆,小根堆的元素都大于大根堆的元素,那么我们可以发现:每一层节点从上往下逐层递减所以对于addadd操作,我们先将元素放入下面的大根堆内,从堆顶不断取出元素放到小根堆直到大根堆元素个数为ii,这样大根堆的根就是第i小的元素,同时可以保证对顶堆的性质同理,对于getget操作,我们先输出大根堆的根,然后将小根堆的根移到大根堆(因为i每次加一,要始终保证大根堆有i个元素),这样仍保证对顶堆的性质不变...

2021-10-03 10:03:49 160

原创 【STL】map的指针遍历

使用iterator,利用it->first和it->second实现遍历map<string,int> mp;map<string,int>::iterator it;for(it=mp.begin();it!=mp.end();it++){ ans+=pow(it->second,2); ans%=mod;}

2021-10-03 08:14:55 492

原创 易错点总结

1:开数组的时候看好数据范围,尤其是建边的时候,有的时候双向建边就会炸数组

2021-10-02 19:06:18 70

原创 【字符串】字符串的最小表示法

详情参考:P1709个人觉得和kmp算法有些类似,就是细节较多取min(i,j)意思是如果两个字符串是一样的,则选开头最小的那个k是最重要的优化读入的时候最好用cin以防换行的干扰inline int node(int l){ int i=0,j=1,k=0; while(i<l&&j<l) { k=0; while(s[(i+k)%l]==s[(j+k)%l]&&k<l) k++; if(k==l) return

2021-10-02 17:33:26 176

原创 【图论】差分约束

查分约束就是跑最短路的代码,个人喜欢spfa虽然容易被卡注意点:1.预处理建边,看好条件,分析一下 i 到 i + 1 的最短情况是什么,在分析 i 到 i - 1的最短情况,需要建这两向的边,否则有可能跑不到终点。2.建边方向要对,看好题目中要求什么,是要最长路还是最短路3.最易spfa过程中,取出队首元素的时候需要吧vis改成0,否则就炸了4.跑的时候queue不用开struct 只需把点的编号记录就行代码:#include<iostream>#include

2021-10-02 13:12:01 80

原创 【基础】中缀表达式求值模板

​//参考老师代码 #include<iostream>#include<cstdio>#include<cstring>#include<stack>#include<cmath>#include<algorithm>#define Maxn 100000using namespace std;int n,m;stack<int> s1;stack<char> s2;inline i.

2021-09-30 15:30:39 95

原创 【STL】string常见用法

#include<iostream>#include<cstdio>#include<string>using namespace std;string a;int main(){ getline(cin,a); while(a.find(' ')!=a.npos) { a.erase(a.find(' '),1); } cout<<a; return 0;}

2021-09-30 15:28:20 64

原创 【数论】exgcd的扩展应用

例题P1516已知,令解就为

2021-09-28 22:33:48 63

原创 【数据结构】用vector实现可遍历的大根堆priority_queue

就是用了upper_bound优化插入inline void ins(int x,int i){ v[i].insert(upper_bound(v[i].begin(),v[i].end(),x),x);}

2021-09-24 20:01:42 165

原创 9.22 误区指出

memcpy的速度还没有直接for循环快个人理解就是其实底层是一样的for循环,而自己写的话是复制到n就停止,而自带函数是循环sizeof(数组),这样就浪费不少时间

2021-09-22 20:21:38 46

原创 【动态规划】悬线法求多种约束的最大子矩阵

定义几个东西:left[i][j]left[i][j]:代表从(i,j)(i,j)能到达的最左位置right[i][j]right[i][j]:代表从(i,j)(i,j)能到达的最右位置up[i][j]up[i][j]:代表从(i,j)(i,j)向上扩展最长长度.递推公式:left[i][j]=max(left[i][j],left[i-1][j]left[i][j]=max(left[i][j],left[i−1][j]right[i][j]=min(right[i][j],ri.

2021-09-22 20:19:19 81

原创 【算法】搜索的易错点

1.开一个临时存储的变量要在dfs里开,否则进入下一层时,值会被覆盖导致结果错误2.

2021-09-04 22:46:20 69

原创 【基础】指针在子函数中的传递

传一个参数的值,可以直接对地址上的数字进行操作int a,b;inline void swap(int *a,int *b){ int tmp=*a; *a=*b; *b=tmp;}int main(){ a=1;b=2; swap(&a,&b); printf("a=%d b=%d",a,b); return 0;}如果传递一个一维数组可以这样inline void node(int x[]){ x[1]=0;}int main(.

2021-09-04 10:42:28 444

原创 【基础】struct的函数操作

基本和子函数的写法相同,可以加inlineinline int area(){ if(!cnt) return 0; else return (rx-lx)*(ly-ry);}重定义运算符最好用友元函数friend bool operator *(rectangle x,rectangle y){ if(!x.cnt||!y.cnt) return 0; if(x.in_rec(y.lx,y.ly)||x.in_rec(y.lx,y.ry) ||x.in_rec(y.rx,

2021-09-04 09:36:13 555

空空如也

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

TA关注的人

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