题目

算是诈骗题?

令一开始就存在的颜色数为cnt。k>=cnt的情况,显然每次找一个出现不止一次的颜色,然后把这个颜色的恰好一个方块替换成一种没有出现过的颜色就可以了,\(k-cnt\)次解决问题。先把这种特判掉。

然后再把k=1的情况也判掉,不然后面不好弄。

否则的话可以说明:最多需要2次操作。只要证明2次一定可以解决问题就可以了。

证明:

先找到最大的L,满足把整个网格左上角边长为L的正方形全染成\(a_{1,1}\)(下标从1开始)的颜色后,剩下的不同颜色数\(\geq k\)。如果这步操作做完后刚好有k种颜色,就直接完事了;否则,L不能继续增加是因为这个边长为L的正方形右边和下面的第一列如果也被覆盖,剩下颜色数会<k。我们第二次操作用一个右下角在\((L+1,L+1)\)的正方形,把区域内染成\(a_{1,1}\)的颜色。大小从1开始逐渐扩大,每次扩大都会使不同颜色数减少0或1或2。那么在第一次减少到\(\leq k\)时,只能是k或k-1。如果是k就完事,否则可以把这个正方形的颜色改成一种没有出现过的。如果第一次减少到\(\leq k\)时,边长已经达到\(L+1\)且是k-1,那么把第一次操作的正方形边长改成L+1,第二次再在第一次的正方形内部随便操作一次即可。

剩下就是判断是否能一次搞定了。先枚举操作的正方形的边长l,然后尝试算出每一个边长为l的正方形内部完整地覆盖了几种颜色。对于每种颜色,求出它出现的最上、最下、最左、最右的位置,则能完整覆盖这种颜色的边长为l的正方形的左上顶点在一个矩形内部,用差分做一个矩形加即可。

时间复杂度\(O(n^3)\)。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; int n,k,a[510][510],mnr[250010],mxr[250010],mnc[250010],mxc[250010],sum[510][510];
map <int,int> mp; int main()
{
rep(i,250005) mnr[i]=mnc[i]=1e9,mxr[i]=mxc[i]=-1e9;
cin>>n>>k;
rep(i,n) rep(j,n)
{
scanf("%d",&a[i][j]),mp[a[i][j]]=1;
mnr[a[i][j]]=min(mnr[a[i][j]],i);mxr[a[i][j]]=max(mxr[a[i][j]],i);
mnc[a[i][j]]=min(mnc[a[i][j]],j);mxc[a[i][j]]=max(mxc[a[i][j]],j);
}
if(k==1)
{
if(mp.size()==1) puts("0");
else puts("1");
return 0;
}
if(k>=mp.size())
{
cout<<k-mp.size()<<endl;
return 0;
}
repn(i,n-1)
{
rep(j,n+3) rep(p,n+3) sum[j][p]=0;
repn(j,n*n) if(mnr[j]<1e9)
{
pii most=mpr(mnr[j],mnc[j]),least=mpr(mxr[j]-i+1,mxc[j]-i+1);
least.fi=max(least.fi,0);least.se=max(least.se,0);
if(most.fi<least.fi||most.se<least.se) continue;
++sum[least.fi][least.se];++sum[most.fi+1][most.se+1];
--sum[most.fi+1][least.se];--sum[least.fi][most.se+1];
}
rep(j,n) rep(p,n) sum[j][p+1]+=sum[j][p];
rep(j,n) rep(p,n) sum[j+1][p]+=sum[j][p];
rep(j,n-i+1) rep(p,n-i+1)
{
int lft=mp.size()-sum[j][p];
if(lft==k-1||lft==k)
{
puts("1");
return 0;
}
}
}
puts("2");
return 0;
}

[题解] Codeforces 1720 E Misha and Paintings 结论的更多相关文章

  1. [题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理

    题目 本题需要用到的结论: 一.兰道定理 二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图. 证明: 现在有一个n-1个点的竞赛图(不一定强连通,称其为 ...

  2. Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...

  3. 【CodeForces - 501B 】Misha and Changing Handles(map)

    Misha and Changing Handles CodeForces原题是英文,这里就直接上中文好了,翻译不是太给力,但是不影响做题 ^▽^ Description  神秘的三角洲里还有一个传说 ...

  4. 【codeforces 501D】Misha and Permutations Summation

    [题目链接]:http://codeforces.com/problemset/problem/501/D [题意] 给你两个排列; 求出它们的字典序num1和num2; 然后让你求出第(num1+n ...

  5. [题解][Codeforces]Good Bye 2019 简要题解

    构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...

  6. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  7. [题解] Codeforces Round #549 (Div. 2) B. Nirvana

    Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...

  8. 题解——CodeForces 438D The Child and Sequence

    题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...

  9. 【Codeforces 501C】Misha and Forest

    [链接] 我是链接,点我呀:) [题意] 给你一棵树 但是每个节点只告诉你出度个数 以及所有和它相连的点的异或和. 让你还原这棵树 [题解] 叶子节点的话,他所有节点的异或和就是它那唯一的一个爸爸 因 ...

随机推荐

  1. scala WordCount案例

    数据样例: java,spark,hadoop,python,datax java,spark,hadoop,spark,python,datax java,spark,hadoop,python,d ...

  2. 同时安装py2和py3-安装多版本python

    遇到问题和需求 我的电脑环境:先安装py2再安装py3,平时我工作中是使用python2,如何保证两个版本共存且让代码来选择要使用的版本. 遇到问题 在cmd中输入python,进入的是py2的环境, ...

  3. md文档使用小技巧

    简介 在日常写readme文档中,可能会遇到一些小问题,此处记录一下md文档编写过程中的一些小技巧. 插入图片 在md文档中插入图片,目前有三种方式,本地导入.网络导入.base64导入. 本地导入 ...

  4. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...

  5. 黑马2022最新redis课程笔记知识点(面试用)持续更新

    redis入门 redis的常见五种数据类型 String类型 String类型,类似于java中的String类型,常见使用get,set方法. String类型还可以存储json字符串格式. Ha ...

  6. MySQL 的prepare使用中的bug解析过程

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 一.问题发现 二.问题调查过程 三.问题解决方案 四.问题总结 一.问题发现 在一次开发中使用 MySQL PREP ...

  7. Reactive UI -- 反应式编程UI框架入门学习(二)

    前文Reactive UI -- 反应式编程UI框架入门学习(一)  介绍了反应式编程的概念和跨平台ReactiveUI框架的简单应用. 本文通过一个简单的小应用更进一步学习ReactiveUI框架的 ...

  8. React报错之Functions are not valid as a React child

    正文从这开始~ 总览 产生"Functions are not valid as a React child. This may happen if you return a Compone ...

  9. SP6779 GSS7 - Can you answer these queries VII(线段树,树链剖分)

    水题,只是坑点多,\(tag\)为\(0\)时可能也要\(pushdown\),所以要\(bool\)标记是否需要.最后树链剖分询问时注意线段有向!!! #include <cstring> ...

  10. java学习第二天面向对象.day08

    this 在方法中表示调用当前方法的对象,this与主方法中对象类名调用是同理的,也是去指向堆中的地址. this可以解决成员变量和形参的问题 使用构造器还是setter方法 构造器:在创建对象的时侯 ...