题目分析

首先,对于这道题,可以用贪心以一个\(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的更多相关文章

  1. CF786C Till I Collapse 整体二分+根号分治

    题意:对于一个序列,假如说一个区间内最多能包含 $k$ 个不同的数,那么这个序列最少会被划分成几个区间 $?$ 输出 $k$ 为 $1\sim n$ 的答案. 我们每次选区间一定是贪心地将这个区间选地 ...

  2. Codeforces 786 C. Till I Collapse

    题目链接:http://codeforces.com/contest/786/problem/C 大力膜了一发杜教的代码感觉十分的兹瓷啊! 我们知道如果$k$是给定的我们显然是可以直接一遍$O(n)$ ...

  3. Codeforces 786C Till I Collapse

    题意: 给出一个长度为n的序列,每个数值在1-n之间且为整数,现在要把这个序列划分为若干段,使得每一段的颜色种数不超过k,求最少的区间数目.对于从1到n的n种k的取值,分别输出这时的最少区间数目. 分 ...

  4. Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)

    [题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...

  5. Codeforces 786C. Till I Collapse 主席树

    题目大意: 给定一个长度为\(n\)的序列,要求将其划分为最少的若干段使得每段中不同的数字的种数不超过\(k\). 对于 \(k = 1 .. n\)输出所有的答案. \(n \leq 10^5\) ...

  6. Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)

    大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全 ...

  7. [cf787E]Till I Collapse

    考虑对询问分块,对于i<K的询问,暴力处理,时间复杂度为o(Kn):对于i>K的询问,发现答案都小于n/K且满足单调性,那么可以二分出每一段相同的答案,时间复杂度为$o(n^{2}log_ ...

  8. [zt]给你的Mp4大换血,精选Touch里3年收集的900多首歌,"经典不忍去的""最新近流行的",与你共享~~

    如果你是音乐爱好者: 这些歌, 请戴上耳机, 调大音量, 一个人听 ,全世界 都是你的!!!!! (一)这些歌很温暖,没有金属味,适合有阳光的午后,很悠闲... [Anaesthesia]Maximi ...

  9. Codeforces Round #406 (Div. 1)

    B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...

随机推荐

  1. Does compiler create default constructor when we write our own?

    In C++, compiler by default creates default constructor for every class. But, if we define our own c ...

  2. Spring(4):Mybatis和Spring整合

    第一步:创建数据库 MySQL代码 1 CREATE DATABASE `mybatis` ; 2 3 USE `mybatis`; 4 5 CREATE TABLE `user` ( 6 `id` ...

  3. String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

    原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那 ...

  4. 减轻内存负担,在 pymysql 中使用 SSCursor 查询结果集较大的 SQL

    前言 默认情况下,使用 pymysql 查询数据使用的游标类是 Cursor,比如: import pymysql.cursors # 连接数据库 connection = pymysql.conne ...

  5. 查找与引用函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  6. Django把现在时间写入数据库,模板渲染在页面中

    1. 导入time模块 import time 2. 获取现在时间,使用"年-月-日 时:分:秒"这样的模板,赋值给变量 在views.py中: pt = time.strftim ...

  7. CF111A Petya and Inequiations 题解

    Content 请找出一个由 \(n\) 个正整数组成的数列 \(\{a_1,a_2,\dots,a_n\}\),满足以下两种条件: \(\sum\limits_{i=1}^na_i^2\geqsla ...

  8. Centos 配置服务器

    Centos 配置服务器 (配置服务器 除了Git Bash Here 还可以安装Xshell 网址:https://xshell.en.softonic.com/   Wincp 网址:https: ...

  9. Spring学习(三)几种集合属性的注入方式

    1.前言 众所周知.java中不只有八大简单类型.还有一些集合类型.本文围绕集合类型的注入做一个总结. 2.项目骨架 3.过程 1.创建实体类AllCollectionType package com ...

  10. 【九度OJ】题目1187:最小年龄的3个职工 解题报告

    [九度OJ]题目1187:最小年龄的3个职工 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1187 题目描述: 职工有职工号,姓名, ...