正题

题目链接:https://www.luogu.com.cn/problem/CF786C


题目大意

给出一个长度为\(n\)的序列。

对于每个\(k\in[1,n]\)求将\(n\)分成最少的段使得每段的长度不同。

\(1\leq a_i\leq n\leq 10^5\)


解题思路

考虑对于一个\(k\)我们的做法显然就是直接暴力往后匹配能多晚分段就多晚分段。

然后考虑这题因为对于一个\(k\)答案的上界是\(\frac{n}{k}\)所以其实所有\(k\)的段数和是\(n\log n\)级别的。

所以我们可以所有的\(k\)一起做,用优先队列维护所有\(k\)的目前段结尾,然后每个数字记一下后面和他相等的第一个位置,在树状数组上倍增出需要的位置就好了。

时间复杂度\(O(n\log^2 n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
#define lowbit(x) (x&-x)
using namespace std;
const int N=1e5+10;
int n,a[N],c[N],nxt[N],t[N],f[N];
priority_queue<pair<int,int> > q;
void Change(int x,int val){
while(x<=n){
t[x]+=val;
x+=lowbit(x);
}
return;
}
int Ask(int k){
int ans=0,x=0;
for(int i=18;i>=0;i--)
if(x+(1<<i)<=n&&ans+t[x+(1<<i)]<=k)
x+=(1<<i),ans+=t[x];
return x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),c[i]=n+1;
for(int i=n;i>=1;i--)nxt[i]=c[a[i]],c[a[i]]=i;
for(int i=1;i<=n;i++)Change(c[i],1);
for(int i=1;i<=n;i++)q.push(mp(-1,i));
for(int i=1;i<=n;i++){
while(-q.top().first==i){
int k=q.top().second;q.pop();
f[k]++;q.push(mp(-Ask(k)-1,k));
}
Change(i,-1);Change(nxt[i],1);
}
for(int i=1;i<=n;i++)printf("%d ",f[i]);
return 0;
}

CF786C-Till I Collapse【树状数组倍增,优先队列】的更多相关文章

  1. 【bzoj2819】Nim DFS序+树状数组+倍增LCA

    题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  2. Luogu P4901 排队 fib数列+树状数组+倍增

    这题让我升华..还好只重构了一遍 首先我们发现:$n$较小时,整个队伍的形态 跟 $n$ 比较大时的局部是一样的 所以我们预处理出这个队伍的形态,和每一行每个位置的质因子个数的前缀和,$O(nlogn ...

  3. PAT1057 Stack(树状数组+倍增)

    目录 题目大意 题目分析 题目大意 要求维护一个栈,提供压栈.弹栈以及求栈内中位数的操作(当栈内元素\(n\)为偶数时,只是求第\(n/2\)个元素而非中间两数的平均值).最多操作100000次,压栈 ...

  4. 【BZOJ2819】Nim 树状数组+LCA

    [BZOJ2819]Nim Description 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可 ...

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

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

  6. BZOJ 2819: Nim dfs序维护树状数组,倍增

    1.随机选两个堆v,u,询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略,如果有,vfleaking将会考虑将这些石子堆作为初始局面之一,用来坑玩家.2.把堆v中的石子数变为k. 分析: ...

  7. cf983E NN Country (倍增+dfs序+树状数组)

    首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到 ...

  8. 【bzoj3488】[ONTAK2010]Highways DFS序+树上倍增+树状数组

    题目描述 一棵n个点的树,给定m条路径,q次询问包含一条路径的给定路径的个数+1 输入 The first line of input contains a single integer N(1< ...

  9. 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组

    题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...

随机推荐

  1. 在Activity和附贴的Fragment中同时使用多Surface错乱解决

    SurfaceView因为独特的双缓冲机制,在android应用中十分普遍,视频播放器.摄像机预览等都会用到,如果在两个Fragment或者一个Fragment和Activity同时使用都会造成无法正 ...

  2. uwp 的锁屏功能

    [UWP开发]自定义锁屏&桌面壁纸 mtobeiyf关注 2015.11.01 00:16:55字数 394阅读 1,249 调用通用的API来设置桌面壁纸,可以实现很多有趣的功能.在Wind ...

  3. [ASP.NET MVC]@Html.AntiForgeryToken() 防止CSRF攻击

    MVC Html.AntiForgeryToken() 防止CSRF攻击 MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request ...

  4. 【C#】 Stopwatch详解

    Stopwatch的命名空间是using System.Diagnostics; 1 namespace System.Diagnostics 2 { 3 // 4 // 摘要: 5 // 提供一组方 ...

  5. [SWMM]弗汝德数

    弗汝德数(Froude number)是流体内惯性力与重力的比值.弗汝德数(Fr)是水力学中重要的无量纲数之一,它表示过水断面上单位重量液体具有的平均动能与平均势能的比值,它也表示水流惯性力与重力的比 ...

  6. 将svn项目导出,再导入到其他工作空间

    方法一: 对于一致svn地址,本地没有的项目,直接eclipse中svn检出即可. 若本地有项目,但想导入到另一个工作空间(即拷贝一份,不想再从svn拉),则需要用export方法. 方法二(expo ...

  7. Servlet、ServletContext与ServletConfig的详解及区别

    Servlet.ServletContext与ServletConfig的详解及区别 一.Servlet详解 Servlet是一个interface,全局限定名:javax.servlet.Servl ...

  8. delta源码阅读

    阅读思路: 1.源码编译 2.功能如何使用 3.实现原理 4.源码阅读(通读+记录+分析) 源码结构 源码分析 元数据 位置:org.apache.spark.sql.delta.actions下的a ...

  9. C# - 音乐小闹钟_BetaV2.0

    时间:2017-11-21 作者:byzqy  介绍: 虽然上一版本基本实现了闹钟的功能,但是界面.功能.用户体验(简直谈不上体验^_^),以及众多的bug,所以升级,刻不容缓! 还是先看一下Beta ...

  10. 太空大战-GUI实现(1)

    1.复习GUI后,第一天实现的效果 2. 项目实现思路 基本的窗口界面实现就不讲了,源码都看得懂的,这里只说其中比较重要的几个功能的实现. 面板的绘制(所有图形的绘制) 首先,需要在GamePanel ...