• 考虑优化贪心,不回溯,对于每一位,你都判一下放0的话后面是否有解,用网络流判是否可以完美匹配就行了。
  • 但这样时间复杂是错的,所以不必每次都重新建图,现在原来的图中看一下该行列是否已经匹配,若没有,则强制该行列匹配,重新建图,看是否完美匹配即可
  • 时间复杂度好像是错的?首先,随着你点放的点越来越多,你的图会越来越小,跑的越来越快。其次,有很多行列在原来的途中就已经匹配,不必每次都跑。最后,它可以飞快的通过本题。
// luogu-judger-enable-o2
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef int sign;
typedef long long ll;
#define For(i,a,b) for(register sign i=(sign)a;i<=(sign)b;++i)
#define Fordown(i,a,b) for(register sign i=(sign)a;i>=(sign)b;--i)
const int N=100+5;
bool cmax(sign &a,sign b){return (a<b)?a=b,1:0;}
bool cmin(sign &a,sign b){return (a>b)?a=b,1:0;}
template<typename T>T read()
{
T ans=0,f=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch-'0'),ch=getchar();
return ans*f;
}
template<typename T>void write(T x,char y)
{
if(x==0)
{
putchar('0');
return;
}
if(x<0)
{
putchar('-');
x=-x;
}
static char wr[20];
int top=0;
for(;x;x/=10)wr[++top]=x%10+'0';
while(top)putchar(wr[top--]);
putchar(y);
}
void file()
{
#ifndef ONLINE_JUDGE
freopen("1418.in","r",stdin);
freopen("1418.out","w",stdout);
#endif
}
int n,m;
int r[N],c[N];
int mp[N][N];
void input()
{
n=read<int>(),m=read<int>();
For(i,1,n)r[i]=m-read<int>();
For(j,1,m)c[j]=n-read<int>();
}
const int M=1e5+5;
struct edge
{
int v,flow,nex;
}e[M];
int head[N<<1],tt=1;
void add(int x,int y,int flow)
{
e[++tt]=(edge){y,flow,head[x]},head[x]=tt;
e[++tt]=(edge){x,0,head[y]},head[y]=tt;
}
int s,t,dis[N<<1],gap[N<<1],cur[N<<1];
const int inf=0x3f3f3f3f;
int dfs(int u,int flow)
{
if(u==t)return flow;
int res=flow,v,f;
for(register int &i=cur[u];i;i=e[i].nex)
{
v=e[i].v;
if(dis[u]==dis[v]+1&&e[i].flow)
{
f=dfs(v,min(res,e[i].flow));
e[i].flow-=f,e[i^1].flow+=f;
if(!(res-=f))return flow;
}
}
if(!--gap[dis[u]])dis[s]=t;
++gap[++dis[u]];
return flow-res;
}
int isap()
{
memset(gap,0,sizeof gap);
memset(dis,0,sizeof dis);
int res=0;
for(gap[0]=t;dis[s]<t;)
{
memcpy(cur,head,sizeof cur);
res+=dfs(s,inf);
}
return res;
}
int judge;
void rebuild(int x,int y)
{
memset(head,0,sizeof head);
tt=1,judge=0;
s=n+m+1,t=s+1;
For(i,1,n)add(s,i,r[i]),judge+=r[i];
For(j,1,m)add(j+n,t,c[j]);
For(j,y+1,m)add(x,j+n,1);
For(i,x+1,n)For(j,1,m)add(i,j+n,1);
}
int check(int x,int y)
{
--r[x],--c[y];
int v;
for(register int i=head[x];i;i=e[i].nex)
{
v=e[i].v;
if(v==y+n&&!e[i].flow)return 1;
}
rebuild(x,y);
if(judge==isap())return 1;
++r[x],++c[y];
if(y==1)rebuild(x-1,m);
else rebuild(x,y-1);
isap();
return 0;
}
void out()
{
For(i,1,n)
{
For(j,1,m)printf("%d",mp[i][j]);
puts("");
}
}
void work()
{
For(x,1,n)For(y,1,m)
{
if(r[x]&&c[y]&&check(x,y))
{
mp[x][y]=0;
}
else
{
mp[x][y]=1;
}
}
}
int main()
{
file();
input();
rebuild(1,0);
isap();
work();
out();
return 0;
}

