bzoj 3232: 圈地游戏
bzoj 3232: 圈地游戏
01分数规划,就是你要最大化\(\frac{\sum A}{\sum B}\),就二分这个值,\(\frac{\sum A}{\sum B} \geq mid\)
\(\sum A-mid\sum B \geq 0\)
然后把所有的B中的权值乘一个mid再跑一个什么算法就星了
这就是道裸题(雾)
二分一个\(mid\),就是一个网络流问题了
选一个点的集合,如果两个方格相邻,一个选了一个没选,总和就要减去中间这条边的权值
然后用最小鸽,如果选就没有损失,不选有格子上价值的损失;两个相邻点一个选了一个不选有中间那条边边权*mid的损失,裸的最小鸽
还有边界上的边怎么办,就边界外面新建一圈点,强制那些点不选。就做完了。
#include<bits/stdc++.h>
#define il inline
#define vd void
typedef long long ll;
il int gi(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const double inf=1e9;
int n,m,val[51][51],wh[51][51],ww[51][51];
int dep[3000],fir[3000],head[3000],dis[1000010],nxt[1000010],id;
double w[1000010];
il vd link(int a,int b,double c,double d=0){
nxt[++id]=head[a],head[a]=id,dis[id]=b,w[id]=c;
nxt[++id]=head[b],head[b]=id,dis[id]=a,w[id]=d;
}
int num[52][52],NUM_ID,S,T;
il bool BFS(){
static int que[3000],hd,tl;
hd=tl=0;
que[tl++]=S;for(int i=1;i<=NUM_ID;++i)dep[i]=0;dep[S]=1;
while(hd^tl){
int x=que[hd];
for(int i=head[x];i;i=nxt[i])
if(w[i]>1e-7&&!dep[dis[i]])dep[dis[i]]=dep[x]+1,que[tl++]=dis[i];
++hd;
}
return dep[T];
}
il double Dinic(int x,double maxflow){
if(x==T)return maxflow;
double ret=0;
for(int&i=fir[x];i;i=nxt[i])
if(w[i]>1e-7&&dep[dis[i]]==dep[x]+1){
double d=Dinic(dis[i],std::min(maxflow,w[i]));
w[i]-=d,w[i^1]+=d;ret+=d,maxflow-=d;
if(maxflow<1e-7)return ret;
}
return ret;
}
il double check(double mid){
memset(head,0,sizeof head);id=1;
for(int i=1;i<=m;++i)link(S,num[0][i],inf),link(S,num[n+1][i],inf);
for(int i=1;i<=n;++i)link(S,num[i][0],inf),link(S,num[i][m+1],inf);
double ret=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
link(num[i][j],T,val[i][j]),ret+=val[i][j];
for(int i=1;i<=n+1;++i)
for(int j=1;j<=m;++j)
link(num[i-1][j],num[i][j],mid*wh[i][j],mid*wh[i][j]);
for(int i=1;i<=n;++i)
for(int j=1;j<=m+1;++j)
link(num[i][j-1],num[i][j],mid*ww[i][j],mid*ww[i][j]);
while(BFS())memcpy(fir,head,sizeof fir),ret-=Dinic(S,inf);
return ret;
}
int main(){
n=gi(),m=gi();
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)val[i][j]=gi();
for(int i=1;i<=n+1;++i)for(int j=1;j<=m;++j)wh[i][j]=gi();
for(int i=1;i<=n;++i)for(int j=1;j<=m+1;++j)ww[i][j]=gi();
for(int i=0;i<=n+1;++i)
for(int j=0;j<=m+1;++j)
num[i][j]=++NUM_ID;
S=++NUM_ID,T=++NUM_ID;
double l=0,r=5000,mid;
while(r-l>1e-6){
mid=(l+r)/2;
if(check(mid)>1e-7)l=mid;
else r=mid;
}
printf("%.3lf\n",l);
return 0;
}
bzoj 3232: 圈地游戏的更多相关文章
- BZOJ 3232: 圈地游戏 分数规划+判负环
3232: 圈地游戏 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 966 Solved: 466[Submit][Status][Discuss] ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- bzoj 3232 圈地游戏——0/1分数规划(或网络流)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 当然是0/1分数规划.但加的东西和减的东西不在一起,怎么办? 考虑把它们合在一起.因为 ...
- bzoj 3232 圈地游戏 —— 01分数规划+最小割建图(最大权闭合子图)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心烦意乱的时候调这道题真是...越调越气,就这样过了一晚上... 今天再认真看看,找出 ...
- bzoj 3232: 圈地游戏【分数规划+最小割】
数组开小导致TTTTTLE-- 是分数规划,设sm为所有格子价值和,二分出mid之后,用最小割来判断,也就是判断sm-dinic()>=0 这个最小割比较像最大权闭合子图,建图是s像所有点连流量 ...
- BZOJ3232: 圈地游戏
题解: 神题一道... 题解戳这里:http://hi.baidu.com/strongoier/item/0425f0e5814e010265db0095 分数规划可以看这里:http://blog ...
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- bzoj 3991: [SDOI2015]寻宝游戏 虚树 set
目录 题目链接 题解 代码 题目链接 bzoj 3991: [SDOI2015]寻宝游戏 题解 发现每次答案就是把虚树上的路径*2 接在同一关键点上的点的dfs序是相邻的 那么用set动态维护dfs序 ...
- 【BZOJ3232】圈地游戏 分数规划+最小割
[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...
随机推荐
- iOS设计模式 - 迭代器
iOS设计模式 - 迭代器 原理图 说明 提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 源码 https://github.com/YouXianMing/iOS-Des ...
- UITableView中cell点击的绚丽动画效果
UITableView中cell点击的绚丽动画效果 本人视频教程系类 iOS中CALayer的使用 效果图: 源码: YouXianMingCell.h 与 YouXianMingCell.m / ...
- Linux 系统级别优化_【all】
Linux 系统优化 1.Linux系统关闭SELinux 2.Linux系统开机到登录之前启动流程 3.Linux系统设置运行级别 4.Linux系统重要的开机自启动的服务 5.Linux查看系统当 ...
- 【原创】使用Java进行Clob转String字符串
背景 oracle字段类型varchar2最大长度4000,超过的怎么办 解决 使用clob类型,大字段,无长度限制 问题 使用Java的JDBC读取的RS获取的clob类型无法正常使用,封装的rs. ...
- CSS一个属性,让图片后的文字垂直居中,效果看得见
困扰我多年的疑难,终于解决了.哈哈哈,太爽了 背景 页面经常遇到,图片后面的文字显示在图片的中间部位,也就是说文字图片垂直居中. <div class="banner"> ...
- (z转)基于CPU的Bank BRDF经验模型,实现各向异性光照效果!
摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文 名“GPU编程与CG语言之阳春白雪下里巴人” BRDF 光照模型 10.2.1 什么 ...
- [转] pom.xml 配置详解
From:http://blog.csdn.net/ithomer/article/details/9332071 Maven是一个项目管理工具,通过pom.xml来实现. pom.xml 配置文件 ...
- redis key/value 出现\xAC\xED\x00\x05t\x00\x05
1.问题现象: 最近使用spring-data-redis 和jedis 操作redis时发现存储在redis中的key不是程序中设置的string值,前面还多出了许多类似\xac\xed\x00\x ...
- BZOJ4756:[USACO]Promotion Counting(线段树合并)
Description n只奶牛构成了一个树形的公司,每个奶牛有一个能力值pi,1号奶牛为树根. 问对于每个奶牛来说,它的子树中有几个能力值比它大的. Input n,表示有几只奶牛 n<=10 ...
- centos7 tengine 安装
Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检 ...