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]钙铁锌硒维生素 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  7. 洛谷 P1379 八数码难题 解题报告

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  8. BZOJ 3168 Luogu P4100 [HEOI2013]钙铁锌硒维生素 (矩阵求逆、二分图匹配)

    线性代数+图论好题. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3168 (luogu) https://www.lu ...

  9. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

随机推荐

  1. docker for windows 10 添加阿里云镜像仓库无效问题

    原来一直是用cmd来执行docker 命令的,结果今天发现不行了,改了镜像仓库也pull不下来. 后来换用powerShell执行docker pull 才成功.大家可以试试 win+R  运行 po ...

  2. 【php增删改查实例】第二十三节 - PHP文件上传

    22. PHP文件上传 22.1 资源文件 将这三个东西拷贝项目的根目录. 拷贝完毕后,打开upload.html: 现在,我们在项目的根目录去编写一个upload.php. PHP给我们提供了很多关 ...

  3. default construction

    4种情况下编译器会构造出nontrivial(有用)的构造函数 带有default construction的member class object 我们有两个class: class Foo { p ...

  4. nginx的web缓存服务环境部署记录

    web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...

  5. 【个人博客作业II】代码复审结果

    [代码复审结果] General Does the code work? Does it perform its intended function, the logic is correct etc ...

  6. 《linux内核设计与实现》第十八章

    第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 一.准备开始 1.内和调试需要什么 一个bug(大部分bug通常都不是行为可靠而且定义明确的) 一个藏匿bug的内核版本(知道 ...

  7. sqoop 使用笔记

    好久没有更新自己技术博客,现在开始工作了,把自己遇到的问题写到这里边来 主要把自己的问题写出来,分享给大家 sqoop 导入数据时候 有时候会遇到mysql 中有sql 中的关键字 这时候如果直接导出 ...

  8. Mock.js的简单使用

    Mock.js 提供的种类有: 步骤: 首先安装:cnpm install mockjs 创建一个mock.js的文件,写好需要引入的数据格式 在main.js中引入mock.js文件: requir ...

  9. Which path should be used jdk or jre for JAVA_HOME environment variable?

    https://stackoverflow.com/questions/17601827/which-one-should-java-home-to-point-jdk-or-jre 临时变更JAVA ...

  10. git 快捷键

    实际上就是弄了个别名 $ git config --global alias.st status $ git config --global alias.ci commit $ git config ...