01 2022 档案

摘要:挖坑 #include <iostream> #include <cstdio> #include <cstring> #include <set> #include <cmath> #include <vector> using namespace std; const int N=17; con 阅读全文
posted @ 2022-01-23 16:48 __iostream 阅读(49) 评论(0) 推荐(0) 编辑
摘要:深度优先搜索 小木棍 int cnt=0; bool dfs(int len,int now,int used,int last)//枚举的长度 现在拼的长度 使用的棍棒数量 { if((used==n)&&(now==len)) return 1; if(now==len) { int fail= 阅读全文
posted @ 2022-01-21 20:41 __iostream 阅读(30) 评论(0) 推荐(0) 编辑
摘要:给定一个有向无环图,询问每个点可以到达点的数目. void toposort() { for(rint i=1;i<=n;i++) if(!deg[i]) q.push(i); while(!q.empty()) { int x=q.front(); q.pop(); f[x].set(x,1); 阅读全文
posted @ 2022-01-21 20:32 __iostream 阅读(30) 评论(0) 推荐(0) 编辑
摘要:给定m个长度为n的序列 每个序列选一个数求和,求最小的n个 用堆来模拟搜索的过程 关键在于状态不重复 朴素写法: 用map来维护m个指针,判重 但是空间复杂度是mn2的会爆 #include <iostream> #include <cstdio> #include <cstring> #in 阅读全文
posted @ 2022-01-21 20:24 __iostream 阅读(32) 评论(0) 推荐(0) 编辑
摘要:哈夫曼树: 最小化权值与距离的乘积和 对于形如 min{wi×li} 的形式,都可以考虑采用哈夫曼树来贪心 荷马史诗 哈夫曼树和trie树结合考察 两者有相似的性质, 并且满足哈夫曼树要求的条件 int main() { n=read(); k=read(); 阅读全文
posted @ 2022-01-21 19:07 __iostream 阅读(56) 评论(0) 推荐(0) 编辑
摘要:每个商品有收益p和时限d 求时限内的最大收益 法一: 当从前向后贪心的时候 可能会出现反悔的情况 这样局部最优解和全局最优解有不一致. 为了解决反悔问题,我们可以采用倒序贪心的方式 int main() { while(scanf("%d",&n)!=EOF) { while(q.size()) q 阅读全文
posted @ 2022-01-21 19:06 __iostream 阅读(24) 评论(0) 推荐(0) 编辑
摘要:给定一个序列 求其中最小的k个的和(这k个数任意两个不能相邻) 从k=2的时候出发: 发现要么选择最小的,要么选择最小元素两边的 用类似数学归纳的方式不断进行这种操作 设置一种反悔贪心 价值作为两边的价值减去中间的价值 #include <iostream> #include <cstdio> #i 阅读全文
posted @ 2022-01-21 19:03 __iostream 阅读(29) 评论(0) 推荐(0) 编辑
摘要:求基环树直径 未完成 挖坑 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #define ll long long #define fs first #define sc second #defin 阅读全文
posted @ 2022-01-20 18:39 __iostream 阅读(25) 评论(0) 推荐(0) 编辑
摘要:给定一棵树 给定一些障碍,用这些障碍来切断根节点到所有叶子节点的路径,可以移动障碍,求总时间最少 可能会发生这样的一种情况: 当前子树的军队去管辖别的子树 当前子树被别的军队管辖 正确且简便的思路应当是这样的: 1.二分答案 在二分的时间内可以分为到达根的节点和没有到达根的节点 2.所有能够到达根的 阅读全文
posted @ 2022-01-20 14:41 __iostream 阅读(31) 评论(0) 推荐(0) 编辑
摘要:求长度不小于L,平均数最大的最大子段和 书中的问题: 为什么答案具有单调性? 平均数越大越好 我们二分一个平均数 如果找不到一个字段比这个平均数大 那么更大的平均数肯定也找不到 如果找到了的话 那么就可以尝试更大的平均数 减去平均数 转化为字段的正负 平均数用二分 子段求和转化为前缀和 二元问题 两 阅读全文
posted @ 2022-01-20 14:33 __iostream 阅读(24) 评论(0) 推荐(0) 编辑
摘要:二分两种写法 保留下界 但是忽略左答案 while(l+1<r) { int mid=(l+r)>>1; if( check(mid) ) r=mid;//错误点1 else l=mid; } return r; 保留上界 忽略右答案 while(l+1<r) { int mid=(l+r)>>1; 阅读全文
posted @ 2022-01-20 14:31 __iostream 阅读(22) 评论(0) 推荐(0) 编辑
摘要:给定一个环序列 求 max{a[i]+a[j]+min(ij,n(ij))},i>j 环上距离最大问题 对于这种既要考虑顺时针,也要考虑逆时针的时候,可以考虑复制环接在后面 这样在两个环的交界处就相当于不同方向转移 #include <iostream> #include 阅读全文
posted @ 2022-01-16 22:49 __iostream 阅读(36) 评论(0) 推荐(0) 编辑
摘要:给定一个支持增加和删除的点集,求将点集联通的边集的最小值 引理: 将点按照dfn环排列后 求相邻两点的距离和就是答案的二倍 尝试证明: 我们发现dfn相对大的节点 他们的了lca的的dfn就相对较小 如果一个节点的祖先的链上,经过dfn小的一定会经过dfn大的 对于三个点a,b,c,我们假设$d 阅读全文
posted @ 2022-01-16 20:07 __iostream 阅读(34) 评论(0) 推荐(0) 编辑
摘要:void dfs1(int x) { size[x]=1; for(int i=head[x];i;i=e[i].next) { int y=e[i].to; if(dep[y]) continue; dep[y]=dep[x]+1; fa[y]=x; dfs1(y); size[x]+=size[ 阅读全文
posted @ 2022-01-16 20:03 __iostream 阅读(15) 评论(0) 推荐(0) 编辑
摘要:给定一棵树,在树的直径上求一个路径,让树上的点到路径的距离的最大值最小 ans=mini,j{ max{ maxikj(dk),dis1,i,disj,t}} 根据直径的最长性 可以放缩且不影响结果 \[ ans=min_{i, 阅读全文
posted @ 2022-01-16 14:45 __iostream 阅读(26) 评论(0) 推荐(0) 编辑
摘要:考虑为什么队头就是最优决策: 因为我们要找的是sum的最小值,单调队列内存储了所有可能的决策集合,而对头又是最小的 所以取对头转移就可以 #include <iostream> #include <cstdio> #include <cstring> #include <queue> using n 阅读全文
posted @ 2022-01-15 22:19 __iostream 阅读(20) 评论(0) 推荐(0) 编辑
摘要:求窗口内最大值 #include <iostream> #include <cstdio> #include <queue> using namespace std; const int N=1e6+10; const int INF=0x3f3f3f3f; int read() { int x=0 阅读全文
posted @ 2022-01-15 22:08 __iostream 阅读(29) 评论(0) 推荐(0) 编辑
摘要:给定一颗树,把它扩充成完全图.求需要的最小边权和 struct Edge { int x,y,z; }e[N]; int T,n; int fa[N],sz[N]; int get(int x) { if(x==fa[x]) return x; return fa[x]=get(fa[x]); } 阅读全文
posted @ 2022-01-15 17:40 __iostream 阅读(19) 评论(0) 推荐(0) 编辑
摘要:最短路径树计数 树的计数问题 我们考虑类似prim的方式 维护树的一部分 这样就可以用乘法原理了 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> #include 阅读全文
posted @ 2022-01-15 17:39 __iostream 阅读(27) 评论(0) 推荐(0) 编辑
摘要:求下式的最大值: inai×xiinbi×xi 也就是 对任意的x inai×xiinbi×xians 阅读全文
posted @ 2022-01-13 21:39 __iostream 阅读(58) 评论(0) 推荐(0) 编辑
摘要:关系符号 \leq \geq \approx 运算符号 \prod 希腊字母 φ \varphi ψ \psi 方程组 \begin{cases} a \ a \ 阅读全文
posted @ 2022-01-09 22:37 __iostream 阅读(38) 评论(0) 推荐(0) 编辑
摘要:给定一棵树 边权为1 需要从一号节点出发走每一条边再回到一号节点 现在允许添加一条或者两条边 添加的边只能走一次 求最短路径 首先考虑k=1的情况 显然连接直径两端即可 在考虑k=2的情况 我们发现 ans=2(n1)d1+1d2+1+(d1,d2) 合并 \[ ans 阅读全文
posted @ 2022-01-09 22:15 __iostream 阅读(34) 评论(0) 推荐(0) 编辑
摘要:给定一张无向图 求S->T经过K条边的最短路是多少 对于形如 A(i,j)=opt(A(i,k) opt B(k,j)的形式 可以考虑用矩阵乘法来解决 #include <iostream> #include <cstdio> #include <cstring> #include <alg 阅读全文
posted @ 2022-01-09 18:13 __iostream 阅读(23) 评论(0) 推荐(0) 编辑
摘要:斐波那契数列 #include <iostream> #include <cstdio> #include <cstring> #define ll long long using namespace std; const int mod=10000; int read() { int x=0,f= 阅读全文
posted @ 2022-01-09 16:13 __iostream 阅读(25) 评论(0) 推荐(0) 编辑
摘要:求无向图的最小环 显然考虑枚举环上的点 多源最短路 为了避免三点共线的情况 因此要绕开中间的点,这正好符合floyd算法的思想 不经过k 不包括端点 最外层循环每扩大1 相当于允许多经过一个点 为什么只能枚举相邻的点呢? 因为我们必须保证最大的点在中间位置 假如说三点共线的话 最大点在边上 这个距离 阅读全文
posted @ 2022-01-08 22:10 __iostream 阅读(35) 评论(0) 推荐(0) 编辑
摘要:给定n个不等式 判断是否有逻辑错误 floyd传递闭包问题 #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int N=1010; int rea 阅读全文
posted @ 2022-01-08 19:55 __iostream 阅读(25) 评论(0) 推荐(0) 编辑
摘要:给定一个图 求单源最短路 这个图双向边一定是非负的 而且单向边一定不在环中 题目数据特殊构造 spfa过不了 看到图的性质 很容易想到用拓扑排序来求 但是图中只有双向边 而双向边是非负的 可以用dij来求 因此可以考虑双向边缩点之后拓扑排序 策略: 混合图缩点 在dij的时候可以顺便处理拓扑关系 / 阅读全文
posted @ 2022-01-08 15:22 __iostream 阅读(26) 评论(0) 推荐(0) 编辑
摘要:求1-n上所有路径的点权最大值和最小值的差 方法一: spfa 很容易想到 从1开始跑一边和反图上n开始跑一边求交集就是正确的路径 但是这里还有一点是不能够返回 也就是对最大值和最小值出现有先后要求 这个时候把普通的bfs换成spfa就能够突出 "到"这一点 这里为什么不能用dij? 当前最小值还可 阅读全文
posted @ 2022-01-01 19:40 __iostream 阅读(30) 评论(0) 推荐(0) 编辑
摘要:1~n的路径,第K+1大的边权尽可能小 显然二分答案,那么问题的关键变成了在最短路上能否有不超过k个大于val的边 换句话说超过val的值上是否超过k个 对于这种统计个数的问题,可以考虑用01最短路来解决 int dij() { q.pb(1); d[1]=0; while(!q.empty()) 阅读全文
posted @ 2022-01-01 18:48 __iostream 阅读(41) 评论(0) 推荐(0) 编辑
摘要:第一种: dij算法 基于贪心思想 dij算法的逻辑是:最短的距离不可能再被其他点更新 因此可以拿这个点来更新其他点 vis[x]表示这个点是否被拓展过 每个点只会被拓展一次 第二种: spfa算法 基于bfs思想 逻辑是:如果所有的点都满足d[y]<=d[x]+z 那么最短路就成立了 所以不断 阅读全文
posted @ 2022-01-01 18:47 __iostream 阅读(73) 评论(0) 推荐(0) 编辑
摘要:给定一颗树 每个几点上有个权值val[i], 求val[i]×cnt的最小值 cnt是染色次数 关键在于两个性质: 全树种权值最大的点 一定在父节点被染色之后被染色 我们比较一下染色最大点x和其他k个点 如果染色k个点 造成负面影响:kx 如果染色x 造成的负面影响 阅读全文
posted @ 2022-01-01 15:22 __iostream 阅读(39) 评论(0) 推荐(0) 编辑

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