题目描述

  给出一个\(n\)行\(m\)列的矩阵\(A\), 保证满足以下性质:

   1.\(m>n\)。

   2.矩阵中每个数都是\([0,n]\)中的自然数。

   3.每行中,\([1,n]\)中每个自然数都恰好出现一次。这意味着每行中\(0\)恰好出现\(m−n\)次。

   4. 每列中,\([1,n]\)中每个自然数至多出现一次。

现在我们要在每行中选取一个非零数,并把这个数之后的数赋值为这个数。我们希望保持上面的性质4,即每列中,\([1,n]\)中每个自然数仍然至多出现一次。

  \(n\leq 200,m\leq 400\)

题解

  建立稳定婚姻问题的模型。

  把行看成男士,把数看成女士。每行喜欢出现靠左的数,每个数喜欢出现位置(这个数在这行中出现的位置)靠右的行。

  为什么这样一定合法?

  假设有这样的情况:

\[x:uuuuuuuuuuu\\
y:~~~~~u~~~~~~~~vvvvv
\]

  那么在第\(y\)行中,\(y\)会更喜欢\(u\)(因为比\(v\)出现位置靠左)。\(u\)也会更喜欢\(y\)(因为出现位置靠右),那么就不是一个合法解。

  其实比读入还快。

  时间复杂度:\(O(nm)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<utility>
  7. #include<queue>
  8. using namespace std;
  9. typedef long long ll;
  10. typedef unsigned long long ull;
  11. typedef pair<int,int> pii;
  12. void rd(int &s)
  13. {
  14. int c;
  15. while((c=getchar())<'0'||c>'9');
  16. s=c-'0';
  17. while((c=getchar())>='0'&&c<='9')
  18. s=s*10+c-'0';
  19. }
  20. int a[210][410];
  21. int n,m;
  22. int b[210][210];
  23. int now[210];
  24. int c[210][210];
  25. int d[210];
  26. queue<int> q;
  27. void solve()
  28. {
  29. // scanf("%d%d",&n,&m);
  30. rd(n);
  31. rd(m);
  32. int i,j;
  33. memset(now,0,sizeof now);
  34. for(i=1;i<=n;i++)
  35. for(j=1;j<=m;j++)
  36. {
  37. // scanf("%d",&a[i][j]);
  38. rd(a[i][j]);
  39. if(a[i][j])
  40. {
  41. b[i][++now[i]]=a[i][j];
  42. c[a[i][j]][i]=j;
  43. }
  44. }
  45. for(i=1;i<=n;i++)
  46. {
  47. q.push(i);
  48. now[i]=1;
  49. }
  50. memset(d,0,sizeof d);
  51. while(!q.empty())
  52. {
  53. int x=q.front();
  54. q.pop();
  55. int v=b[x][now[x]];
  56. if(d[v]&&c[v][x]<c[v][d[v]])
  57. {
  58. now[x]++;
  59. q.push(x);
  60. }
  61. else
  62. {
  63. if(d[v])
  64. q.push(d[v]);
  65. d[v]=x;
  66. }
  67. }
  68. for(i=1;i<=n;i++)
  69. printf("%d ",b[i][now[i]]);
  70. printf("\n");
  71. }
  72. int main()
  73. {
  74. freopen("d2t3.in","r",stdin);
  75. freopen("d2t3.out","w",stdout);
  76. int t;
  77. // scanf("%d",&t);
  78. rd(t);
  79. while(t--)
  80. solve();
  81. return 0;
  82. }

【BZOJ3816】【清华集训2014】矩阵变换 稳定婚姻问题的更多相关文章

  1. [BZOJ3816][清华集训2014]矩阵变换(稳定婚姻问题)

    3816: 矩阵变换 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 803  Solved: 578[Submit][Status][Discuss] ...

  2. UOJ.41.[清华集训2014]矩阵变换(稳定婚姻)

    题目链接 稳定婚姻问题:有n个男生n个女生,每个男/女生对每个女/男生有一个不同的喜爱程度.给每个人选择配偶. 若不存在 x,y未匹配,且x喜欢y胜过喜欢x当前的配偶,y喜欢x也胜过y当前的配偶 的完 ...

  3. bzoj 3816&&uoj #41. [清华集训2014]矩阵变换

    稳定婚姻问题: 有n个男生,n个女生,所有女生在每个男生眼里有个排名,反之一样. 将男生和女生两两配对,保证不会出现婚姻不稳定的问题. 即A-1,B-2 而A更喜欢2,2更喜欢A. 算法流程: 每次男 ...

  4. uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题

    [清华集训2014]矩阵变换 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...

  5. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  6. [清华集训2015 Day2]矩阵变换-[稳定婚姻模型]

    Description 给出一个N行M列的矩阵,保证满足以下性质: M>N. 矩阵中每个数都是 [0,N]中的自然数. 每行中, [1,N]中每个自然数刚好出现一次,其余的都是0. 每列中,[1 ...

  7. [UOJ 41]【清华集训2014】矩阵变换

    Description 给出一个 $N$ 行 $M$ 列的矩阵A, 保证满足以下性质: $M > N$. 矩阵中每个数都是 $[0, N]$ 中的自然数. 每行中, $[1, N]$ 中每个自然 ...

  8. UOJ#46. 【清华集训2014】玄学

    传送门 分析 清华集训真的不是人做的啊嘤嘤嘤 我们可以考虑按操作时间把每个操作存进线段树里 如果现在点x正好使一个整块区间的右端点则更新代表这个区间的点 我们不难发现一个区间会因为不同的操作被分成若干 ...

  9. 清华集训2014 sum

    清华集训2014sum 求\[∑_{i=1}^{n}(-1)^{⌊i√r⌋}\] 多组询问,\(n\leq 10^9,t\leq 10^4, r\leq 10^4\). 吼题解啊 具体已经讲得很详细了 ...

随机推荐

  1. 四、Input框改placeholder中字体的颜色

    Input框改placeholder中字体的颜色 input::-webkit-input-placeholder { color: #ccc; font-size: 12px; }

  2. python实现一个二分查找

    二分查找: 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列 查找过程: 首先,假设表中元素是 ...

  3. message:GDI+ 中发生一般性错误。

    图片类型的文件保存的时候出了问题,可能是路径出错,也可能是保存到的文件夹不存在导致(发布项目的时候如果文件夹是空的,文件夹将不存在)

  4. Jeecg-Boot Spring Boot

    Jeecg-Boot 1.0 发布,企业级快速开发平台 - 开源中国https://www.oschina.net/news/104889/jeecg-boot-1-0-released

  5. IntelliJ IDEA使用教程(非常全面)

    这个编辑器我就不再多做介绍了.直接开始新建maven hello world 的Java web项目啦 你电脑上得有jdk1.7,或者1.8,然后就是maven3.x吧,再有就是tomcat7以上吧. ...

  6. 从主机A得到id_rsa.pub文件,在主机B创建用户danny加入该文件,实现主机A免密登录主机B

    操作步骤: 1.主机A 生成公钥id_rsa.pub文件并导出该文件 root@mytest:~# ssh-keygen Generating public/private rsa key pair. ...

  7. GitHub & OAuth 2.0 & JWT

    GitHub & OAuth 2.0 & JWT https://www.rfcreader.com/#rfc6749 GitHub & OAuth https://www.b ...

  8. SpringJdbc框架

    import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; import JdbcUtils.Jdb ...

  9. Bootstrap之登陆页面范例

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta ...

  10. PDO访问Mysql数据库

    $dsn = 'mysql:host=127.0.0.1;dbname=myblog'; $username = 'root'; $pwd = '; $pdo = new PDO($dsn,$user ...