洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告
P4100 [HEOI2013]钙铁锌硒维生素
题目描述
银河队选手名单出来了!小林,作为特聘的营养师,将负责银河队选手参加 宇宙比赛的饮食。
众所周知,前往宇宙的某个星球,通常要花费好长好长的时间,人体情况在 这之间会发生变化,因此,需要根据每天的情况搭配伙食,来保证营养。
小林把人体需要的营养分成了 \(n\) 种,这些营养包括但不限于铁,钙。他准备 了 \(2\) 套厨师机器人,一套厨师机器人有 \(n\) 个,每个厨师机器人只会做一道菜,这道菜一斤能提供第 \(i\) 种营养 \(x_i\) 微克。想要吃这道菜的时候,只要输入一个数,就能吃到对应数量的这道菜了。为防止摄入过量对身体造成的伤害,每个机器人还 有防过量摄入药,只要输入一个数,就能生成一定剂量的药,吃了这些药,就能减少相当于食用对应数目的这道菜提供的营养。
小林之所以准备 \(2\) 套厨师机器人,正是因为旅途漫漫,难以预计,也许某一 个厨师机器人在途中坏掉,要是影响了银河队选手的身体,就不好了。因此,第 \(2\) 套厨师机器人被用来做第 \(1\) 套的备用。小林需要为每一个第 \(1\) 套厨师机器人选 一个第 \(2\) 套厨师机器人作备份,使得当这个机器人坏掉时,用备份顶替,整套厨 师机器人仍然能搭配出任何营养需求,而且,每个第 \(2\) 套厨师机器人只能当一个 第 \(1\) 套厨师机器人的备份。
输入输出格式
输入格式:
输入文件的第一行包含一个正整数 \(n\)。
接下来 \(n\) 行,每行 \(n\) 个整数,表示第 \(1\) 套厨师机器人做的菜每一斤提供的每种营养。
再接下来 \(n\) 行,每行 \(n\) 个整数, 表示第 \(2\) 套厨师机器人做的菜每一斤提供的每种营养。
输出格式:
输出文件的第一行是一个字符串,如果无法完成任务,输出“\(NIE\)”,否则输 出“\(TAK\)”,并跟着 \(n\) 行,第 \(i\) 行表示第 \(i\) 个第 \(1\) 套机器人的备份是哪一个第 \(2\) 套机器人。为了避免麻烦,如果有多种可能的答案,请给出字典序最小的那一组。
说明
对于\(10\%\)的数据,\(n = 2\);
对于\(20\%\)的数据,\(n ≤ 10\);
对于\(40\%\)的数据,\(n ≤ 30\);
对于\(60\%\)的数据,\(n ≤ 50\);
对于\(80\%\)的数据,\(n ≤ 100\);
对于\(100\%\)的数据,\(1 ≤ n ≤ 300\),所有出现的整数均非负,且不超过 \(10,000\)。
好题阿
首先\(n\)个\(A\)向量得是向量无关的
然后每个\(B\)向量一定可以被\(A\)向量作为基底表示出来,即\(B=\sum c_iA_i\),若\(c_i\)不为\(0\),就说明这个\(B\)必须要\(A_i\)才能被表示,说明去掉这个\(A_i\)后\(B\)与其他\(A\)线性无关,即可以换掉这个\(A\)。
那么\(C*A=B\),矩阵求个逆把\(C\)搞出来,我们就可以确定替换关系,然后进行二分图匹配。
这时候不一定字典序最小,我们再随便跑跑匹配改一改跑一个最小就可以了。
Code:
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
const int mod=998244353;
const int N=602;
inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}
#define mul(x,y) (1ll*(x)*(y)%mod)
int qp(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;}
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
int a[N][N],b[N][N],yuu[N][N],yuy[N][N],n;
bool Matrixinv()
{
for(int i=1;i<=n;i++) a[i][i+n]=1;
for(int i=1;i<=n;i++)
{
int id=-1;
for(int j=i;j<=n;j++) if(a[j][i]) {id=j;break;}
if(id==-1) return false;
std::swap(a[i],a[id]);
int inv=qp(a[i][i],mod-2);
for(int j=n<<1;j>=i;j--) a[i][j]=mul(a[i][j],inv);
for(int j=i+1;j<=n;j++)
for(int k=n<<1;k>=i;k--)
a[j][k]=add(a[j][k],mod-mul(a[j][i],a[i][k]));
}
for(int i=n;i;i--)
for(int j=i-1;j;j--)
for(int k=n<<1;k>=i;k--)
a[j][k]=add(a[j][k],mod-mul(a[j][i],a[i][k]));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=a[i][j+n];
return true;
}
int used[N],mat[N],to[N],ban[N];
bool dfs(int now)
{
for(int i=1;i<=n;i++)
if(yuy[now][i]&&!used[i]&&!ban[i])
{
used[i]=1;
if(!mat[i]||dfs(mat[i]))
{
mat[i]=now;
to[now]=i;
return true;
}
}
return false;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=read();
if(!Matrixinv()) return puts("NIE"),0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
yuu[i][j]=add(yuu[i][j],mul(b[i][k],a[k][j]));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(yuu[i][j])
yuy[j][i]=1;
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof used);
if(!dfs(i)) return puts("NIE"),0;
}
puts("TAK");
int tto[N],tmat[N];
for(int i=1;i<=n;i++)
{
memset(used,0,sizeof used);
for(int j=1;j<=n;j++) tto[j]=to[j],tmat[j]=mat[j];
int bee=to[i],flag=0;mat[bee]=0;
for(int j=1;j<bee;j++)
if(yuy[i][j]&&!ban[j]&&!used[j])
{
used[j]=1;
if(!ban[j]&&dfs(mat[j]))
{
to[i]=j,mat[j]=i;
flag=1;break;
}
}
if(!flag) for(int j=1;j<=n;j++) to[j]=tto[j],mat[j]=tmat[j];
ban[to[i]]=1;
}
for(int i=1;i<=n;i++) printf("%d\n",to[i]);
return 0;
}
2019.2.15
洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告的更多相关文章
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告
[USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...
- 洛谷 P1379 八数码难题 解题报告
P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...
- BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)
线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...
- NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告
前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...
随机推荐
- C# 随机生成姓名的方法
没什么好说的,因为用的上,所以作此记录: 代码如下: public class indexModel { private object O = new object(); public List< ...
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
前言 从3月8号收到板子,到今天算起来,uFUN到手也有两周的时间了,最近利用下班后的时间,做了个心率计,从单片机程序到上位机开发,到现在为止完成的差不多了,实现很简单,uFUN开发板外加一个Puls ...
- 线程中join()的用法
Thread中,join()方法的作用是调用线程等待该线程完成后,才能继续用下运行. public static void main(String[] args) throws Interrupted ...
- Python 学习 第九篇:模块
模块是把程序代码和数据封装的Python文件,也就是说,每一个以扩展名py结尾的Python源代码文件都是一个模块.每一个模块文件就是一个独立的命名空间,用于封装顶层变量名:在一个模块文件的顶层定义的 ...
- mybatis 思考
https://my.oschina.net/xianggao/blog/548579 https://my.oschina.net/xianggao/blog/548873 https://my.o ...
- 一个很好用的在线编辑、展示、分享、交流JavaScript 代码的平台
在发表博客时,有一些代码只能粘贴进去,而不能看到代码运行的效果,需要读者把代码粘贴进自己的编辑器,然后再运行看效果,这是一件很耗时的事情 在平时百度的时候,我发现一些网站可以在线预览功能,而且可以在线 ...
- Quartz_配置
quartz_jobs.xml job 任务 其实就是1.x版本中的<job-detail>,这个节点是用来定义每个具体的任务的,多个任务请创建多个job节点即可 name(必填) 任务名 ...
- zabbix中配置当memory剩余不足20%时触发报警
在zabbix中默认当内存剩余量不足2G的时候触发报警,并没有使用百分比来触发如下: 现在需要配置:当memory剩余不足20%时触发报警,具体操作方法如下: 1)创建itemConfiguratio ...
- Linux系统入门教程:如何在 Linux 中修改默认的 Java 版本
提问:当我尝试在Linux中运行一个Java程序时,我遇到了一个错误.看上去像程序编译所使用的Java版本与我本地的不同.我该如何在Linux上切换默认的Java版本? 当Java程序编译时,编译环境 ...
- 饿了么element UI<el-dialog>弹出层</el-dialog>修改默认样式不能在<style scoped>修改
如果在非scoped下,修改el-dialog自动添加的DIV类名的style加上important,可以覆盖原来的width,但这样会让整个项目的样式都乱套. 如果在scoped下修改style.所 ...