CF786C Till I Collapse
题目分析
首先,对于这道题,可以用贪心以一个\(O(n)\)的复杂度求解一个\(k\)的值
暴力是\(O(n^2)\)的复杂度,当然过不了。
我们手推一下样例,会发现,答案满足单调性,于是,果断想到二分。
再推一推性质,会发现,实际上,一个答案最多会出现\(\sqrt n\)次,于是,可以对答案分块,用二分枚举右边界,时间复杂度\(O(n\sqrt nlog(n))\),还是过不了。
但因为每一次一个答案最多会出现\(\sqrt n\)次,这就是块的最大长度。
于是,对于\(k\le\sqrt n\)的部分,可以暴力,最后,卡卡常就过了。
对于每一个数,可以记录出现的最大块,看是否在当前块出现,这样就避免了在算 \(k\)时多出一个清空数组的时间复杂度
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int tot[100005];
int size;
int check(int mid)
{
int now=1;
int cout=0;
for(int i=1;i<=n;i++)
{
if(tot[a[i]]!=now)
{
cout++;
tot[a[i]]=now;
}
if(cout>mid)
{
cout=1;
now++;
tot[a[i]]=now;
}
}
return now;
}
int main()
{
scanf("%d",&n);
size=sqrt(n*log2(n));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=size;i++)
{
int now=1;
int cout=0;
memset(tot,0,sizeof(tot));
for(int j=1;j<=n;j++)
{
if(tot[a[j]]!=now)
{
cout++;
tot[a[j]]=now;
}
if(cout>i)
{
cout=1;
now++;
tot[a[j]]=now;
}
}
printf("%d ",now);
}
int l=size+1;
int r;
while(l<=n)
{
int now=1;
int cout=0;
memset(tot,0,sizeof(tot));
for(int i=1;i<=n;i++)
{
if(tot[a[i]]!=now)
{
cout++;
tot[a[i]]=now;
}
if(cout>l)
{
cout=1;
now++;
tot[a[i]]=now;
}
}
int L=l;
int R=n;
while(L<=R)
{
int mid=(L+R)>>1;
memset(tot,0,sizeof(tot));
int tc=check(mid);
if(tc>=now)
{
L=mid+1;
r=mid;
}
else
{
R=mid-1;
}
}
for(int i=l;i<=r;i++)
{
printf("%d ",now);
}
l=r+1;
}
}
CF786C Till I Collapse的更多相关文章
- CF786C Till I Collapse 整体二分+根号分治
题意:对于一个序列,假如说一个区间内最多能包含 $k$ 个不同的数,那么这个序列最少会被划分成几个区间 $?$ 输出 $k$ 为 $1\sim n$ 的答案. 我们每次选区间一定是贪心地将这个区间选地 ...
- Codeforces 786 C. Till I Collapse
题目链接:http://codeforces.com/contest/786/problem/C 大力膜了一发杜教的代码感觉十分的兹瓷啊! 我们知道如果$k$是给定的我们显然是可以直接一遍$O(n)$ ...
- Codeforces 786C Till I Collapse
题意: 给出一个长度为n的序列,每个数值在1-n之间且为整数,现在要把这个序列划分为若干段,使得每一段的颜色种数不超过k,求最少的区间数目.对于从1到n的n种k的取值,分别输出这时的最少区间数目. 分 ...
- Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...
- Codeforces 786C. Till I Collapse 主席树
题目大意: 给定一个长度为\(n\)的序列,要求将其划分为最少的若干段使得每段中不同的数字的种数不超过\(k\). 对于 \(k = 1 .. n\)输出所有的答案. \(n \leq 10^5\) ...
- Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)
大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全 ...
- [cf787E]Till I Collapse
考虑对询问分块,对于i<K的询问,暴力处理,时间复杂度为o(Kn):对于i>K的询问,发现答案都小于n/K且满足单调性,那么可以二分出每一段相同的答案,时间复杂度为$o(n^{2}log_ ...
- [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,"经典不忍去的""最新近流行的",与你共享~~
如果你是音乐爱好者: 这些歌, 请戴上耳机, 调大音量, 一个人听 ,全世界 都是你的!!!!! (一)这些歌很温暖,没有金属味,适合有阳光的午后,很悠闲... [Anaesthesia]Maximi ...
- Codeforces Round #406 (Div. 1)
B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...
随机推荐
- Can a C++ class have an object of self type?
A class declaration can contain static object of self type,it can also have pointer to self type,but ...
- SpringBoot(1):初始SpringBoot
一. SpringBoot 简介 1. SpringBoot介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程.该框架使用了特 ...
- BigDecimal 计算注意事项
BigDecimal 在进行除法运算(divide)时一定要注意:如果被除数为变量,一定要指定精度 和 舍入模式,否则会报:Non-terminating decimal expansion; no ...
- GO类型转换
golang []byte转string golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ &quo ...
- 【Spring Framework】Spring入门教程(三)使用注解配置
本文主要介绍四个方面: (1) 注解版本IOC和DI (2) Spring纯注解 (3) Spring测试 (4) SpringJDBC - Spring对数据库的操作 使用注解配置Spring入门 ...
- 【Linux】【Services】【SaaS】Docker+kubernetes(5. 安装和配置ETCD集群)
1. 简介: 1.1. ETCD是kubernetes和openstack都用到的组件,需要首先装好 1.2. 官方网站:https://coreos.com/etcd/ 1.3. ETCD的作用: ...
- 开发中的PR和MR
GitLab的是Pull Request缩写.GitHub则是Merge Request也就是MR. 当项目下载后进行更改并提交,每次过程算一次PR,一般会加入管理员审核,通过才能合并到master主 ...
- Java应用日志如何与Jaeger的trace关联
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- CF1492B Card Deck 题解
Content 有 \(n\) 张纸牌组成的一个牌堆,每张纸牌都有一个价值 \(p_1,p_2,\dots,p_n\).每次选出最顶上的几个牌放到另外一个一开始为空的牌堆里面.定义一个牌堆的总值为 \ ...
- Go 的 golang.org/x/ 系列包和标准库包有什么区别?
在开发过程中可能会遇到这样的情况,有一些包是引入自不同地方的,比如: golang.org/x/net/html 和 net/html, golang.org/x/crypto 和 crypto. 那 ...