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设计模式 - 享元 原理图 说明 享元模式使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于只是因重复而导致使用无法令人接受的大量内存的大量物件.通常物件中的部分 ...
- [翻译] RDVTabBarController
RDVTabBarController https://github.com/robbdimitrov/RDVTabBarController 效果: Supports iPad and iPhone ...
- The expression of type Integer is unboxed into int
问题:The expression of type Integer is unboxed into int 原因:java的包装类,方法里面要的是Integer,传入的参数确实int类型 解决方案: ...
- 五十个小技巧提高PHP执行效率
在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centos+nginx环境,虽然这个有很多的原因如:服务器本身配置,运行环境nginx服务,php-fpm配置等等,更多有一点 ...
- java 和 javascript CryptoJS 进行HmacSHA1加密
import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Invali ...
- for 与forEach的区别
for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素.在处理比较复杂的处理的时候较为方便. foreach循环 foreach,从头到尾,对于集合中的对象遍历 ...
- selenium安装浏览器驱动
3.0以上版本恩的selenium需要安装驱动 pip show selenium 安装驱动 1.下载驱动地址: 火狐:https://github.com/mozilla/geckodriver/r ...
- Curator 基本API
package bjsxt.curator.base; import java.util.List; import java.util.concurrent.ExecutorService; impo ...
- 2049. [SDOI2008]Cave 洞穴勘测【LCT】
Description 辉辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好 ...
- Loj #2256. 「SNOI2017」英雄联盟
题目 我就是个丝薄 如果要用\(dp_i\)表示凑出\(i\)的最小花费显然不可能的 之后大力猜想能凑出来的状态不会很多,我的暴力也告诉我不是很多,好像也确实不多的样子,大概\(4e4\)左右 但是我 ...