算法学习随记
个人的学习笔记
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 · 98 阅读 · 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 · 108 阅读 · 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 · 128 阅读 · 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 · 123 阅读 · 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 · 83 阅读 · 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 · 174 阅读 · 2 评论 -
树的重心
定义:树的重心也叫树的质心。对于一棵树n个节点的无根树,找到一个点,使得把树变成以该点为根的有根树时,最大子树的结点数最小。换句话说,删除这个 [1] 点后最大连通块(一定是树)的结点数最小。性质:树中所有点到某个点的距离和中,到重心的距离和是最小的,如果有两个距离和,他们的距离和一样。把两棵树通过一条边相连,新的树的重心在原来两棵树重心的连线上。一棵树添加或者删除一个节点,树的重心最多只移动一条边的位置。一棵树最多有两个重心,且相邻。求取代码:int head[maxn];//前原创 2020-09-15 13:31:05 · 116 阅读 · 0 评论 -
求回文串最大长度的处理
寻找最大回文串长度,一般方法处理O(n^3) ,具体为寻找每一个子串,并判断是否为回文串特殊化处理对字符串中每一个空隙插入一个字符 如 “#”再从回文串中心向外寻找,如果碰到不相等,则得到当前中心最大回文串长度复杂度O(n^2)这里要注意对边界的处理马拉车算法O(n)放篇博客https://blog.csdn.net/csdnnews/article/details/82920678...原创 2020-09-06 16:34:28 · 87 阅读 · 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 · 79 阅读 · 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 · 82 阅读 · 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 · 90 阅读 · 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 · 143 阅读 · 0 评论