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

转载于:https://www.cnblogs.com/butterflydew/p/10382777.html

洛谷 P4100 [HEOI2013]钙铁锌硒维生素 解题报告相关推荐

  1. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

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

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

  3. luogu P4100 [HEOI2013]钙铁锌硒维生素

    https://www.luogu.com.cn/problem/P4100 题目大意: 首先构造两个矩阵A,B 把A,B转置一下变成AT,BTA^T,B^TAT,BT 就相当于是写成把若干个向量拼成 ...

  4. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  5. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  6. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  8. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  9. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

最新文章

  1. JavaWeb项目实现文件下载
  2. 注册界面php mysql_php:用户登录注册并存入数据库的简单网页示例
  3. jquery拼接后css样式不生效_JQuery常用选择器以及操作属性和样式的方法介绍
  4. 【C++多线程系列】【四】将类的成员函数作为线程启动函数
  5. python中的try...except...finally函数
  6. Latin1_General_BIN
  7. 来和 webpack 谈场恋爱吧!这课程好甜!
  8. CodeForces - 546C Soldier and Cards(模拟)
  9. linux 与有什么不同
  10. SAP License:HANA在线日志被误删后如何恢复?
  11. 1.2_linearbinary_search_顺序(线性)查找二分(折半)查找
  12. 竞拍网站服务器配置,GOM引擎新区竞拍脚本,GOM传奇服务端设置竞拍的方法和教程...
  13. ios模拟器 安装ipa_用iOS模拟器安装App的方法
  14. 在线客服html前端代码QQ微信联系
  15. 置换矩阵、转置矩阵以及向量空间、子空间
  16. linux中查看rpm包位置,linux中,查看某个命令是来自哪个RPM包或者是通过哪个RPM包安装的...
  17. android中数据统计,Android 友盟统计集成
  18. 微博做内容和收入来源
  19. 创业教父YC创始人Paul Graham就很烦鼓动年轻创业的
  20. Mac电脑没有声音但是重启后恢复

热门文章

  1. Math Alg. Root 数学算法笔记:开根号
  2. 指数衰减学习率的staircase
  3. 马云:蚂蚁最应该感谢微信;FB再曝丑闻:扎克伯格将用户数据作为筹码打击对手;滴滴调整顺风车试运营规则 | EA周报...
  4. copy ctor、copy assignment(拷贝构造函数和拷贝赋值函数)
  5. c语言两个浮点数相乘,两个浮点变量相乘结果为什么不精确
  6. 大数据招聘,我就这样被算法选中
  7. 参加python全栈开发培训需要多少钱?
  8. 华为python673集_[译] 使用 Python 的 Pandas 和 Seaborn 框架从 Kaggle 数据集中提取信息...
  9. 美国主机中的RAID磁盘是什么意思?
  10. (Emitted value instead of an instance of Error) <swiper-slide v-for=“img in allData.url“>: component