02 2022 档案
摘要:注意考虑下边界和0的大小关系 边界分析: 所求范围: \(i\in [1,n],p \in [0,(m-u)/v_
阅读全文
摘要:void pre() { for(int i=1;i<=n;i++) f[i][0]=a[i]; int t=log(n)/log(2); for(int j=1;j<=t;j++) for(int i=1;i+(1<<j)<=n+1;i++) f[i][j]=max(f[i][j-1],f[i+(
阅读全文
摘要:给定一个长度为 N 的序列 A,要求把该序列分成若干段,在满足“每段中所有数的和”不超过 M 的前提下,让“每段中所有数的最大值”之和最小。 试计算这个最小值 容易得到转移方程: \[ f(i)=\min_{0\le j<i,sum(i)-sum(j) \le m}\{f(j)+ \max_{j+1
阅读全文
摘要:有 N 块木板从左到右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第 i 个木匠要么不粉刷,要么粉刷包含木板 S_i 的,长度不超过 L_i 的连续的一段木板,每粉刷一块可以得到 P_i 的报酬。 不同工匠的 S_i 不同。 请问如何安排能使工匠们获得的总报酬最多 注意:
阅读全文
摘要:求折线形子序列个数 典型树状数组优化dp #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <ctime> #define ll long long using namespa
阅读全文
摘要:有代价线段覆盖模板题 注意: 我们应当按照右端点排序 而不是左端点 因为我们要的是右端点递增 在给线段排序之前 要考虑好左端点和右端点的排序顺序 是不是能够考虑到所有的情况 #include <iostream> #include <cstdio> #include <cstring> #inclu
阅读全文
摘要:从(x,y)到第n行的行动次数期望值 每次可以等概率的留在原地 向左移动 向右移动和向下移动 在倒推的时候 概率已经被包括在已经计算出来的答案中了 就可以直接利用期望的性质计算 而不需要概率数组 高斯消元的时候,把阶段内相互制约的部分作为消元的对象 这道题由于矩阵中有很多的0 采用普通的高斯消元会浪
阅读全文
摘要:给定dfs序列 求有多少中可能的树形结构 保证不重复: 我们只枚举第一个子树的情况 #include <iostream> #include <cstdio> #include <cstring> #define ll long long const int N=305; const int mod
阅读全文
摘要:给定无向图 最少去掉多少个点可以让图不连通 如果有割点 那么答案是1 所以不能用tarjan做法 而应该采用网络流做法 题目这种要求和最小割很类似 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #d
阅读全文
摘要:求二分图的不可行边 对于完备匹配的二分图来说: 如果我们把匹配边看做从右向左的单向边,其他边看做是从左向右的单向边 那么在图上行走的过程就是一条增广路 必须边: (x,y)匹配 去掉(x,y) x不可达y 即在两个强联通分量中 可行边: 在同一个强联通分量中 对于一般的二分图 我们可以通过汇点来构建
阅读全文
摘要:给定一个有向无环图 最多找到多少个点 并且这些点相互不连通 有向无环图的最小路径点覆盖=n-拆点二分图的最大匹配(路径不能相交) 每个左部点的失配代表该点没有出边 所以代表着一条路径的终点 终点最少,失配点最少,路径覆盖就最少 最小可重点覆盖(路径可以相交) 先传递闭包 再最小点覆盖 d[i][i]
阅读全文
摘要:国际象棋最多放多少个马? 正常连边 用染色法证明是二分图 求二分图的最大独立集 无向图: 最大团=补图的最大独立集 二分图: 最大独立集=n-最小点覆盖
阅读全文
摘要:给定一些矩阵 要求矩阵的指定位置被宽度为1的长方形覆盖 长方形可以重叠 但是只能覆盖在指定位置 最少要多少个长方形 2要素: 要么被行覆盖 要么被列覆盖 所以行和列之间建立二分图即可 #include <iostream> #include <cstdio> #include <cstring> #
阅读全文
摘要:有两台机器 A,B 以及 K 个任务。 机器 A 有 N 种不同的模式(模式 0∼N−1),机器 B 有 M 种不同的模式(模式 0∼M−1)。 两台机器最开始都处于模式 0。 每个任务既可以在 A 上执行,也可以在 B 上执行。 对于每个任务 i,给定两个整数 a[i] 和 b[i],表示如果该任
阅读全文
摘要:平面上给定n个白点和n个黑点,求一种方案:白点黑点相连并且不相交 容易发现结论: 如果有交叉的话 那么只要交换一下端点 就不会有交叉了 关键在于发现: 四边形两条对边的和一定小于对角线的和 所以交换之后就会变小 所以把距离作为权重 做最小权匹配 就一定是可行的方案 #include <iostrea
阅读全文
摘要:给定矩阵 从1,1到n~m设计k条线路 取走格子中的数(重复经过只取一次)k条线路和的最大值是多少 技巧: 每个点拆成入点和出点 实现点边的转化 通过限制费用大小和流量大小 来实现被取走的次数和贡献 #include <iostream> #include <cstdio> #include <cs
阅读全文
摘要:导弹有:发射时间/冷却时间/到达时间 给定若干个防御塔和目标 问最少多少时间能够消灭所有敌人 最多最少问题先看看二分答案!!! 二分答案之后 根据二分的时间 可以确定每个塔的匹配数 二分图匹配要求每个点都是等价的 因此这道题只能用拆点来做 #include <iostream> #include <
阅读全文
摘要:给定带有禁止位置n*n棋盘最多能放多少个车 1元素: 每行只能放一个车 这个车的行列号是唯一的 0元素: 一个车不能同时在两个行 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const i
阅读全文
摘要:n*n的带有禁止位置的棋盘最多能放多少个1*2的多米诺骨牌 棋盘覆盖问题: 染色法 最多能放置多少个的问题 建模的策略在于找到问题包含的0要素和1要素 //确实只dfs左点 //match是双向的(对答案没有影响) // 注意是vis[y]=1 因为注意到dfs访问的点都是左点 而y都是右点 我们要
阅读全文
摘要:给定一个图 将点划分成两个集合 求集合内部边的最大值 二分图判定: 不存在奇环 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=20005; const int M=1
阅读全文
摘要:给定两个0/1序列 要求经过若干操作从一个序列变成另一个序列 其中给定若干组关系 操作一个的时候另一个也会变化 每个位置只能被主动操作一次 关系不具有传递性 求方案数 #include <iostream> #include <cstdio> #include <cstring> #include
阅读全文
摘要:高斯消元 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int eps=1e-8; const int N=15; double a[N][N]
阅读全文
摘要:区间dp: 将l~r的区间进行合并 通过枚举分界点来转移状态 环形问题: 断环城链 复制后接起来 之后重点在于只枚举长度为n的区间即可 #include <iostream> #include <cstdio> #include <cstring> const int N=105; const in
阅读全文
摘要:给定一颗树形的网络 叶子结点为汇点 根节点为源点 求最大流量 换根dp: 适用于对于每一个点都要作为根进行一遍dp的题目 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <c
阅读全文
摘要:当一个背包有两个维度的价值的时候 可以考虑把价值压到状态里 这道题记录绝对值的话没有办法唯一确定价值 所以要记录差值 为了保证数组下标始终为正 所以我们要加上偏移量 在记录路径的时候 G不能够省去第一维度了 否则的话记录的只是最后一层从哪里来 就会出错 G只是纯粹的记录从哪里来 不存在递推的关系 #
阅读全文
摘要:树上背包问题 每一个子树就是一组背包 由于最后选根节点 因此根节点可以看做是必须选的一组 才有了后面的递推 void dfs(int x,int fa) { f[x][0]=0; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if(y==fa)
阅读全文
摘要:每个孩子有一个贪婪度,第 i 个孩子的贪婪度为 g[i]。 如果有 a[i] 个孩子拿到的饼干数比第 i 个孩子多,那么第 i 个孩子会产生 g[i]×a[i] 的怨气。 给定 N、M 和序列 g,圣诞老人请你帮他安排一种分配方式,使得每个孩子至少分到一块饼干,并且所有孩子的怨气总和最小。 注意到怨
阅读全文
摘要:给定一个矩阵 求大小为k的凸多边形的权值最大值 轮廓线dp 思路很好想 但是细节很多 //错误点1: 为了保证必须有交集,q不应该从p+1开始枚举 而应该从l开始枚举 //错误点2: 左右边界相等的时候不是空集 而是大小为1的集合 枚举的时候要注意 //错误点3: 目标不一定是从第一行~第n行都占着
阅读全文
摘要:有三个人,最初在位置1,2,3 给n个请求,每次要派出一个人到指定的位置去 并且有一定的花费,求花费最小值 如果我们记录三个人的位置的话,会发现: 当前一定有一个人在指定位置,一定会有一个人在上一个指定的位置 又由于我们不关心具体哪一个人在哪一个位置 因此我们只需要记录不在指定位置的两个人就可以描述
阅读全文
摘要:给定序列A 构造序列非严格单调的B 使最小 搜索->dp 关键在引理: b中的数一定在a中都出现过 所以可以离散化考虑 只考虑出现过的数 #include <iostream> #include <cstdio> #include <cstring> #include
阅读全文
摘要:如果状态之间能够相互推出 注意排除冗余状态 //main:: f[0][1][1]=a[1][1]; for(int i=1;i<=(n+m-2);i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) if(i+2-j>0&&i+2-k>0) { int
阅读全文
摘要:照相过程中 给定每排的人数 要求后面比前面高 左边比右边高 后面一排比前边一排人多 求解总的方案数 f[0][0][0][0][0]=1; for(int i=1;i<=a[1];i++) for(int j=0;j<=min(i,a[2]);j++) for(int k=0;k<=min(j,a[
阅读全文
摘要:我的想法: f[i][j]表示以i结尾的a与j结尾的b的最长公共子序列 状态转移方程 时间复杂度: 我们要分析最长上升子序列,就必须分析最后一位,因此状态里要包含最后一位. 但是注意到这道题的特殊条件 a[i]和b[j
阅读全文
摘要:质因数分解n! for(int i=2;i<=n;i++) { if(vis[i]) continue; s[++tot]=i; for(int j=i;j<=n/i;j++) vis[i*j]=1; } for(int i=1;i<=tot;i++) { int p=s[i],sum=0,tmp=
阅读全文
摘要:L~R中质数距离最小最大值(R-L<=1e6) 思路过程: 注意到区间长度很小 我们考虑采用枚举区间长度的办法 转化思路 用内 所有的倍数筛掉区间内的数 复杂度不便 注意到这样会有重复 那么我们用内所有质数筛一遍就可以 线性筛包
阅读全文
摘要:动态维护01序列中第k个1的位置 为了配合树状数组 采用枚举每一位的方式来构成长度 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int N=1
阅读全文
摘要:1. 基本操作 运算 MATLAB 支持+ - * / 和^(次方运算) *,^ 支持矩阵乘法 dot(A,B) 点积 cross(A,B) 叉积 .* ./ .^ 代表对每个位置上的操作 inv(A) 矩阵求逆 变量定义 不需要定义变量类型 默认double A=10;(加分号表示不输出结果) A
阅读全文