【学术篇】SDOI2009 最优图像
又是一道辣鸡卡常数题….
luogu上有些题的时限还是有毒的… 最后也只能靠O2过掉了…
不过给我原题当时的2s我随便过给你看嘛, 哪怕评测姬慢50%都没关系的.. 贴一下codevs的截图…
你看最慢的点也就1.07s…… (毕竟程序自带大常数←_←
好了不吐槽了, 我们来分析一下这道题吧…
其实我当时做的时候(好像还是做学校食堂的那次测试?)并不知道这是一道网络流…
然后就写暴力滚粗…
但据说这是一种非常常见的建图方式.. 我们还是分析题目条件.
我们在网络流里面做到的题目都是求和的, 那么我们就要想办法把Π转换为∑.
转换完之后就可以跑最大费用最大流了.那么怎么转换呢?? 用对数!!!
我们高一的时候学过,log(xy)=log x+log y(底大于0且不等于1), 这样我们就可以建边了.
- 每一行, 每一列作为一个点, 分别放在两边.
- 行和列之间连一条流量为1, 费用为交点的概率的对数的边, 表示这个点最多选一次, 选的话取这个概率.
- 源点向每个行对应的点连流量为这一行的黑像素数, 费用为0的边, 表示这一行要选这么多个.
- 每个列对应的点向汇点连流量为这一列的黑像素数, 费用为0的边, 表示这一列要选这么多个.
样例建图大约就是这个样子(好像还并不是很清楚怎么建嘛) (对数的底我就随便取个e算了)
然后费用取反跑费用流就行了. 据说这个题只能用zkw过, 但我的zkw也没过…
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=205;
const int M=23333;
const int INF=0x7f7f7f7f;
inline int gn(int a=0,char c=0){
for(;c<'0'||c>'9';c=getchar());
for(;c>47&&c<58;c=getchar())a=a*10+c-48;return a;
}
int v[N],nxt[M],to[M],fl[M],co[M],tot=1;
void buildedge(int x,int y,int flow,int cost){
to[++tot]=y; nxt[tot]=v[x]; v[x]=tot; fl[tot]=flow; co[tot]=cost;
to[++tot]=x; nxt[tot]=v[y]; v[y]=tot; fl[tot]=0; co[tot]=-cost;
}
int d[N],n,m,s,t,cost,p[N][N],a[N],b[N];
int q[M],H,T,i,j,k;
bool vis[N];
inline bool spfa(int s,int t){
memset(vis,0,sizeof(vis));
memset(d,0x7f,sizeof(d));
d[t]=0; H=0; T=1; vis[t]=1; q[T]=t;
while(H<T){
int x=q[++H]; vis[x]=0;
for(int i=v[x];i;i=nxt[i])
if(fl[i^1]&&d[to[i]]>d[x]-co[i]){
d[to[i]]=d[x]-co[i];
if(!vis[to[i]]) vis[to[i]]=1,q[++T]=to[i];
}
}
return d[s]<INF;
}
int dfs(int x,int mx,int s=0){ vis[x]=1;
if(x==t) return mx; int k;
for(int i=v[x];i;i=nxt[i])
if(!vis[to[i]]&&fl[i]&&d[to[i]]==d[x]-co[i]){
k=::dfs(to[i], mx-s>fl[i]?fl[i]:mx-s);
if(k) cost+=k*co[i],fl[i]-=k,fl[i^1]+=k,s+=k;
if(s==mx) break;
}
return s;
}
int mcmf(int flow=0){
while(::spfa(s, t)){ vis[t]=1;
while(vis[t]){
memset(vis,0,sizeof(vis));
flow+=::dfs(s, INF);
}
} return flow;
}
void findans(){
for(int i=1;i<=n;++i)
for(int j=v[i];j;j=nxt[j])
if(to[j]>n)
p[i][to[j]-n]=!fl[j];
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
putchar(48+p[i][j]);
putchar(10);
}
}
int main(){
n=gn(); m=gn(); s=0; t=n+m+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
int k=gn();
if(k) ::buildedge(i, j+n, 1, (int)(-log2(k)*2333333));
}
for(int i=1;i<=n;++i)
::buildedge(s, i, gn(), 0);
for(int i=1;i<=m;++i)
::buildedge(i+n, t, gn(), 0);
mcmf(); findans();
}
最后, 卡常数是非常不对的一件事情…或者说我该去化验血统了?
【学术篇】SDOI2009 最优图像的更多相关文章
- P2410 [SDOI2009]最优图像 ZKW最大费用最大流
$ \color{#0066ff}{ 题目描述 }$ 小E在好友小W的家中发现一幅神奇的图画,对此颇有兴趣.它可以被看做一个包含N×M个像素的黑白图像,为了方便起见,我们用0表示白色像素,1表示黑色像 ...
- 【学术篇】SDOI2009 SuperGCD
特别说明: 为了避免以后搬家时的麻烦, 这里的文章继续沿用csdn的风格和分类好了~ Emmmm这个题是一道高精度的模板题啊~ 既然是高精度的裸题, 那我们这些懒人当然是选择:用python啦~ 懒癌 ...
- 【学术篇】SDOI2009 学校食堂
传送门~ 题目大意 先分析\((x\ or\ y)-(x\ and\ y)\), 就是\(x\)和\(y\)中存在的1减去\(x\)和\(y\)中相同的1 *那不就是\(x\ xor\ y\)么←_← ...
- SQL Server调优系列基础篇 - 性能调优介绍
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- SQL Server 调优系列基础篇 - 性能调优介绍
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- PHP 性能分析第三篇: 性能调优实战
注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或 PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 ...
- 第三篇、调优之路 Apache调优
1. 简介 在第一篇中整合了apache + tomcat ,利用了apache解析静态文件为tomcat解压.但是在测试机上发现两者性能不足,不能充分利用服务器的性能,该篇中将对apache进行性 ...
- 【学术篇】CF833B TheBakery 分治dp+主席树
题目の传送门~ 题目大意: 将\(n\)个蛋糕分成恰好\(k\)份, 求每份中包含的蛋糕的种类数之和的最大值. 这题有两种做法. 第一种是线段树优化dp, 我还没有考虑. 另一种就是分治+主席树. 然 ...
- 【学术篇】luogu3768 简单的数学题(纯口胡无代码)
真是一道"简单"的数学题呢~ 反演题, 化式子. \[ ans=\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j) \\ =\sum_{i=1}^n\sum_{j ...
随机推荐
- EF 线程内唯一对象
ef 做了很多修改后一起提交 增 删 改查 也就是相应的操作后不提交最后一起提交 在Dal层创建一个 EF上下文工厂 public class DBContextFactory { public st ...
- Centos下的 docker安装
安装一些必要的系统工具:sudo yum install -y yum-utils device-mapper-persistent-data lvm2 添加软件源信息:sudo yum-config ...
- 2019_8_1python
#函数 #函数是用来重复使用哒 #定义函数套路 ''' 1.首先要会写出裸代码,然后看看哪里是重复需要使用的 2.接下来将需要重复使用的代码转换成参数,带入到函数中 函数格式 def funcName ...
- Dockfile中的命令如何在.sh中执行
有类似如下内容的Dokefile文件.1 RUN cd /tmp/patch \ && /lib/python3./site-packages/moduleA/a.* \ && ...
- leetcood学习笔记-160*-相交链表
题目描述: 方法一: class Solution(object): def getIntersectionNode(self, headA, headB): """ : ...
- php 简单的工程模式 实现加法操作
class A{ protected $Num1; protected $Num2; public $result; public function getNum1(){ return $this-& ...
- 01二维背包——poj2576
/* 要求把a数组分成两个集合,两个集合人数最多差1,并且元素之和的差尽可能小 那只要把所有可行的列出来即可 01二维背包,即体积是个二维数据,那么我们的背包状态也应该设为二维 dp[j][k]设为 ...
- 线性dp——cf988F
不是很难,dp[i]表示到位置i的最小花费 #include<bits/stdc++.h> using namespace std; #define ll long long #defin ...
- NX二次开发-UFUN移动工程图视图UF_DRAW_move_view
#include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...
- NX二次开发-UFUN创建B面UF_MODL_create_bsurf
NX9+VS2012 #include <uf.h> #include <uf_modl.h> //创建一个B面 ;//U方向极数 ;//V方向极数 ;//U方向规则 ;//V ...