题意:对于一个序列,假如说一个区间内最多能包含 $k$ 个不同的数,那么这个序列最少会被划分成几个区间 $?$

输出 $k$ 为 $1\sim n$ 的答案.

我们每次选区间一定是贪心地将这个区间选地越大越好.

这道题有一个非常显然的主席树做法:从后向前扫,维护每一种数字出现最靠左位置,然后用主席树维护这些关键位置.

假设当前跳到点 $k$,那么如果要查 $k$ 能跳到的下一个点的话在线段树上二分即可.

由于 $k$ 是由 $1\sim n$ ,所以整个暴力跳的复杂度大概是 $O(10\times nlogn)$ 左右的.

还有一个整体二分的做法:

当 $k<=\sqrt n$ 时,可以直接暴力跳 $\sqrt n$ 次.

对于 $k>\sqrt n$ 时,会发现答案会随 $k$ 的增大而减小,而答案最多也只有 $\sqrt n$ 种.

可以考虑整体二分:

使用 $solve(l,r)$ 直到左端点和右端点答案相等位置.

#include <bits/stdc++.h>
#define N 100003
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int A[N],C[N],ans[N],n;
int solve(int x)
{
int cur=0,ans=0,ls=0,i,j,rt=0;
memset(C,0,sizeof(C));
for(i=1;i<=n;++i)
{
++C[A[i]];
if(C[A[i]]==1)
{
++rt;
}
if(rt>x)
{
--i;
for(j=ls;j<=i+1;++j) C[A[j]]--;
rt=0,ls=i+1,++ans;
}
}
++ans;
return ans;
}
void div_con(int l,int r)
{
int L=solve(l), R=solve(r);
if(L==R)
{
for(int j=l;j<=r;++j) ans[j]=L;
}
else
{
int mid=(l+r)>>1;
div_con(l,mid), div_con(mid+1,r);
}
}
int main()
{
int i,j;
// setIO("input");
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&A[i]);
for(i=1;i*i<=n;++i) ans[i]=solve(i);
div_con(i, n);
for(i=1;i<=n;++i) printf("%d ",ans[i]);
return 0;
}

  

CF786C Till I Collapse 整体二分+根号分治的更多相关文章

  1. 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings

    题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...

  2. CF786C Till I Collapse

    题目分析 首先,对于这道题,可以用贪心以一个\(O(n)\)的复杂度求解一个\(k\)的值 暴力是\(O(n^2)\)的复杂度,当然过不了. 我们手推一下样例,会发现,答案满足单调性,于是,果断想到二 ...

  3. [JZOJ6089]【CodeChef 2014 April Challenge】Final Battle of Chef【数据结构】【整体二分】

    Description \(n,q,V\leq 100000,w_i\leq 10^9\) Solution 又是一道大数据结构 由于有一个下取整,这就导致了不同时间的修改值是不能简单的直接加在一起的 ...

  4. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  5. Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]

    洛谷 Codeforces 根号分治真是妙啊. 思路 考虑对于单独的一个\(k\)如何计算答案. 与"赛道修建"非常相似,但那题要求边,这题要求点,所以更加简单. 在每一个点贪心地 ...

  6. CDQ分治与整体二分小结

    前言 这是一波强行总结. 下面是一波瞎比比. 这几天做了几道CDQ/整体二分,感觉自己做题速度好慢啊. 很多很显然的东西都看不出来 分治分不出来 打不出来 调不对 上午下午晚上的效率完全不一样啊. 完 ...

  7. CDQ分治与整体二分学习笔记

     CDQ分治部分 CDQ分治是用分治的方法解决一系列类似偏序问题的分治方法,一般可以用KD-tree.树套树或权值线段树代替. 三维偏序,是一种类似LIS的东西,但是LIS的关键字只有两个,数组下标和 ...

  8. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

  9. 一篇自己都看不懂的CDQ分治&整体二分学习笔记

    作为一个永不咕咕咕的博主,我来更笔记辣qaq CDQ分治 CDQ分治的思想还是比较简单的.它的基本流程是: \(1.\)将所有修改操作和查询操作按照时间顺序并在一起,形成一段序列.显然,会影响查询操作 ...

随机推荐

  1. 谈谈Python中pop与remove的用法

    remove() 函数用于移除列表中某个值的第一个匹配项. remove()方法语法:  list.remove(obj) 如果obj不在列表中会引发 ValueError 错误,通常先使用count ...

  2. c++学习---vector

    vector存放类型不同,{}有些区别-: vector的size的返回类型: push_back的使用: 要防止缓冲区溢出,使用范围for语句:

  3. CCF 201809-1 卖菜

    题目: 问题描述 在一条街上有n个卖菜的商店,按1至n的顺序排成一排,这些商店都卖一种蔬菜. 第一天,每个商店都自己定了一个价格.店主们希望自己的菜价和其他商店的一致,第二天,每一家商店都会根据他自己 ...

  4. 修改win7 iis上传文件大小限制200KB

    win7 iis 修改上传限制,需要修改2个地方: 1,“双击“Internet 信息服务(IIS)管理器”中的“ASP”– 打开“配置 ASP 应用程序的属性”–展开“限制属性”:修改“最大请求实体 ...

  5. sys.dm_exec_query_stats的total_worker_time的单位是微秒还是毫秒

    该视图sys.dm_exec_query_stats存放的就是当前所有执行计划的详细信息,比如某条执行计划共占CPU多少等等.因为该视图对编译次数.占用CPU资源总量.执行次数等都进行了详细的记录,所 ...

  6. angular 源码 <一> rotuerLinkActive

    这几篇,查看angular 源码. rotuerLinkActive 是路由的样式设置. 它的值是 css 的一个类.或者几个类. 主要代码如下 @Input() set routerLinkActi ...

  7. 全面聊聊JavaScript的浅拷贝和深拷贝

    一.背景      首先我们可以看下面这段简单的代码: var obj = {name:'程序猿',sex:'男'}; var arr = ['程序猿','程序媛']; var copyobj = o ...

  8. linux物理地址和虚拟地址定义

    线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层 如果启用了分页机制,那么线性地址可以再经过变换以产生一个物理地址:如果没有启用分页机制,那么线性地址直接就是物理地址 分 ...

  9. ASE19团队项目 beta阶段 model组 scrum1 记录

    本次会议于12月2日,18时30分在微软北京西二号楼sky garden召开,持续25分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...

  10. selenium重定向新窗口

    1.跳转新窗口 # 浏览器跳转新窗口后,selenium绑定新窗口 print('页面跳转后重新绑定selenium.') time.sleep(3) search_window = driver.c ...