首页 > 其他分享 >[AGC037D] Sorting a Grid 题解

[AGC037D] Sorting a Grid 题解

时间:2023-12-05 17:37:12浏览次数:37  
标签:ch int 题解 ln AGC037D Sorting read FF rec

题目链接

点击打开链接

题目解法

从后往前推一下,可以得到 \(C\) 一定要把每一行的数都归位到那一行,\(B\) 一定要每一列的目标行数互不相同
考虑构造 \(B\)
这个限制看起来略有些网络流,所以考虑如何建图
令 \(a_{i,j}\) 的目标行数为 \(ln_{i,j}\),我们由 \(i\to ln_{i,j}\) 连边

不难发现,问题变成了找 \(m\) 组完美匹配
这个问题有一个比较好的解法是:每次随便找一个完美匹配,然后删去边
考虑这样为什么对?根据 \(hall\) 定理,二分图不存在完美匹配的充要条件是存在子集 \(S\) 满足左部点 \(S\) 连到的右部点集合的大小 \(<|S|\)
设当前未匹配的列有 \(k\) 列,左部点集\(|S|\) 与右部点集 \(|T|\) 不合法,因为 \(|S|,|T|\) 之间有 \(k|S|\) 条边,所以 \(|T|\) 中必有点的度数 \(>k\),矛盾

可以直接跑 \(m\) 次匈牙利
时间复杂度 \(O(mn^3)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
template<typename T> void read(T &FF){
    FF=0;int RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    FF*=RR;
}
const int N=110;
int n,m,a[N][N],ln[N][N],b[N][N],c[N][N];
bool vis[N];
int match[N],G[N][N];
pii t[N];
bool find(int x){
    F(i,1,n) if(!vis[i]&&G[x][i]){
        vis[i]=1;
        if(!match[i]||find(match[i])){ match[i]=x;return true;}
    }
    return false;
}
vector<int> rec[N][N];
int main(){
    read(n),read(m);
    F(i,1,n) F(j,1,m) read(a[i][j]),ln[i][j]=(a[i][j]-1)/m+1;
    F(i,1,n) F(j,1,m) G[i][ln[i][j]]++,rec[i][ln[i][j]].pb(a[i][j]);
    F(j,1,m){
        ms(match,0);
        int res=0;
        F(i,1,n) ms(vis,0),res+=find(i);
        assert(res==n);
        F(i,1,n){
            int x=match[i];
            G[x][i]--,b[x][j]=rec[x][i].back();rec[x][i].pop_back();
        }
    }
    F(i,1,n){ F(j,1,m) printf("%d ",b[i][j]);puts("");}
    F(j,1,m){
        F(i,1,n) t[i]={(b[i][j]-1)/m+1,b[i][j]};
        sort(t+1,t+n+1);
        F(i,2,n) assert(t[i].first!=t[i-1].first);
        F(i,1,n) c[i][j]=t[i].second;
    }
    F(i,1,n){ F(j,1,m) printf("%d ",c[i][j]);puts("");}
    return 0;
}

标签:ch,int,题解,ln,AGC037D,Sorting,read,FF,rec
From: https://www.cnblogs.com/Farmer-djx/p/17877734.html

相关文章

  • [ABC254E] Small d and k 题解
    题目传送门一道暴力题。度数和\(k\)那么小?直接暴力\(n\)遍bfs,注意bfs的队列只能push距离不超过\(3\)的点。但有个问题,每次bfs都需要清空一次距离数组,这样子的时间复杂度是\(O(n^2)\)的。但也不难想到,距离数组中被赋值的地方不会很多,记录一下就行。Code#include......
  • RestTemplate 请求 webservice 中文乱码问题解决【问题解决】
    添加一个Converter设置UTF-8编码@ConfigurationpublicclassRestTemplateConfig{@BeanpublicRestTemplaterestTemplate(){RestTemplaterestTemplate=newRestTemplate();//添加自定义的ClientHttpRequestInterceptor全局JSON請......
  • [ARC141D] Non-divisible Set 题解
    题目链接点击打开链接题目解法很思维的题,需要用好所有的特殊性质暴力的做法是建出图,然后求包含点\(i\)的最长反链,但这明显过不了上面的做法没用到\(a_i<2m\)的性质如何用?把\(a_i\)拆分成\(q\times2^k\;(k\)为奇数\()\)的形式,那么对于同一个\(q\),只能在其中选一个......
  • [ARC141E] Sliding Edge on Torus 题解
    题目链接点击打开链接题目解法比较套路的题首先画个图,然后把\(y-x\)相同的变成一个点(使\(y>x\))然后再两个点之间连有权边那么问题就变成求新图的每个连通块中形成的原图的连通块数量手玩几个数据发现,原图的连通块数量即为新图的所有环长的\(\gcd\),再和\(n\)的\(\gcd......
  • [AGC061C] First Come First Serve 题解
    题目链接点击打开链接题目解法易知总情况数为\(2^n\)考虑重复计算的情况为:存在\([l_i,r_i]\),满足没有\([l_j,r_j](i\neqj)\)选在此区间中可以得到一个容斥的\(dp\)做法这个转移虽然感觉很显然,但卡了我一个晚上,一直调不出令\(f_i\)为到\(i\)的容斥情况下的权值和......
  • [CF1902] Educational Codeforces Round 159 A~E 题解
    [CF1902]EducationalCodeforcesRound159A~E题解A.BinaryImbalance很快观察到如果有不同的相邻元素,那么一定有解,意味着如果全是1无解,其他有解B.GettingPoints题面很长,可以发现,最好的偷懒方式一定是把所有的课都拖到最后几天上(真实),可以简单调整证明这样是不劣的,最后......
  • CF1833G Ksyusha and Chinchilla 题解
    题意:思路:当$n\not\equiv0\space(mod\space3)$时,无解;当$n\equiv0\space(mod\space3)$时,设$size_u$表示以$u$为根的子树还剩余的节点个数,自根节点向叶子节点递归,返回时进行处理节点$u$:设节点$u$的子节点为长度为$len$的序列$v$,设......
  • [ARC120E] 1D Party 题解
    提供二分+DP做法。Solution题意给出\(n(\le2\times10^5)\)个单调递增偶整数\(a_i\),求最小的\(k\)满足每一个\(i\)都可以在\(k\)时刻之前(含)与相邻的数相遇。每个单位时间可以移动一个单位距离。思路启发式思考在想到正解之前,我们可以想想类正解。显然,在时间一单......
  • CF1695C Zero Path 题解
    题意:思路:设$minv$表示路径最小权值和,$maxv$表示路径最大权值和。当且仅当路径长度$n+m-2\equiv0\space(mod\space2)$且$minv\le0\lemaxv$时,一定有权值和为$0$的路径;否则,一定没有权值和为$0$的路径。证明:由于只能向右或向下走,路径长度......
  • CF1163B2 Cat Party (Hard Edition) 题解
    题意:思路:对于满足条件的区间$[1,x]$,有如下三种情况:$1$.所有元素出现次数都为$1$;$2$.除了一个元素出现次数为$1$之外,其余元素出现次数都相等;$3$.除了一个出现次数比其他数的出现次数多$1$的元素之外,其余元素出现次数都相等。在线处理:设$cnt_i......