算法学习随记
个人的学习笔记
lifeforge
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
树套树(模板?)
代码用于解决二维待修改RMQ问题 UVA-11297 算是写的第一个树套树的题目吧 实际上这种数据结构套数据结构,也就是在一种熟知的数据结构的每一个节点,注意是每一个节点,而不是底层的节点重新写一套结构。本质上其实也就是普通线段树,就是对每个节点的pushup操作都必须重新构建,并且要严格注意调用的先后顺序。 int a[600][600]; int tree_maxx[2050][2050]; int tree_minn[2050][2050]; int n,m; void build_y(int id原创 2021-10-13 21:18:32 · 186 阅读 · 0 评论 -
蔡勒公式(日期计算)模板
string dayOfWeek[]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Suday"}; int DateToInt (int m, int d, int y)//年月日转int型数 { return 1461*(y+4800+(m-14)/12)/4+367*(m-2-(m-14)/12*12)/12-3*((y+4900+(m-14)/12)/100)/4+d-32075; } void IntToD.原创 2021-04-26 14:28:08 · 172 阅读 · 0 评论 -
2021寒假集训(1)动态规划
(1)区间DP 基本模板 for(int len=2;len<=n;len++) { for(int i=1;i<n;i++) { int j=i+len-1; if(j>n) break; for(int k=i;k<=j;k++) { dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); } } } (原创 2021-01-22 20:29:59 · 182 阅读 · 0 评论 -
线段判交模板
struct Point { double x, y; Point(){} Point(double a, double b): x(a), y(b){} }; typedef Point Vector; Vector operator + (Vector a, Vector b) { return Vector( a.x + b.x, a.y + b.y ); } Vector operator - (Vector a, Vector b) { return Vector( a.x -.原创 2020-11-20 16:32:34 · 179 阅读 · 0 评论 -
网络流-Dinic模板
朴素板子,没有加弧优化 int n, m, cnt;//点,边,前向星计数 int head[maxn];//前向星 int level[maxn];//分层 struct Edge { int to; ll val; int next; }edge[maxn*maxn]; void add(int u,int v,int val) { edge[cnt].to=v; edge[cnt].val=val; edge[cnt].next=head[u];原创 2020-09-25 13:44:07 · 143 阅读 · 0 评论 -
最大网络流-ford-fulkerson(FF方法)
基本思想博客 int edge[maxn][maxn]; int pre[maxn];//记录前驱结点 int vis[maxn];//判断是否跑过 int n,m;//结点数 边数 int s,t;//s为源点 t为汇点 int flow;//最大流 bool findpath()//bfs找增广路径 { queue<int> q; memset(vis,0,sizeof(vis)); memset(pre,-1,sizeof(pre)); vis[s]=1原创 2020-09-23 15:10:45 · 261 阅读 · 2 评论 -
树的重心
定义: 树的重心也叫树的质心。对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小。换句话说,删除这个 [1] 点后最大连通块(一定是树)的结点数最小。 性质: 树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。 把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。 一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。 一棵树最多有两个重心,且相邻。 求取代码: int head[maxn];//前原创 2020-09-15 13:31:05 · 222 阅读 · 0 评论 -
求回文串最大长度的处理
寻找最大回文串长度,一般方法处理 O(n^3) ,具体为寻找每一个子串,并判断是否为回文串 特殊化处理 对字符串中每一个空隙插入一个字符 如 “#” 再从回文串中心向外寻找,如果碰到不相等,则得到当前中心最大回文串长度 复杂度O(n^2) 这里要注意对边界的处理 马拉车算法O(n) 放篇博客https://blog.youkuaiyun.com/csdnnews/article/details/82920678 ...原创 2020-09-06 16:34:28 · 139 阅读 · 0 评论 -
假期集训(5)简单字符串随记
1.kmp 求两个符串的匹配 char be_match[maxn]; char match[maxn]; int Next[maxn]; void get_next() { int j=Next[0]=-1; int len=strlen(match); for(int i=1;i<len;i++) { while(j!=-1&&match[j+1]!=match[i]) j=Next[j]; if(match[j+1]==match[i]) j++; Next[原创 2020-08-16 09:51:45 · 135 阅读 · 0 评论 -
假期集训(4)简单数据结构随记
1.线段树 int lazy[maxn]; struct mode { int maxx; }tree[maxn]; void pushup(int k) { tree[k].maxx=max(tree[k*2].maxx,tree[k*2+1].maxx);//根据题目要求可修改 } void pushdown(int k) { if(lazy[k] { lazy[k*2]=lazy[k]; lazy[k*2+1]=lazy[k]; tree[k*2].minn+=lazy[k];原创 2020-08-11 10:13:41 · 141 阅读 · 0 评论 -
假期集训(3)简单图论随记
1.floyd 读入时注意筛选最小边 void floyd() { for(int u=0;u<=n;u++) for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) dp[i][j]=min(dp[i][j],dp[i][u]+dp[u][j]); } 2.dijkstra 函数调用前记得初始化 int dis[maxn]; int vis[maxn]; int a[maxn][maxn]; void dij(int start)原创 2020-07-26 21:10:32 · 155 阅读 · 0 评论 -
假期集训(1)简单dp随记
简单线性dp: 反复利用前态推出后态 上升子序列 for(int i=1;i<=n;i++) dp[i]=a[i]; for(int j=1;j<I;j++) If(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1) 01背包: 从后往前遍历 For(int i=1;i<type;i++) For(int j=weight;j>=w[i];j++) dp[j]=max(dp[j],dp[j-w[i]]+val[i] 完全背包:原创 2020-07-23 20:24:01 · 213 阅读 · 0 评论
分享