【题目链接】 http://codeforces.com/contest/786/problem/C

【题目大意】

  给出一个数列,问对于不同的k,将区间划分为几个,
  每个区间出现不同元素个数不超过k时最少的区间划分数量。

【题解】

  我们可以用树状数组+扫描线求出一个区间不同元素的数量,
  我们记录每一个位置上下一个相同相同元素的位置,当扫描线扫过当前点时
  我们消除这个点的影响,并在其下个出现的位置进行更新,
  这样就能求出固定左端点不同右端点情况下不同区间内不同元素的数量,
  这个题我们可以用倍增找出对于每个k在扫描到的当前点,
  下一个满足限制条件的最远点在哪里,然后在那里保存下这个k,
  当扫描到那里的时候继续计算,查询的次数就是区间的数目。

【代码】

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1000100;
vector<int> f[N];
int n,m,a[N],c[N],pre[N],nxt[N],ans[N];
void add(int x,int val){while(x<=n+1)c[x]+=val,x+=x&-x;}
int find(int x){
int p=0;
for(int i=20;i>=0;i--){
if(p+(1<<i)<=n+1&&c[p+(1<<i)]<x){
x-=c[p+(1<<i)];
p+=(1<<i);
}
}return p+1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n+1;i++)pre[i]=n+1;
for(int i=n+1;i>=1;i--){
nxt[i]=pre[a[i]];
pre[a[i]]=i;
}
for(int i=1;i<=n+1;i++)add(pre[i],1),f[1].push_back(i);
for(int i=1;i<=n;i++){
int w=f[i].size();
for(int j=0;j<w;j++){
int d=f[i][j];
int pos=find(d+1);
ans[d]++;
f[pos].push_back(d);
}add(i,-1),add(nxt[i],1);
}for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');
return 0;
}

Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)的更多相关文章

  1. Codeforces 1197E Count The Rectangles(树状数组+扫描线)

    题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...

  2. Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)

    [题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...

  3. CodeForces 828E DNA Evolution(树状数组)题解

    题意:给你一个串k,进行两个操作: “1 a b”:把a位置的字母换成b “2 l r s”:求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s形成一个串ss,然后匹配ss和指定区间的 ...

  4. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  5. CodeForces - 597C Subsequences 【DP + 树状数组】

    题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...

  6. Codeforces 635D Factory Repairs【树状数组】

    又是看了很久的题目... 题目链接: http://codeforces.com/contest/635/problem/D 题意: 一家工厂生产维修之前每天生产b个,维修了k天之后每天生产a个,维修 ...

  7. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  8. codeforces E. DNA Evolution(树状数组)

    题目链接:http://codeforces.com/contest/828/problem/E 题解:就是开4个数组举一个例子. A[mod][res][i]表示到i位置膜mod余数是res的‘A’ ...

  9. Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]

    题目链接:https://codeforces.com/problemset/problem/567/D 题意: 在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 ...

随机推荐

  1. Angular白名单&&Angular拦截器 全局通用

    //angular 白名单全局通用 app.config([ '$compileProvider', function ($compileProvider) { $compileProvider.aH ...

  2. bzoj1814 Ural 1519 Formula 1(插头dp模板题)

    1814: Ural 1519 Formula 1 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 351[Submit][Sta ...

  3. 第九届蓝桥杯C/C++B组题解附代码

    1.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 125天 打开日历就ok 2. 标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库 ...

  4. Windows Server 2008 R2 Upgrade Paths

    https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/dd ...

  5. php spl库的使用(PHP标准库)【摘抄引用】

    文章来源与推荐阅读:阮一峰--PHP SPL笔记  &&  PHP SPL使用方法和他的威力 1.SPL 是什么? SPL:standard php library php标准库,此 ...

  6. javascript提示抖动实现方法

    css代码: <style type="text/css"> #div1{ width:200px; height:200px; background-color:or ...

  7. C++11 自动释放锁(转)

    原文转自 https://blog.csdn.net/lmb1612977696/article/details/77712170 c++11加入了很多新的特性,值得我们去探索. 先看一个例子:普通的 ...

  8. C/C++里的const(2)

    对于如下几个语句,哪些定义相同?哪些定义不同?哪些数据可修改?哪些数据不可修改呢? const int a; int const a; const int *a; int *const a; int ...

  9. linux驱动学习(二) Makefile高级【转】

    转自:http://blog.csdn.net/ghostyu/article/details/6866863 版权声明:本文为博主原创文章,未经博主允许不得转载. 在我前一篇写的[ linux驱动学 ...

  10. 一道面试题:C++相比C#或者java的优势到底在哪里

    被问到了这样一道面试题,当时就懵了,内心一直觉得C++肯定在很多方面要比C#或者java要牛b的. 但是真的不知道怎么回答. 问题是:你以前一直做得是.NET相关项目,现在为什么找C++开发相关工作呢 ...