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~ ...
随机推荐
- mysql之join浅析
1.可以使用join吗?使用join有什么问题呢?-- >超过3个表不使用join,笛卡尔积问题 -->这些问题是怎么造成的呢? 如果可以使用 Index Nested-Loop Join ...
- Linux 易错小结
修改文件夹(递归修改)权限 chmod -R 777 /html Linux查看进程的4种方法 第一种: ps aux ps命令用于报告当前系统的进程状态.可以搭配kill指令随时中断.删除不必要的程 ...
- Docker的常用命令总结
一.普通指令 启动 Docker sudo systemctl start docker 停止 Docker sudo systemctl stop docker 普通重启 Docker sudo s ...
- SSO(单点登录)示例
此文为转载文章,出处:https://www.cnblogs.com/jpfss/p/9273680.html SSO在我们的应用中非常常见,例如我们在OA系统登录了,我们就可以直接进入采购系统,不需 ...
- java关键字volatile内存语义详细分析
volatile变量自身具有下列特性. 1.可见性.对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写 入. · 2.原子性:对任意单个volatile变量的读/ ...
- PowerDotNet平台化软件架构设计与实现系列(06):定时任务调度平台
定时任务是后端系统开发中少不了的一个基本必备技能. 传统的实现定时任务的方式有很多种,比如直接使用操作系统的Timer和TaskSchedule,或者基于Quartz.HangFire.xxl-job ...
- C# 温故知新 第二篇 C# 程序的通用结构
C# 程序由一个或多个文件组成. 每个文件均包含零个或多个命名空间. 一个命名空间包含类.结构.接口.枚举.委托等类型或其他命名空间. 以下示例是包含所有这些元素的 C# 程序主干. 主要包括 1. ...
- Jenkins构建通知
目录 一.简介 二.推送到gitlab 三.邮件通知 自带配置 Email Extension 四.钉钉通知 五.脚本钉钉通知 六.HTTP请求通知 一.简介 类似于监控报警,jenkins在配置持续 ...
- 试工具_ab
目录 一.简介 二.例子 三.参数 一.简介 ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的. 1.ab每次只能测试一个URL,适合做重复压力测 ...
- CSS 常用颜色代号
常用颜色代号一览表:http://www.divcss5.com/html/h636.shtml #000000 #2F0000 #600030 #460046 #28004D ...