[洛谷P1642]规划】的更多相关文章

题目大意:有一棵$n(n\leqslant100)$个点的树,每个点有两个权值$a,b$,要求选择一个$m$个点的连通块$S$,最大化$\dfrac{\sum\limits_{i\in S}a_i}{\sum\limits_{i\in S}b_i}$ 题解:$01$分数规划,这一类的问题可以二分答案来做,二分这个值,然后把第$i$个点的权值变为$a_i-b_imid$,跑一遍树形$DP$,$f_{i,j}$表示以第$i$个点为根,连通块大小为$j$的最大值.看答案是否大于$0$,是则把答案变大,…
分数规划是这样一个东西: 给定若干元素,每个元素有两个属性值\(a_i,b_i\),在满足题目要求的某些限制下选择若干元素并求出\(\frac{\sum a}{\sum b}\)的最大值. 如果没有限制的话,肯定是贪心的选. 假设当前选择了一个解\(x_0\),却并不是\(\frac{\sum a}{\sum b}\)的最大值,我们有 \[\frac{\sum a}{\sum b}>x_0\] 进而 \[\sum a-bx_0>0\] 这时候我们要求的东西变成了\(a-bx_0\),每个元素的…
[POJ3621][洛谷2868]Sightseeing Cows(分数规划) 题面 Vjudge 洛谷 大意: 在有向图图中选出一个环,使得这个环的点权\(/\)边权最大 题解 分数规划 二分答案之后把每条边的边权换为\(mid·\)边权-出点的点权 然后检查有没有负环就行啦 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&g…
题面 Bzoj 洛谷 题解(0/1分数规划+spfa) 考虑\(0/1\)分数规划,设当前枚举到的答案为\(ans\) 则我们要使(其中\(\forall b_i=1\)) \[ \frac{\sum_{i=1}^ta[e_i]}{\sum_{i=1}^tb[v_i]}< ans \\ \therefore\sum a[e_i]-ans*b[v_i]=\sum a[e_i]-ans<0 \] 则问题就变成了判断图内是否存在一个负环... 时间复杂度:\(O(nmlog)\) #include…
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复杂度要优化成\(O(n^2)\)的,可以参考之前写的这篇博客 #include <cstdio> #include <algorithm> using std::min; using std::max; const int N = 3e3 + 10, inf = 1e9 + 7; co…
洛谷 题意: 题意好绕好绕...不想写了. 思路: 首先类似于分数规划做法,二分答案得到到每个点的最小危险度. 然后就是在一个二分图中,两边撤掉最少的点(相应代价为上面算出的危险度)及相应边,使得中间没有边. 这就是一个最小割,最终的图中不存在\(s\)到\(t\)的路径即可. 代码如下: /* * Author: heyuhhh * Created Time: 2019/10/31 14:47:58 */ #include <bits/stdc++.h> #define MP make_pa…
洛谷题目传送门 太弱了不会树剖,觉得LCT好写一些,就上LCT乱搞,当LCT维护双连通分量的练手题好了 正序删边是不好来维护连通性的,于是就像水管局长那样离线处理,逆序完成操作 显然,每个点可以代表一个双连通分量,查询就是链的长度-1 连接一条边,如果在LCT中还没连通就link,如果连通了,显然这里会出现一个环,然后暴力缩点,可以把当前辅助树的根节点当做集合的标志节点,然后dfs整个辅助树,把链上的其它点的并查集祖先暴力改成这个标志节点,最后再断开标志节点与子树的连接.总的暴力修改次数不会超过…
洛谷4951 地震 #include<iostream> #include<cstdio> #include<algorithm> #define go(i,a,b) for(register int i=a;i<=b;i++) #define ll long long #define db long double #define M 10001 #define N 401 #define inf 1e15 #define eps 1e-12 using name…
题面 洛谷 bzoj 题解 离线处理+LCT 有点像星球大战 我们可以倒着做,断边变成连边 我们可以把边变成一个点 连边时,如果两个点本身不联通,就\(val\)赋为\(1\),并连接这条边 如果,两个点本身就联通,那么就不连接这条边,把两点之间的\(val\)全部赋为\(0\) \(ans\)就是求两点之间的\(sum(val)\) Code #include<bits/stdc++.h> #define LL long long #define RG register using name…
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示(我就不贴图) 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格.图上其它白色网格均攻击不到.从图上可见炮兵的攻击范围不受…