[题解] 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
[链接] 我是链接,点我呀:) [题意] 给你一棵树 但是每个节点只告诉你出度个数 以及所有和它相连的点的异或和. 让你还原这棵树 [题解] 叶子节点的话,他所有节点的异或和就是它那唯一的一个爸爸 因 ...
随机推荐
- maven exclusion 理解
结论:exclusion 表示对传递性依赖进行排除,排除后当前项目的依赖jar中,就不会包含该传递性依赖. 扩展:项目中的jar 都会在classpath下,排除后的传递性依赖,相当于在classpa ...
- YII类的映射表机制
<?php /** * Created by PhpStorm. * Date: 2016/5/25 * Time: 19:09 * * YII的类的映射表 */ namespace front ...
- Java中break、continue和return三者之间的区别
控制流程语句 java关键字break.continue.return主要按三个纬度去区分. 作用不同 结束不同 紧跟不同 一.作用不同 1.break:执行break操作,跳出所在的当前整个循环, ...
- 论文解读(PPNP)《Predict then Propagate: Graph Neural Networks meet Personalized PageRank》
论文信息 论文标题:Predict then Propagate: Graph Neural Networks meet Personalized PageRank论文作者:Johannes Gast ...
- Apache DolphinScheduler 1.3.8 发布
小伙伴们 Apache DolphinScheduler 1.3.8 发布 2021年9月7日,正式发布 在 1.3.8 版本中,我们在 Docker&k8s 这里做了许多优化,Docker ...
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- axios请求响应拦截器的应用
什么是axios拦截器? 一般在使用axios时,会用到拦截器的功能,一般分为两种:请求拦截器.响应拦截器. 请求拦截器在请求发送前进行必要操作处理 例如添加统一cookie.请求体加验证.设置请求头 ...
- 简易的DragDropCarousel 拖拽轮播控件
上一篇文章有写到 自动轮播的控件 简易的AutoPlayCarousel 轮播控件 - 黄高林 - 博客园 (cnblogs.com) 本章是基于自动轮播的一种衍生,通过拖拽鼠标进切换 直接上代码 ...
- Spire.Cloud 私有化部署教程(三) - Windows 系统
本教程主要介绍如何在 Windows 系统上实现 Spire.Cloud 私有化部署. 详细步骤如下: 一.安装依赖 我们的私有部署的依赖有 Nodejs.MySQL.Redis 和 RabbitMQ ...
- Job And Schedule (V8R6C4)
KingbaseES 数据库提供了 kdb_schedule 扩展,使得用户能通过类似oracle job 的方式进行job调用.kdb_schedule 提供了三个Schema :dbms_job ...