题解:CF1720E Misha and Paintings
更好的阅读体验
好题要点赞!
假设初始时矩阵中颜色总数为
\boldsymbol {m \le k}
这个时候我们要多染
\boldsymbol {m > k}
我们考虑一种神秘的构造。
我们以
接下来,我们以
记绿色正方形边长为
因此最终随着绿色区域的不断扩展,总的颜色种类数会达到
至此,我们说明了这种情形下最多
接下来考虑什么情况可以用一次操作解决。一次操作可以解决的情况,就是存在一个正方形,把只在这个正方形中出现的颜色扣掉后,总颜色种类数为
那么我们枚举正方形边长
那么这道题就做完了,复杂度
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 506
using namespace std;
inline void chkmax(int &x,int y){x=x<y?y:x;}
inline void chkmin(int &x,int y){x=x<y?x:y;}
int n,k,m,a[N][N],t[N*N],c[N][N];
int maxx[N*N],minx[N*N],maxy[N*N],miny[N*N];
void solve()
{
for(int i=1;i<=n*n;i++)
maxx[i]=maxy[i]=-1e15,minx[i]=miny[i]=1e15;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
chkmax(maxx[a[i][j]],i),chkmin(minx[a[i][j]],i);
chkmax(maxy[a[i][j]],j),chkmin(miny[a[i][j]],j);
}
for(int len=1;len<=n;len++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)c[i][j]=0;
for(int i=1;i<=n*n;i++)
{
if(maxx[i]<0||maxy[i]<0||minx[i]>n||miny[i]>n)continue;
int i1=max(1ll,maxx[i]-len+1),j1=max(1ll,maxy[i]-len+1);
int i2=min(n-len+1,minx[i]),j2=min(n-len+1,miny[i]);
if(i1<=i2&&j1<=j2)
c[i1][j1]++,c[i1][j2+1]--,c[i2+1][j1]--,c[i2+1][j2+1]++;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)c[i][j]+=c[i-1][j]+c[i][j-1]-c[i-1][j-1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)if(m-c[i][j]==k||m-c[i][j]==k-1)
return printf("1\n"),(void)0;
}
printf("2\n");
}
main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)scanf("%lld",&a[i][j]),m+=!t[a[i][j]]++;
if(m<=k)return printf("%lld\n",k-m),0;
return solve(),0;
}