题目:所罗门王的宝藏

题意:

给定一个n*m的矩阵,请问,这个矩阵能否通过一个零矩阵来通过行或列同时加减某一个数来构造出来。

方法一:

利用题意来找规律

这个规律就是任意两行、两列之间的差值是不变的。

证明:

①、当该行全±K时,其实对该行中,只是改变了该行与其他行的差值。

用符号表示为: i行±K只会对j行的差值发生变化,(j∈[1,n] , i≠j)

②、列证明同上。

如果对于 a[i][j]的元素来说,位于第i行 , 第j列。

在第i行整行进行了变化,还在第j列整列发生变化。这时怎么样分析呢???

其实,根据我们推断出来的 ①和②来证明,

这是通过合法的变换得到这个矩阵。

举个例子来阐述吧,有n+m名老师,其中n名老师都是教科目A,而另外的m名老师教的是科目B。n名老师只会教  与自己相对应的某一行学生  科目A,而m名老师只会教与自己相对应的某一列学生科目B。

老师想知道自己的教学的效果怎么样,他教学不会在自己班来进行比较(因为老师知道每一位学生的资质和能力是不同的,而且都是自己教的没有可比性而言),而会和其他班的同学比较,我们a[i][j]指的是两个科目之和,所以老师相比较的时候不会交叉比较。也就是说,

例如:教导科目A的第i个老师想知道自己的教学效果,会和第i+1个老师的教学效果来比较,但是每一位同学都是不同的科目B的老师教的,所以他会选择相对应的同列学生来比较。(就如我们化学和物理实验中的“控制变量法”)。

方法二:

构造n+m个变量的方程式组,问其是否有解。

n+m个变量中:n个是每行的变化的值,m个事每列的变化的值。

通过上面的格式,行列都有对应的变化元素构造出n*m个 未知数的方程组

构造出来这个方程组了,然后求问,是否存在有整数解。

通过高斯消元求行列式的秩,r(B)=r(A)。

思维:

主要参考博客 Brother Dragon

通过观察可以知道,其实整行整列+1/-1其实两行间的差值并无影响。

不过需要一点技巧来判断任意两行或者两列间的差值不变,具体可以看代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+100;
int a[N],b[N],c[N];
int visr[N][N],visc[N][N],R[N][N],C[N][N];
int n,m,k,T;
int sub(int a,int b,int t){return a>b?-t:t;
}
int main()
{scanf("%d",&T);while(T--){memset(visc,0,sizeof(visc));memset(visr,0,sizeof(visr));int flag=1;scanf("%d%d%d",&n,&m,&k);for(int i=0;i<k;i++){scanf("%d%d%d",&a[i],&b[i],&c[i]);}for(int i=0;i<k;i++){for(int j=i+1;j<k;j++){if(!visc[b[i]][b[j]]&&a[i]==a[j]){C[b[i]][b[j]]=sub(b[i],b[j],c[i]-c[j]);visc[b[i]][b[j]]=1;}else if(C[b[i]][b[j]]!=sub(b[i],b[j],c[i]-c[j])&&a[i]==a[j]){flag=0;}if(!visr[a[i]][a[j]]&&b[i]==b[j]){R[a[i]][a[j]]=sub(a[i],a[j],c[i]-c[j]);visr[a[i]][a[j]]=1;}else if(R[a[i]][a[j]]!=sub(a[i],a[j],c[i]-c[j])&&b[i]==b[j]){flag=0;}}}for(int i=1;i<=n;i++) if(visr[i][i]&&R[i][i]) flag=0;for(int i=1;i<=m;i++) if(visc[i][i]&&C[i][i]) flag=0;puts(flag?"Yes":"No");}return 0;
}

图论

主要参考别人大佬的博客

个人认为这位大佬写的很精辟,说得非常详细。

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100;
int n,m,k,T,vis[N],head[N],del[N],cnt=0;
typedef struct Edge{int to,next,w;Edge(int To=0,int Next=0,int W=0):to(To),next(Next),w(W){}
}Edge;
Edge e[N];
void add_Edge(int u,int v,int w){e[cnt]=Edge(v,head[u],w);head[u]=cnt++;
}
inline void read (int &X){int x=0,f=0;char ch=0;while(!isdigit(ch)){f|=ch=='-';ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}X=f?-x:x;
}
bool bfs(int S){queue<int>q;q.push(S);vis[S]=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];~i;i=e[i].next){int v=e[i].to,w=e[i].w;if(vis[v]&&del[u]+del[v]!=w){return false;}else if(!vis[v]){del[v]=w-del[u];vis[v]=1;q.push(v);}}}return true;
}
int main()
{read(T);while(T--){cnt=0;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));read(n),read(m),read(k);int u,v,w;for(int i=0;i<k;i++){read(u),read(v),read(w);add_Edge(u,v+n,w);add_Edge(v+n,u,w);}bool flag=true;for(int i=1;i<=n+m;i++){if(!vis[i]) flag&=bfs(i);}puts(flag?"Yes":"No");}return 0;
}

高斯消元

