原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ41.html

题解

首先写个乱搞:

一开始每一行都选择第一个非0元素,然后,我们对这个方案不断做更新,直到任意两行选择的值不同。更新方法:如果有两行选了相同的值,那么让靠前的那行选择后一个非0的值。

交上去。

过了。

wtf?

然后发现证明这个结论我花的时间远远大于AC这题QAQ

现在我们来证明一下:

首先,如果这个算法算出解了,那么肯定合法。这个比较显然就不证明了。

然后,我们来分两步证明一定有解。

接下来我们称让某一行找下一个非0元素这个操作为“弹出这一行的第一个元素”。

引理

  假设当前状态下,我们在所有行选择的元素构成的集合为 S ;设若干次更新更新后的集合为 S' ,那么一定有: $S\subseteq S'$ 。

  证明:每次至少有两个相同我们才让其中一个更新,所以这两行原先的值会被保留。所以满足这个引理。

接下来我们证明一个命题。

命题

  在得到答案之前,1~n 中至少有一种数没有被作为某一行的第一个元素“弹出”过。

  证明:如果任意两行选择的元素都不同,那么就得到方案了。在集合 S 中元素种类变成 n 的时刻,我们就得到了方案。设最后一次加入集合 S 的元素是 x ,那么在整个过程中, x 一定没有作为某一行的第一个元素被弹出过,所以命题得证。

因为在得到答案之前,1~n 中至少有一种数没有被作为某一行的第一个元素“弹出”过,而每一个元素在每一行都会出现一次。考虑那个没有被弹出过的元素,它保证了每一行都不会被弹光,所以一定有解,而且通过这个构造方法可以得到解。

代码

#pragma GCC optimize("Ofast","inline")
#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\
For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=405;
int T,n,m;
int a[N][N];
int p[N],id[N],cnt[N];
bool cmp(int a,int b){
return p[a]<p[b];
}
int Getnxt(int i,int &p){
while (!a[i][p]&&p<=m)
p++;
return p<=m;
}
void solve(){
n=read(),m=read();
clr(a),clr(p);
For(i,1,n)
For(j,1,m)
a[i][j]=read();
For(i,1,n)
Getnxt(i,p[i]=1);
while (1){
clr(cnt);
int flag=0;
For(i,1,n){
cnt[a[i][p[i]]]++,id[i]=i;
if (cnt[a[i][p[i]]]>1)
flag=1;
}
if (!flag)
break;
sort(id+1,id+n+1,cmp);
For(i,1,n)
if (cnt[a[id[i]][p[id[i]]]]>1){
if (!Getnxt(id[i],++p[id[i]])){
puts("\(^o^)/");
return;
}
break;
}
}
For(i,1,n)
printf("%d ",a[i][p[i]]);
puts("");
}
int main(){
T=read();
while (T--)
solve();
return 0;
}

  

UOJ#41. 【清华集训2014】矩阵变换 构造的更多相关文章

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

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

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

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

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

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

  4. uoj #46[清华集训2014]玄学

    uoj 因为询问是关于一段连续区间内的操作的,所以对操作构建线段树,这里每个点维护若干个不交的区间,每个区间\((l,r,a,b)\)表示区间\([l,r]\)内的数要变成\(ax+b\) 每次把新操 ...

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

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

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

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

  7. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  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. Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(动态规划.递推)

    传送门 题意: 给你一个包含 n 个元素的序列 a[]: 定义序列 a[] 的 beauty 为序列 a[] 的连续区间的加和最大值,如果全为负数,则 beauty = 0: 例如: a[] = {1 ...

  2. WebDriver下载地址

    http://chromedriver.storage.googleapis.com/index.html https://blog.csdn.net/ccggaag/article/details/ ...

  3. Airflow Comman Line 测试

    官网文档:https://incubator-airflow.readthedocs.io/en/latest/cli.html clear (1)clear 指定日期某一个dag下的任务,任务名可以 ...

  4. 爬虫框架Scrapy 之(一) --- scrapy初识

    Scrapy框架简介 scrapy是基于Twisted的一个第三方爬虫框架,许多功能已经被封装好,方便提取结构性的数据.其可以应用在数据挖掘,信息处理等方面.提供了许多的爬虫的基类,帮我们更简便使用爬 ...

  5. 题解 P1801 【黑匣子_NOI导刊2010提高(06)】

    蒟蒻来发题解了.我仔细看了一下其他题解,各位巨佬用了堆,红黑树,splay,treap之类的强大算法,表示蒟蒻的我只会口胡这些算法,所以我决定用一种极其易理解的算法————fhq treap,作为tr ...

  6. 20164305 徐广皓 Exp1+ 逆向进阶

    实验内容 Task1 (5-10分) 自己编写一个64位shellcode.参考shellcode指导. 自己编写一个有漏洞的64位C程序,功能类似我们实验1中的样例pwn1.使用自己编写的shell ...

  7. 【vue】组件使用Deferred特性

    延迟加载组件 defer的意思是"延迟",所以deferred对象的含义就是"延迟"到未来某个点再执行. <template> <div> ...

  8. tomcat 8.0安装ssl证书,及centos7.2 的openssl升级到最新版本,及ERR_SSL_OBSOLETE_CIPHER错误解决

    openssl官网https://www.openssl.org/source/下载最新的文件 2017-Feb-16 12:03:39 openssl-1.1.0e.tar.gz 安装的时候,可能由 ...

  9. 从koa-session源码解读session本质

    前言 Session,又称为"会话控制",存储特定用户会话所需的属性及配置信息.存于服务器,在整个用户会话中一直存在. 然而: session 到底是什么? session 是存在 ...

  10. C#实现在foreach中删除集合中的元素

    List<string> str = new List<string>(); str.Add( "zs"); str.Add("ls") ...