[TJOI2011]构造矩阵的更多相关文章

  1. [题解] [TJOI2011] 构造矩阵

    题面 题解 很容易看出来是道网络流的题目, 要是没有这个字典序最小, 直接建图跑一遍就好了, 考虑如何输出字典序最小的方案 我们可以贪心地去选择, 若当前点可以选0就选0, 不能选0就选1, 有一点像 ...

  2. POJ 3233 Matrix Power Series(构造矩阵求等比)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak. ...

  3. Number Sequence(HDU 1005 构造矩阵 )

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  4. hdu 5015 233 Matrix(构造矩阵)

    http://acm.hdu.edu.cn/showproblem.php?pid=5015 由于是个二维的递推式,当时没有想到能够这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.依据这一点来 ...

  5. [数学-构造矩阵]NEFU 1113

    依据题意.我已经推导出tn的公式.ti=ti.a+ti.b,ti.a=5*t(i-1).a+4*t(i-1).b,ti.b=t(i-1).a+t(i-1).b 然而以下居然不能继续推到sn的公式!!! ...

  6. poj 3735 Training little cats(构造矩阵)

    http://poj.org/problem?id=3735 大致题意: 有n仅仅猫,開始时每仅仅猫有花生0颗,现有一组操作,由以下三个中的k个操作组成: 1. g i 给i仅仅猫一颗花生米 2. e ...

  7. HDU 3306 Another kind of Fibonacci ---构造矩阵***

    Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. 构造矩阵解决这个问题 【nyoj299 Matrix Power Series】

    矩阵的又一个新使用方法,构造矩阵进行高速幂. 比方拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s. ...

  9. UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

    题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))( ...

随机推荐

  1. BZOJ4237 JOISC2014 稻草人 CDQ分治、单调栈

    传送门 题意:给出平面上$N$个点,求满足以下两个条件的矩形:①左下角与右上角各有一个点:②矩形内部没有点.$N \leq 2 \times 10^5$,所有数字大于等于$0$,保证坐标两两不同 最开 ...

  2. 实现Repeater控件的记录单选(二)

    前一篇<实现Repeater控件的记录单选>http://www.cnblogs.com/insus/p/7426334.html 虽然可以实现对Repeater控件的记录进行单选,但是, ...

  3. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  4. maven 通过 pom.xml 指定java编译版本

    <!-- 给maven项目指定编译版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> ...

  5. CentOS搭建V~P~N服务,实现虚拟专用网络

    什么是V-P-N V-P-N即虚拟专用网络,它的功能是:在公用网络上建立专用网络,进行加密通讯. V-P-N网关通过对数据包的加密和数据包目标地址的转换实现远程访问.V-P-N有多种分类方式,主要是按 ...

  6. 记一次在.NET成长之路上的下午茶

    在2017年2月25日我和李海国有幸与阳铭.朱永光两位大哥喝了一次下午茶.熟悉ABP框架的朋友呢知道阳铭远在上海,所以个人很是珍惜这次机会.朱永光大哥是微软MVP,之前是启路科技的CTO,目前在微软. ...

  7. 这里已不再更新,访问新博客请移步 http://www.douruixin.com

    这里已不再更新,访问新博客请移步 http://www.douruixin.com

  8. python基础学习笔记(五)

    字符串基本操作 所有标准的序列操作(索引.分片.乘法.判断成员资格.求长度.取最小值和最大值)对字符串同样适用,前面已经讲述的这些操作.但是,请注意字符串都是不可变的. 字符串的方法: 字符串从str ...

  9. springboot undertow替换tomcat方式

    版权声明: https://blog.csdn.net/weixin_38187317/article/details/81532560说明        undertow,jetty和tomcat可 ...

  10. 阿里云OSS下载pdf文件,并在pdf文件上添加水印

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 公司要求从阿里云OSS下载pdf文件并且需要添加水印. 因此这里总结一下. 首先添加了一个F ...