02 2022 档案

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

点击右上角即可分享
微信分享提示