[题解] Codeforces 1720 E Misha and Paintings 结论
题目
算是诈骗题?
令一开始就存在的颜色数为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 结论的更多相关文章
- [题解] Codeforces 1268 D Invertation in Tournament 结论,兰道定理
题目 本题需要用到的结论: 一.兰道定理 二.如果\(n\geq4\),那么\(n\)个点的强连通竞赛图存在\(n-1\)个点的强连通子图. 证明: 现在有一个n-1个点的竞赛图(不一定强连通,称其为 ...
- Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】
题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...
- 【CodeForces - 501B 】Misha and Changing Handles(map)
Misha and Changing Handles CodeForces原题是英文,这里就直接上中文好了,翻译不是太给力,但是不影响做题 ^▽^ Description 神秘的三角洲里还有一个传说 ...
- 【codeforces 501D】Misha and Permutations Summation
[题目链接]:http://codeforces.com/problemset/problem/501/D [题意] 给你两个排列; 求出它们的字典序num1和num2; 然后让你求出第(num1+n ...
- [题解][Codeforces]Good Bye 2019 简要题解
构造题好评,虽然这把崩了 原题解 A 题意 二人游戏,一个人有 \(k_1\) 张牌,另一个人 \(k_2\) 张,满足 \(2\le k_1+k_2=n\le 100\),每张牌上有一个数,保证所有 ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Codeforces Round #549 (Div. 2) B. Nirvana
Codeforces Round #549 (Div. 2) B. Nirvana [题目描述] B. Nirvana time limit per test1 second memory limit ...
- 题解——CodeForces 438D The Child and Sequence
题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...
- 【Codeforces 501C】Misha and Forest
[链接] 我是链接,点我呀:) [题意] 给你一棵树 但是每个节点只告诉你出度个数 以及所有和它相连的点的异或和. 让你还原这棵树 [题解] 叶子节点的话,他所有节点的异或和就是它那唯一的一个爸爸 因 ...
随机推荐
- 2022.7.19 $\mathcal{S\,\,T\,L}$
\(STL\) 容器的共有特征:.begin() .end()//表示最后一个元素的后面那个位置 .size()//无符号整型 .swap(b) ::iterator//迭代器 关于迭代器 迭代器可以 ...
- 【学习笔记】带你从0开始学习 01Trie
01Trie Section 1:普通 Trie Section 1.1 什么是 Trie Trie 树,即字典树,是一种树形结构.典型应用是用于统计和排序大量的字符串前缀来减少查询时间,最大限度地减 ...
- AtCoder Beginner Contest 261E // 按位思考 + dp
题目链接:E - Many Operations (atcoder.jp) 题意: 给定一个数x,以及n个操作(ti,ai): 当 t = 1 时,将 x & a 当 t = 2 时,将 x ...
- websocket理解
简介 在实际开发中,可能会出现一个需求场景,要求网页的数据可以实时更新.在这种情况下,我们一般会采用轮询的方式,间隔性获取数据,即通过定时器间隔性请求相应接口获取数据,此方式由于是不断请求服务器,资源 ...
- 在Centos下对高并发web框架Tornado的性能进行测试
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_89 在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的 ...
- vue 将markdown字符串转html、修改主题、生成目录
前言 将 markdown 字符串转成 html 显示出来,同时把目录也提取出来一起显示.可以使用 marked 来读取 markdown 字符串解析成 html marked官网:https://m ...
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- ES6 Promise详解
前言 本文主要是对Promise本身的用法做一个全面解析而非它的原理实现,如果你对Promise的用法还不是很熟悉或者想加深你对Promise的理解,我相信这篇文章一定会帮到你. 首先让我们先了解一下 ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
- 【NOI P模拟赛】寻找道路(bfs,最短路)
题面 一道特殊的最短路题. 给一个 n n n 个点 m m m 条有向边的图,每条边上有数字 0 \tt0 0 或 1 \tt1 1 ,定义一个路径的长度为这个路径上依次经过的边上的数字拼在一起后在 ...