Portal

Description

给定一个\(n\times n\)的矩阵\(B\)和一个\(1×n\)的矩阵\(C\)。求出一个\(1×n\)的01矩阵\(A\),使得\(D=(A×B-C)×A^T\)最大,其中\(A^T\)为\(A\)的转置。输出\(D\)。

Solution

先展开一波。

\[\begin{align*}
D &= (A×B-C)×A^T \\
&= \begin{bmatrix} \sum_{i=1}^n a_ib_{i1}-c_1 & \sum_{i=1}^n a_ib_{i2}-c_2 & ... & \sum_{i=1}^n a_ib_{in}-c_n \end{bmatrix} \times A^T \\
&= \sum_{j=1}^n a_j (\sum_{i=1}^n a_ib_{ij}-c_j) \\
&= \sum_{i=1}^n \sum_{j=1}^n a_ia_jb_{ij} - \sum_{i=1}^n a_ic_i
\end{align*}$$ 观察发现,要想获得$b_{ij}$的价值就需要让$a_i=a_j=1$,但如果$a_i$被选就得付出$c_i$的代价。那么同[太空飞行计划](https://loj.ac/problem/6001),求最大权闭合图即可。

##Code
```cpp
//线性代数
#include <cstdio>
#include <cstring>
inline char gc()
{
static char now[1<<16],*S,*T;
if(S==T) {T=(S=now)+fread(now,1,1<<16,stdin); if(S==T) return EOF;}
return *S++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
int min(int x,int y) {return x<y?x:y;}
int const N=3e5;
int const INF=0x7FFFFFFF;
int n;
int cnt,h[N];
struct edge{int v,c,nxt;} ed[N*6];
void edAdd(int u,int v,int c)
{
cnt++; ed[cnt].v=v,ed[cnt].c=c,ed[cnt].nxt=h[u],h[u]=cnt;
cnt++; ed[cnt].v=u,ed[cnt].c=0,ed[cnt].nxt=h[v],h[v]=cnt;
}
int s,t;
int dpt[N]; int Q[N],op,cl;
bool bfs()
{
memset(dpt,0,sizeof dpt);
dpt[s]=1,Q[++cl]=s;
while(op<cl)
{
int u=Q[++op]; if(u==t) break;
for(int i=h[u];i;i=ed[i].nxt)
{
int v=ed[i].v;
if(!dpt[v]&&ed[i].c) dpt[v]=dpt[u]+1,Q[++cl]=v;
}
}
return dpt[t];
}
int fill(int u,int in)
{
if(u==t) return in;
int out=0;
for(int i=h[u];i&&in>out;i=ed[i].nxt)
{
int v=ed[i].v,c=ed[i].c;
if(!c||dpt[v]!=dpt[u]+1) continue;
int fl=fill(v,min(in-out,c));
if(!fl) dpt[v]=0;
else out+=fl,ed[i].c-=fl,ed[i^1].c+=fl;
}
return out;
}
int maxFlow()
{
int res=0;
while(bfs()) res+=fill(s,INF);
return res;
}
int main()
{
n=read(); int ans=0;
s=0,t=n*n+n+1; cnt=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int u=(i-1)*n+j,c=read(); ans+=c;
edAdd(s,u,c); edAdd(u,n*n+i,INF),edAdd(u,n*n+j,INF);
}
for(int i=1;i<=n;i++) edAdd(n*n+i,t,read());
printf("%d\n",ans-maxFlow());
return 0;
}
```

##P.S.
洛谷A了,原数据A了,但BZOJ上RE?!\]

洛谷P3973 - [TJOI2015]线性代数的更多相关文章

  1. 洛谷3973 TJOI2015线性代数(最小割+思维)

    感觉要做出来这个题,需要一定的线代芝士 首先,我们来观察这个柿子. 我们将\(B\)的权值看作是收益的话,\(C\)的权值就是花费. 根据矩阵乘法的原理,只有当\(a[i]和a[j]\)都为\(1\) ...

  2. 【洛谷P3973】[TJOI2015]线性代数(最小割)

    洛谷 题意: 给出一个\(n*n\)的矩阵\(B\),再给出一个\(1*n\)的矩阵\(C\). 求一个\(1*n\)的\(01\)矩阵\(A\),使得\(D=(A\cdot B-C)\cdot A^ ...

  3. 洛谷 [P3973] 线性代数

    最大权闭合子图,神题 这不是线性代数,这是网络流. 我们看见这是一堆矩阵的运算,而且最后变成了一个数,那么我们就想到,把这个矩阵乘法的过程用具体的数字推出来 我们发现,a是一个01矩阵,然后其实就可以 ...

  4. 洛谷 P3975 [TJOI2015]弦论 解题报告

    P3975 [TJOI2015]弦论 题目描述 为了提高智商,ZJY开始学习弦论.这一天,她在<String theory>中看到了这样一道问题:对于一个给定的长度为\(n\)的字符串,求 ...

  5. [洛谷P3975][TJOI2015]弦论

    题目大意:求一个字符串的第$k$大字串,$t$表示长得一样位置不同的字串是否算多个 题解:$SAM$,先求出每个位置可以到达多少个字串($Right$数组),然后在转移图上$DP$,若$t=1$,初始 ...

  6. [洛谷P3978][TJOI2015]概率论

    题目大意:对于一棵随机生成的$n$个结点的有根二叉树,所有不同构的形态等概率出现(这里同构当且仅当两棵二叉树根相同,并且相同节点的左儿子和右儿子都相同),求叶子节点个数的期望是多少? 题解:令$f_n ...

  7. 【BZOJ3996】[TJOI2015]线性代数(最小割)

    [BZOJ3996][TJOI2015]线性代数(最小割) 题面 BZOJ 洛谷 题解 首先把式子拆开,发现我们的答案式就是这个: \[\sum_{i=1}^n\sum_{j=1}^n B_{i,j} ...

  8. 【LG3973】[TJOI2015]线性代数

    [LG3973][TJOI2015]线性代数 题面 洛谷 题解 正常解法 一大堆矩阵乘在一起很丑对吧 化一下柿子: \[ D=(A*B-C)*A^T\\ \Leftrightarrow D=\sum_ ...

  9. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

随机推荐

  1. CF989C A Mist of Florescence

    思路: 有趣的构造题. 实现: #include <bits/stdc++.h> using namespace std; ][]; void fillin(int x, int y, c ...

  2. hihocoder1718 最长一次上升子序列

    思路: 对于每个i,分别求1~i和i+1~N两部分的最长下降子序列“拼”起来,最终取最大长度即可.学习了如何使用BIT把LIS问题O(N2)算法优化为O(Nlog(N))的算法. https://ww ...

  3. 我来解数独(附delphi源码)

    前段时间看到“69岁农民3天破解世界最难数独游戏”,然后在看了那个号称世界最难的数独题目之后,就打算抽空编程解决.今晚抽出一个晚上,大约四五个小时的时间,中间还间歇在clash of clans上造兵 ...

  4. Ubuntu16.04常用操作命令总结ing

    查看软件安装目录:whereis 软件名称(如:whereis mysql,where is sqlite3等) 安装软件:apt/apt-get install 软件名称(如:apt/apt-get ...

  5. C# string日期格式

    百分数格式应该用“p”这个参数. 格式 原始 数据 结 果 "{0:P}" 0.40 40% 数字 {0:N2} 12.36  数字 {0:N0} 13  货币 {0:c2} $1 ...

  6. swift Equatable 函数签名的测试

    struct Degoo:Equatable { var lex:String var pex:String static func == (left:Degoo, right:Degoo) -> ...

  7. C#飞行棋总结

    以下是掷色子的一个代码,比较有代表性,里面的逻辑和内容都已注释,可通过注释了解这一方法的运作模式. public static void RowTouZi(int playerPos) //掷色子 { ...

  8. DROP CONVERSION - 删除一个用户定义的编码转换

    SYNOPSIS DROP CONVERSION name [ CASCADE | RESTRICT ] DESCRIPTION 描述 DROP CONVERSION 删除一个以前定义的编码转换. 要 ...

  9. dircolors - 设置‘ls'显示结果的颜色

    SYNOPSIS[总览] dircolors [-b] [--sh] [--bourne-shell] [-c] [--csh] [--c-shell] [-p] [--print-database] ...

  10. ACCEPT详解

    NAME 名称 accept - 在一个套接字上接收一个连接 SYNOPSIS 概述 #include <sys/types.h> #include <sys/socket.h> ...