题目

算是诈骗题?

令一开始就存在的颜色数为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. Ubu18远程登录密匙设置

    Ubu18设置远程密匙登录 相关文件 /etc/ssh/sshd_config 注意vscode使用博客园插件需要进行端口转发,在vscode端口处设置41385 本地生成密匙,任选一种,这里只介绍第 ...

  2. 从零开始Blazor Server(6)--基于策略的权限验证

    写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...

  3. 张高兴的 .NET IoT 入门指南:(八)基于 GPS 的 NTP 时间同步服务器

    时间究竟是什么?这既可以是一个哲学问题,也可以是一个物理问题.古人对太阳进行观测,利用太阳的投影发明了日晷,定义了最初的时间.随着科技的发展,天文观测的精度也越来越准确,人们发现地球的自转并不是完全一 ...

  4. MultiSpehere类定义

    再等等,把这个定义完了,就到了我们展示代码环节了. 这个类是多个球体的碰撞检测的,其实就是单个球体的改装版本,基本一摸一样的. 类定义: #pragma once #ifndef __MULTISPH ...

  5. Linux 04 用户文件

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 完成用户管 ...

  6. MyBatis ognl.NoSuchPropertyException 或者 Invalid bound statement (not found)

    描述 SpringBoot + Mybatis-plus 项目,运行时出现如下错误: ognl.NoSuchPropertyException:没有对应属性异常 Invalid bound state ...

  7. DOM及DOM相关操作

    DOM 概述: DOM 全称(document object model)文档对象模型(文档指定为对应html文档),对应的DOM就是操作HTML文档的(增删改查) DOM结构 document 文档 ...

  8. 线程重用问题--ThreadLocal数据错乱

    前言 复现Java业务开发常见错误100例--1 项目完整代码:Github地址 知识点回顾: ThreadLocal的定义和使用: ThreadLocal概念以及使用场景 配置文件的读取: 获取配置 ...

  9. Python逆向爬虫之scrapy框架,非常详细

    爬虫系列目录 目录 Python逆向爬虫之scrapy框架,非常详细 一.爬虫入门 1.1 定义需求 1.2 需求分析 1.2.1 下载某个页面上所有的图片 1.2.2 分页 1.2.3 进行下载图片 ...

  10. 从零开始Blazor Server(14)--修改密码

    目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它. 首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate ...