提交时间:2025-06-16 14:03:11

运行 ID: 38083

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define m_p make_pair #define p_b push_back using namespace std; typedef long long ll; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[605][605]; vector<pi>v[605*605]; int G[1205][605],deg[1205],mex[1205]; void slv(){ n=read(); up(i,1,n)up(j,1,n)a[i][j]=read(),v[a[i][j]].p_b(m_p(i,j)); int res=0; vector<pair<pi,int> >ans; up(i,1,n*n){ vector<int>R,C; for(auto it:v[i])R.p_b(it.p1),C.p_b(it.p2),mex[it.p1]=mex[it.p2]=0; sort(R.begin(),R.end()),R.erase(unique(R.begin(),R.end()),R.end()); sort(C.begin(),C.end()),C.erase(unique(C.begin(),C.end()),C.end()); for(int p:R)deg[p]=0,mex[p]=1; for(int p:C)deg[p+n]=0,mex[p+n]=1; int mxd=0; for(auto it:v[i])mxd=max(mxd,++deg[it.p1]),mxd=max(mxd,++deg[it.p2+n]); res=max(res,mxd); for(int p:R)memset(G[p],0,sizeof(int)*(mxd+5)); for(int p:C)memset(G[p+n],0,sizeof(int)*(mxd+5)); up(w,0,(int)v[i].size()-1){ auto it=v[i][w]; int x=it.p1,y=it.p2+n; mex[x]=1;while(G[x][mex[x]])mex[x]++; mex[y]=1;while(G[y][mex[y]])mex[y]++; if(mex[x]<mex[y])swap(x,y); int yy=y; int ban=mex[x],id=mex[y]; while(1){ if(!y)break; int to=G[y][ban]; swap(G[y][id],G[y][ban]); swap(id,ban),y=to; } G[x][mex[x]]=yy; G[yy][mex[x]]=x; } for(int p:R)up(j,2,mxd)if(G[p][j]){ ans.p_b(m_p(m_p(p,G[p][j]-n),j-1)); } } printf("%d %lu\n",res-1,ans.size()); for(auto it:ans)printf("%d %d %d\n",it.p1.p1,it.p1.p2,it.p2); } int main(){ //freopen("color.in","r",stdin),freopen("color.out","w",stdout); slv(); return 0; }