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喜欢在地里散步.他总是从任意 ...
随机推荐
- How To Change Log Rate Limiting In Linux
By default in Linux there are a few different mechanisms in place that may rate limit logging. These ...
- 手把手教你制作AppPreview视频并上传到appStore进行审核
手把手教你制作AppPreview视频并上传到appStore进行审核 注意,你需要使用iMovie才能够制作AppPreview视频文件,用QuickTime录制的无效! 最终效果 1. 新建一个事 ...
- Jenkins定时构建和轮询SCM设置说明
看图说事: 一.定时构建:不管SVN或Git中数据有无变化,均执行定时化的构建任务 : 二.轮询SCM:只要SVN或Git中数据有更新,则执行构建任务: 三.构建语法说明: 1.首先格式为:* * * ...
- Linux内核态和用户态
两张图说明Linux内核态和用户态之间的关系
- nodepad++添加新主题
https://www.cnblogs.com/d0main/p/6915460.html
- 铁乐学Python_Day35_Socket模块3和hmac模块
验证客户端链接的合法性 如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂, 那么可以利用hmac+加盐的方式来实现. 例1:简单的服务端如下 #!/usr/bin/env ...
- (1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用
1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...
- 理解活在Iphone中的那些App (二)
app是什么,为什么而存在 存在即合理的说法,已经被批臭批烂了.所以,作为一个程序员不能简简单单的因为上面来了一个需求,就完成一个需求.让做一个app就做一个app,只是简单的认为存在即合理,头让写就 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- HNOI2018退役记
不想记流水账了,总结一下考炸的原因吧.. $day1$: $12$点才知道$t3$怎么做. 可以用容斥+动态$dp$来搞,但是没时间写了. 事实上这个方法也比较复杂,标算比这优美多了. 所以还是想得太 ...