bzoj3232
Description
Input
Output
Sample Input
1 3 3 3
1 3 1 1
3 3 1 0
100 1 1 1
97 96 1 1
1 93 92 92
1 1 90 90
98 1 99 99 1
95 1 1 1 94
1 91 1 1 89
Sample Output
HINT

题解:
0/1分数规划,二分mid
转化为是否存在一组解
使得∑vi-mid*∑ci<=0
即,每个格线有一个边权,每个格有权,是否能找到一个封闭的图形,使得内部和-边权和>0
发现和一般的不同的是,每个元素不是可以直接访问然后取值的。
因为还有格线和封闭起来的块的问题。
假设先不管块的值。
我们发现题目是一个从某个点出发,再回到某个点,然后判断是否有一条>0的路径。
即,图中有没有正环。
那么,块的值怎么办?
可以前缀差分!!
sum[i][j]表示,∑val[1~i][j]
对于一个横边:(i,j)->(i,j+1),边权是:mid*c+sum[i][j]
(i,j)->(i,j-1),边权是:mid*c-sum[i][j]
竖边就是mid*c
那么对于一个闭合封闭图形,必然可以把块的贡献看作是一列一列的。
并且,如果这是一个正环,那么存在从左下角出发往右走再绕回来,然后边权之和恰好有∑sum[i][j]-sum[i-p][j]
就差分出来格内部的权值和了。
注意,最短路的时候,为了卡精度,但是赋值时不能dis[dx][dy]=dis[x][y]+w-eps或者+eps
eps只在比较的时候用,赋值就不能用了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const double eps=0.000001;
int n,m;
int val[N][N];
int sum[N][N];
int mv[][]={{+,},{-,},{,+},{,-}};
int co[N][N][];
double dis[N][N];
bool vis[N][N];
int in[N][N];//ci in queue
struct node{
int has,x,y;
};
queue<node>q;
double mid;
bool spfa(){
while(!q.empty()) q.pop();
node st;
st.has=,st.x=,st.y=;
dis[][]=0.00;
q.push(st);
while(!q.empty()){
node now=q.front();q.pop();
vis[now.x][now.y]=;
if(now.has>(n+)*(m+)+) return true;
for(int i=;i<;i++){
int dx=now.x+mv[i][],dy=now.y+mv[i][];
if(dx<||dx>n) continue;
if(dy<||dy>m) continue;
double w=-1.0*mid*co[now.x][now.y][i];
if(i==) w+=sum[now.x][now.y+];
if(i==) w-=sum[now.x][now.y];
if(dis[dx][dy]+0.0001<dis[now.x][now.y]+w){
dis[dx][dy]=dis[now.x][now.y]+w;
in[dx][dy]++;
if(in[dx][dy]>(n+)*(m+)+) return true;
if(!vis[dx][dy]){
vis[dx][dy]=;
node tmp;
tmp.has=now.has+;
tmp.x=dx,tmp.y=dy;
q.push(tmp);
}
}
}
}
return false;
}
bool che(){
memset(dis,0xcf,sizeof dis);
memset(in,,sizeof in);
memset(vis,,sizeof vis);
if(spfa()) return true;
}
int main(){
scanf("%d%d",&n,&m);
int mx=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&val[i][j]);
mx+=val[i][j];
sum[i][j]=sum[i-][j]+val[i][j];
}
}int t;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&t);
co[i][j-][]=co[i][j][]=t;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf("%d",&t);
co[i-][j][]=co[i][j][]=t;
}
}
double l=0.00,r=1.0*mx;
double ans;
while(r-l>eps){
mid=(l+r)/2.0;
if(che()) l=mid,ans=mid;
else r=mid;
}
printf("%.3lf",ans);
return ;
}
bzoj3232的更多相关文章
- 【BZOJ3232】圈地游戏(分数规划,网络流)
[BZOJ3232]圈地游戏(分数规划,网络流) 题面 BZOJ 题解 很神仙的一道题. 首先看到最大化的比值很容易想到分数规划.现在考虑分数规划之后怎么计算贡献. 首先每条边的贡献就变成了\(mid ...
- 【BZOJ3232】圈地游戏 分数规划+最小割
[BZOJ3232]圈地游戏 Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意 ...
- BZOJ3232: 圈地游戏
题解: 神题一道... 题解戳这里:http://hi.baidu.com/strongoier/item/0425f0e5814e010265db0095 分数规划可以看这里:http://blog ...
- bzoj3232圈地游戏——0/1分数规划+差分建模+判环
Description DZY家的后院有一块地,由N行M列的方格组成,格子内种的菜有一定的价值,并且每一条单位长度的格线有一定的费用. DZY喜欢在地里散步.他总是从任意一个格点出发,沿着格线行走直到 ...
- $BZOJ3232$ 圈地游戏 网络流
正解:最小割+01分数规划 解题报告: 传送门$QwQ$ 感$jio$这个好像是$NOIp2018$集训的时候$cjk$学长讲01分数规划的时候港的,,,?$QwQ$虽然我还是不会嘤 首先看到这个分数 ...
- liaoliao的四连做第二弹
liaoliao四连做第一弹 1.bzoj3211: 花神游历各国 由于$10^9$以内的数最多只会被开方$10$次,所以我们可以用线段树维护然后剪枝.. #include <cstdio> ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
随机推荐
- Selenium自动化测试第一天(上)
如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...
- Linux命令应用大词典-第18章 磁盘分区
18.1 fdisk:分区表管理 18.2 parted:分区维护程序 18.3 cfdisk:基于磁盘进行分区操作 18.4 partx:告诉内核关于磁盘上分区的号码 18.5 sfdisk:用于L ...
- aishell数据处理为thchs30格式
目录 aishell数据转换格式 aishell数据转化方法 aishell数据格式对于用神经网络处理数据的同学来说比较不友善,因为他只有文字转录和音素级别的转录,并没有拼音的转录. 而thchs30 ...
- NIO 服务端TCP连接管理的方案
最近做的一个项目需要在服务端对连接端进行管理,故将方案记录于此. 方案实现的结果与背景 因为服务端与客户端实现的是长连接,所以需要对客户端的连接情况进行监控,防止无效连接占用资源. 完成类似于心跳的接 ...
- lol人物模型提取(二)
两个dds文件怎么导入到一个模型上呢?这模型又不能拆开. 一开始我想的是用两个材质球来完成,一个材质球对应一个dds文件,然而行不通. 一个材质球对应两个dds文件还不太会弄,于是我想着干 ...
- Swagger字段说明
常用字段说明 字段 说明 schemes 使用协议(如:http.https) host 项目地址,这个地址会作为每个接口的url base,拼接起来一起作为防伪地址 consumes 接口默认接收的 ...
- c++源文件到可执行文件的过程
1.预处理(preprocessor):对#pragma.#include.#define.#ifdef/#endif.#ifndef/#endif,inline内联函数等进行处理 2.编译(comp ...
- Redis 学习之主从复制
该文使用centos6.5 64位 redis3.2.8 主从复制 Redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进 ...
- [Leetcode] 2.Add Two Numbers(List To Long,模拟)
本题题意是指将两个数倒序存储在链表中,再将两数之和同样存储在链表中输出. 我最开始的思路是将每一位相加,再考虑是否进位,但这时就需要考虑一些情况,比较麻烦. 于是我决定采取另一种在网上新学到的方法:这 ...
- Winform程序部署方式总结一——ClickOnce发布
针对Winform程序,介绍两种常用打包方式:ClickOnce和Windows Installer 应用程序如下: 一.ClickOnce发布 1.找到需要发布的项目文件,右击,从弹出的快捷菜单中找 ...