主要参考浩男哥的博客

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2010;
int a[MAXN][MAXN],x[MAXN];
bool free_x[MAXN];
int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
inline int lcm(int a,int b){return a/gcd(a,b)*b;
}
int Gauss(int equ,int var){int i,j,k;int max_r;int col;int ta,tb;int LCM;int temp;int free_x_num;int free_index;for(int i=0; i<=var; i++){x[i]=0;free_x[i]=true;}col=0;for(k = 0; k < equ && col < var; k++,col++){max_r=k;for(i=k+1; i<equ; i++){if(abs(a[i][col])>abs(a[max_r][col]))max_r=i;}if(max_r!=k){for(j=k; j<var+1; j++)swap(a[k][j],a[max_r][j]);}if(a[k][col]==0){k--;continue;}for(i=k+1; i<equ; i++) {if(a[i][col]!=0){LCM = lcm(abs(a[i][col]),abs(a[k][col]));ta = LCM/abs(a[i][col]);tb = LCM/abs(a[k][col]);if(a[i][col]*a[k][col]<0)tb=-tb;for(j=col; j<var+1; j++){a[i][j] = a[i][j]*ta-a[k][j]*tb;}}}}for (i = k; i < equ; i++)  {if (a[i][col] != 0)return -1;}if (k < var){return var - k;}for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; j++){if (a[i][j] != 0)temp -= a[i][j] * x[j];}if (temp % a[i][i] != 0)return -2;x[i] = temp / a[i][i];}return 0;
}
int main(void)
{int equ,var;int T;scanf("%d",&T);while(T--){int n,m,k;int u,v,w;memset(a,0,sizeof(a));scanf("%d%d%d",&n,&m,&k);for(int i=0;i<k;i++){scanf("%d%d%d",&u,&v,&w);a[i][u-1]=a[i][n-1+v]=1;a[i][n+m]=w;}var=n+m;equ=k;int flag=Gauss(equ,var);if(flag==-1||flag==-2){printf("No\n");}else{printf("Yes\n");}}return 0;
}

【思维 | 图论 | 高斯消元】所罗门王的宝藏相关推荐

  1. bzoj 2844: albus就是要第一个出场 高斯消元

    LINK 题意:看题目不如看样例解释.给出有n个数的集合,对这些子集中的数求异或,升序统计所有子集得到的数(重复会被计入),询问一个数x,问这个数出现的第一个位置 思路:在这里要求一个所有可能出现的异 ...

  2. 中国石油大学 个人训练赛第五场C:所罗门王的宝藏(高斯消元)

    题目描述 据古代传说记载,所罗门王既是智慧的代表,又是财富的象征.他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是世人瞩目的"所罗门王的 ...

  3. 【高斯消元】[JSOI2008]球形空间产生器sphere

    [JSOI2008]球形空间产生器sphere 省选难度的板子 + 普及思维 = 紫题 (没毛病 日推天天推紫题再见了同学们我自请退群 为什么要我一个三维生物想象n维空间呢 以二维举例(糊一波我的手稿 ...

  4. Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter

    文章目录 前言 XOR-filter 实现原理 xor filter 的构造原理 xor filter 构造总结 XOR-filter 和 ADD-filter对比 XOR-filter 在计算上的优 ...

  5. poj 1681 Painter#39;s Problem(高斯消元)

    http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值 ...

  6. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  7. ICPC 2005 hangzhou Generator (UVA1358)KMP + 期望DP / 高斯消元

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Generator Weblink https://www.luogu.com.cn/problem/ ...

  8. 2020 ACM / ICPC 济南 A Matrix Equation (高斯消元、乘法原理)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 给你定义两种 010101 矩阵上的运算: Xi,j×Yi,j=(∑k=1NXi,kYk,j ...

  9. luogu P4035 [JSOI2008]球形空间产生器(高斯消元 / 模拟退火)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 数据范围只开到了10,而且是经典的力学结构,所以我们可以用模拟退火,可以做一下 nnn 维的正交分解h ...

  10. BZOJ 2707: [SDOI2012]走迷宫 [高斯消元 scc缩点]

    2707: [SDOI2012]走迷宫 题意:求s走到t期望步数,\(n \le 10^4\),保证\(|SCC| \le 100\) 求scc缩点,每个scc高斯消元,scc之间直接DP 注意每次清 ...

最新文章

  1. 怎么自学python编程-怎么能学习好python编程?有自学的方法吗?
  2. denied 虚拟机access_Windows 2008 R2 Administrator access denied解决办法
  3. ((ios开发学习笔记 十))代码实现自定义TableView
  4. 「转型新范式」第四范式2021发布会全程直播倒计时
  5. 一条命令解决系统N多故障
  6. python生成动态二维码实例_python生成动态个性二维码(示例代码)
  7. ubuntu16 黑主题_给Ubuntu 8.10安装超炫酷黑色新主题
  8. automake使用实例
  9. hive shell 导入数据
  10. csol战损左轮python_CSOL2017年9月12日更新维护到几点
  11. C# 类型转换(is和as运算符)
  12. Optimizing the Transition Waste in Coded Elastic Computing(实现0浪费弹性编码计算)
  13. 如何让自己的电脑内外网同时用?
  14. mysql order优化2019_MySQL 效率提高N倍的19条MySQL优化秘籍
  15. python 二维列表_python二维列表
  16. IntellijIdea2018 Liscense server激活码
  17. SiT5357:±0.1~±0.25ppm超高精度Stratum 3温补振荡器TCXO,60-220MHz
  18. 二本学校有java校招_二本学校校招心得体会
  19. java-构建乘积数组(剑指offter-数组-简单)
  20. 面试最常考、最常用的10大机器学习算法

热门文章

  1. 设置QQ空间评论回复权限,包括日志、相册、说说、留言板的评论回复和留言权限,限制名单成员无评论回复权限
  2. 点赋科技:如何提高淘宝店铺的流量?
  3. 百度高德经纬度-离线一键批量纠偏工具
  4. 正则表达式 -验证身份证号
  5. 服务器开机自检提示信息,hp服务器开机自检报错提示
  6. 苹果电脑mp3转gif_用苹果电脑做gif动图的方法终于找到了...
  7. Java实战项目-移动电商秒杀系统seckill优化
  8. 关于SiamRPN代码的一些要点
  9. 分享各类优秀与设计师制作公司相关的资源网站
  10. Centos 修改主机名称