题目大意:

http://www.lydsy.com/JudgeOnline/problem.php?id=3232

题解:

首先我们看到这道题让我们最优化一个分式.

所以我们应该自然而然地想到01分数规划

首先我们考虑如何恰当地计算所有在封闭多边形内部的权值

我们可以首先假定DZY一定沿着逆时针走,然后我们发现:

我们可以对所有向右,向上的边的\(a\)值都设为在这条边的左侧的同行的价值和.

\(b\)值即为经过这条边的花费

剩下的两条边对应着这两条边将价值取反即可.

我们发现把路线上所有边的\(a\)加起来除二即为围住的元素的val和

所以我们就可以直接01分数规划了.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 110;
const double eps = 1e-5;
struct Edge{
int to,next;
double dis,a,b;
}G[maxn*maxn<<3];
int head[maxn*maxn<<2],cnt;
void add(int u,int v,double a,double b){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].a = a;
G[cnt].b = b;
}
bool inq[maxn*maxn<<2];double dis[maxn*maxn<<2];
#define v G[i].to
bool dfs(int u){
inq[u] = true;
for(int i = head[u];i;i=G[i].next){
if(dis[v] > dis[u] + G[i].dis){
dis[v] = dis[u] + G[i].dis;
if(inq[v]) return true;
if(dfs(v)) return true;
}
}inq[u] = false;
return false;
}
#undef v
int nodecnt;
int id[maxn][maxn];
inline bool check(double mid){
memset(inq,0,sizeof inq);memset(dis,0,sizeof dis);
for(int i=1;i<=cnt;++i) G[i].dis = -(G[i].a - mid*G[i].b);
for(int i=1;i<=nodecnt;++i) if(dfs(i)) return true;
return false;
}
int sl[maxn][maxn],sr[maxn][maxn];
int main(){
int n,m;read(n);read(m);
for(int i=1,x;i<=n;++i){
for(int j=1;j<=m;++j){
read(x);
sl[i][j] = sl[i][j-1] + x;
sr[i][j] = sr[i-1][j] + x;
}
}
for(int i=0;i<=n;++i){
for(int j=0;j<=m;++j){
id[i][j] = ++nodecnt;
}
}
for(int i=0,x;i<=n;++i){
for(int j=1;j<=m;++j){
read(x);
add(id[i][j-1],id[i][j],sr[i][j],x);
add(id[i][j],id[i][j-1],-sr[i][j],x);
}
}
for(int i=1,x;i<=n;++i){
for(int j=0;j<=m;++j){
read(x);
add(id[i-1][j],id[i][j],-sl[i][j],x);
add(id[i][j],id[i-1][j],sl[i][j],x);
}
}
double l = .0,r = 1e9;
while(r-l > eps){
double mid = (l+r)/2.0;
if(check(mid)) l = mid;
else r = mid;
}printf("%.3lf\n",(l/2.0));
getchar();getchar();
return 0;
}

bzoj 3232: 圈地游戏 01分数规划的更多相关文章

  1. bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...

  2. bzoj 3232: 圈地游戏【分数规划+最小割】

    数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...

  3. bzoj 3232: 圈地游戏

    bzoj 3232: 圈地游戏 01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\) \( ...

  4. 【BZOJ3232】圈地游戏(分数规划,网络流)

    [BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...

  5. BZOJ 3232: 圈地游戏 分数规划+判负环

    3232: 圈地游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 966  Solved: 466[Submit][Status][Discuss] ...

  6. bzoj 3232 圈地游戏——0/1分数规划(或网络流)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...

  7. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)

    BZOJ 洛谷 裸01分数规划.二分之后就是裸最大费用最大流了. 写的朴素SPFA费用流,洛谷跑的非常快啊,为什么有人还T成那样.. 当然用二分也很慢,用什么什么迭代会很快. [Update] 19. ...

  8. BZOJ.4753.[JSOI2016]最佳团体(01分数规划 树形背包DP)

    题目链接 \(Description\) 每个点有费用si与价值pi,要求选一些带根的连通块,总大小为k,使得 \(\frac{∑pi}{∑si}\) 最大 \(Solution\) 01分数规划,然 ...

  9. BZOJ 4753 [Jsoi2016]最佳团体 ——01分数规划 树形DP

    要求比值最大,当然用分数规划. 二分答案,转化为选取一个最大的联通块使得它们的和大于0 然后我们直接DP. 复杂度$O(n^2\log {n})$ #include <map> #incl ...

随机推荐

  1. I2C驱动详解

    I2C讲解: 在JZ2440开发板上,I2C是由两条数据线构成的SCL,SDA:SCL作为时钟总线,SDA作为数据总线:两条线上可挂载I2C设备,如:AT24C08 两条线连接ARM9 I2C控制器, ...

  2. 【BZOJ5016】[Snoi2017]一个简单的询问 莫队

    [BZOJ5016][Snoi2017]一个简单的询问 Description 给你一个长度为N的序列ai,1≤i≤N和q组询问,每组询问读入l1,r1,l2,r2,需输出 get(l,r,x)表示计 ...

  3. Ajax之基础总结

    一.Ajax 简介 Ajax 由 HTML.JavaScript技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.在详细探讨 Ajax 是 ...

  4. POJ 2965 The Pilots Brothers' refrigerator【枚举+dfs】

    题目:http://poj.org/problem?id=2965 来源:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=26732#pro ...

  5. 【python】-- 列表

    Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推 列表 1.定义列表,取出列表中的值 names = [] #定义空列表 ...

  6. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  7. 【学员管理系统】0x02 学生信息管理功能

    [学员管理系统]0x02 学生信息管理功能 写在前面 项目详细需求参见:Django项目之[学员管理系统] Django框架大致处理流程 捋一下Django框架相关的内容: 浏览器输入URL到页面展示 ...

  8. Android UI Design

    Ref:直接拿来用!10款实用Android UI工具 Ref:Android UI设计资源 Ref:Android酷炫实用的开源框架(UI框架) Ref:Android UI 组件 Ref:Andr ...

  9. python利用wxpy监控微信公众号

    此次利用wxpy可以进行微信公众号的消息推送监测(代码超级简单),这样能进行实时获取链接.但是不光会抓到公众号的消息,好友的消息也会抓到(以后会完善的,毕竟现在能用了,而且做项目的微信号肯定是没有好友 ...

  10. Data Structure Array: Given an array arr[], find the maximum j – i such that arr[j] > arr[i]

    http://www.geeksforgeeks.org/given-an-array-arr-find-the-maximum-j-i-such-that-arrj-arri/ #include & ...