大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案.

考虑贪心, 对于某个k

从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全部划分完毕

由于每个划分大小至少为k, 故最多需要查询$\frac{n}{k}$次, 所以总共需要查询$O(nlogn)$次.

查询操作考虑用主席树实现.

对序列中每个点维护一棵线段树, 对于位置$x$的线段树, $[x,n]$的每个位置存它到点$x$的种类数, 非叶结点存儿子的最小值用来二分.

从大到小更新, 这样就相当于每次对[x,nxt[a[x]]-1]位置进行区间加, 可以用标记永久化来优化.

  1. #include <iostream>
  2. #include <cstdio>
  3. #define REP(i,a,n) for(int i=a;i<=n;++i)
  4. #define PER(i,a,n) for(int i=n;i>=a;--i)
  5. #define hr putchar(10)
  6. #define lc tr[o].l
  7. #define rc tr[o].r
  8. #define mid ((l+r)>>1)
  9. #define ls lc,l,mid
  10. #define rs rc,mid+1,r
  11. using namespace std;
  12. const int N = 1e5+10;
  13. int n, tot, a[N], nxt[N], T[N];
  14. struct {int l,r,v;} tr[N<<6];
  15.  
  16. void add(int &o, int l, int r, int ql, int qr) {
  17. tr[++tot] = tr[o], o = tot;
  18. if (ql<=l&&r<=qr) return ++tr[o].v,void();
  19. int tag = tr[o].v-min(tr[lc].v,tr[rc].v);
  20. if (mid>=ql) add(ls,ql,qr);
  21. if (mid<qr) add(rs,ql,qr);
  22. tr[o].v = tag+min(tr[lc].v,tr[rc].v);
  23. }
  24. int find(int o, int l, int r, int x, int k) {
  25. if (l==r) return l;
  26. k -= tr[o].v-min(tr[lc].v,tr[rc].v);
  27. if (mid<x) return find(rs,x,k);
  28. return tr[rc].v>k?find(ls,x,k):find(rs,x,k);
  29. }
  30. int solve(int k) {
  31. int ans = 0, now = 1;
  32. while (now<=n) {
  33. now = find(T[now],1,n,now,k)+1;
  34. ++ans;
  35. }
  36. return ans;
  37. }
  38. int main() {
  39. scanf("%d", &n);
  40. REP(i,1,n) scanf("%d", a+i);
  41. PER(i,1,n) {
  42. T[i] = T[i+1];
  43. add(T[i],1,n,i,nxt[a[i]]?nxt[a[i]]-1:n);
  44. nxt[a[i]] = i;
  45. }
  46. REP(i,1,n) printf("%d ", solve(i));hr;
  47. }

Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)的更多相关文章

  1. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  2. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  3. HDU 4348 To the moon(主席树区间修改)

    题意 给你一个区间,支持如下操作: 在一段区间内加上一个值,并生成一个历史版本 查询某个版本下一段区间内的和 回到一个历史版本上并舍弃之后的版本 做法 这就是主席树区间修改裸题啦QwQ 上一篇博客我讲 ...

  4. HDU 4348 主席树区间更新

    To the moon Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. 牛客多校第九场H Cutting Bamboos(主席树 区间比k小的个数)题解

    题意: 标记为\(1-n\)的竹子,\(q\)个询问,每次给出\(l,r,x,y\).要求为砍区间\(l,r\)的柱子,要求砍\(y\)次把所有竹子砍完,每次砍的时候选一个高度,把比他高的都砍下来,并 ...

  6. 【CF52C】Circular RMQ(线段树区间加减,区间最值)

    给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...

  7. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

  8. CodeForces - 840D:(主席树求出现区间出现次数大于某值的最小数)

    Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q que ...

  9. L - A Heap of Heaps CodeForces - 538F 主席树

    L - A Heap of Heaps CodeForces - 538F 这个是一个还比较裸的静态主席树. 这个题目的意思是把这个数组变成k叉树,然后问构成的树的子树小于等于它的父节点的对数有多少. ...

随机推荐

  1. awk、grep、sed

    awk.grep.sed是linux操作文本的三大利器,也是必须掌握的linux命令之一.三者的功能都是处理文本,但侧重点各不相同,其中属awk功能最强大,但也最复杂.grep更适合单纯的查找或匹配文 ...

  2. PyTricks-json dumps优雅的输出字典

    import json my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee} print(json.dumps(my_mapping, indent=4, so ...

  3. [转]SQL 读取表结构

    1.Sql SELECT column_name as FName,data_type as FType,CHARACTER_MAXIMUM_LENGTH as FLen from informati ...

  4. vue 自定义 提示框(Toast)组件

    1.自定义 提示框 组件 src / components / Toast / index.js /** * 自定义 提示框( Toast )组件 */ var Toast = {}; var sho ...

  5. linux里面源码安装imagemagick库

    在搞树莓派的时候想搞一下树莓派中摄像头获取图像之后传给安卓,安卓进行展示. 恰好用到了imagemagick这个库,我就像正常一样进行安装,sudo apt-get install Imagick 但 ...

  6. as 什么意思?

    You can denote particular console messages and variable values as having different types using four ...

  7. springboot整合redis(集群)

    一.加入maven依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. Qt编写数据可视化大屏界面电子看板7-窗体浮动

    一.前言 窗体浮动的场景也比较多,用途也比较大,比如视频监控模块,有时候需要调整大小和位置,而不是作为dock嵌入到布局中,一旦嵌入到布局中,大小和位置都被布局接管了,只能任由布局使唤,按在地上摩擦的 ...

  9. 依赖注入之AutoFac

    一 .IoC框架AutoFac简介 IoC即控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(De ...

  10. centos6.x一直停留在进度条的问题

    由于屏幕关闭加上长时间没有操作可能导致centos进行深度休眠,此时只能通过电源键来强制重启.可以通过修改X11的配置来禁止休眠,配置文件为/etc/X11/xorg.conf,注意修改此文件前记得备 ...