【CF786C】Till I Collapse
时间:2021-07-12
本文章向大家介绍【CF786C】Till I Collapse,主要包括【CF786C】Till I Collapse使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目
题目链接:https://codeforces.com/problemset/problem/786/C
将 \(n\) 个数划分成 \(m\) 段使得每中不同数字的个数 \(\le k\)。对于每个 \(k\) 满足 \(1\le k\le n\) 分别求出最小的 \(m\)。
\(n\leq 10^5,1\leq a_i\leq n\)。
思路
显然每次贪心选择是最优的。由于总分段次数的上界是 \(\sum^{n}_{i=1}\frac{n}{i}=O(n\log n)\) 的,所以我们可以考虑每次找出分段的右边界。
假设上一次分段的位置是 \(p\),我们预处理出 \(pre[i]\) 表示位置 \(i\) 上的数字上一个和它相同的数字在哪里。那么我们只需要找到第 \(p+k+1\) 个满足 \(pre[i]\leq i\) 的数字位置,让 \(p\) 跳到这个位置减一即可。
采用主席树就可以轻松解决。时间复杂度 \(O(n\log^2 n)\)。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=100010,LG=18;
int n,a[N],pre[N],last[N],rt[N];
vector<int> pos[N];
struct SegTree
{
int tot,lc[N*LG*4],rc[N*LG*4],cnt[N*LG*4];
int update(int now,int x,int l,int r,int k)
{
if (!x || x==now) x=++tot,lc[x]=lc[now],rc[x]=rc[now],cnt[x]=cnt[now]+1;
else cnt[x]++;
if (l==r) return x;
int mid=(l+r)>>1;
if (k<=mid) lc[x]=update(lc[now],lc[x],l,mid,k);
else rc[x]=update(rc[now],rc[x],mid+1,r,k);
return x;
}
int query(int x,int l,int r,int k)
{
if (l==r) return l;
int mid=(l+r)>>1;
if (cnt[lc[x]]>=k) return query(lc[x],l,mid,k);
else return query(rc[x],mid+1,r,k-cnt[lc[x]]);
}
}seg;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
pre[i]=last[a[i]]; last[a[i]]=i;
pos[pre[i]].push_back(i);
}
pos[0].push_back(n+1);
for (int i=0;i<=n;i++)
{
for (int j=0;j<pos[i].size();j++)
rt[i]=seg.update(i?rt[i-1]:0,rt[i],1,n+1,pos[i][j]);
if (!rt[i]) rt[i]=rt[i-1];
}
for (int i=1;i<=n;i++)
{
int ans=0;
for (int j=0;j<n;ans++)
j=seg.query(rt[j],1,n+1,j+i+1)-1;
cout<<ans<<" ";
}
return 0;
}
原文地址:https://www.cnblogs.com/stoorz/p/15003457.html
- android 热修补之andfix实践
- ios 设置label的高度随着内容的变化而变化
- Android字体大小怎么自适应不同分辨率?
- iOS textfield实现一行的数字限制,超出进行弹框
- android https安全连接
- 第二章 正则表达式位置匹配攻略
- 从网络上下载省份城市名称并存入文件然后进行读取省份城市
- android 应用模式之mvp
- Android网络请求框架之Retrofit实践
- iOS 跳转到应用所在的App Store市场
- 第一章 正则表达式字符匹配攻略
- js最新手机号码、电话号码正则表达式
- iOS afnetworking最新版报错 没有AFHTTPRequestOperationManager类了
- Android Service学习之本地服务
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法