Codeforces 786 C. Till I Collapse
题目链接:http://codeforces.com/contest/786/problem/C
大力膜了一发杜教的代码感觉十分的兹瓷啊!
我们知道如果$k$是给定的我们显然是可以直接一遍$O(n)$的贪心扫过去的,那么问题很显然的变成了支持一个数据结构,维护一段区间内不同数字的个数(事实上是固定左端点求最远的右端点使得这段区间内不同数字的个数小于等于$k$)。嗯,很可以,如果写过HH的项链的话你就有可能.....
HH的项链是有莫队做法和离线询问预处理$next$数组并用树状数组维护两种做法的,考虑如何转换第二种做法。(${next}$数组表示与第$i$个点颜色相同的在$i$之后的第一个点的位置)
这里离线询问显然是不现实的(不知道要询问哪一些区间),考虑我们不是要做$n$次么,每一次的询问都是不停的往右边跳,所以拿一根扫描线从左到右扫过去,对于每一个位置做以这个位置为左端点的询问,然后把这个询问丢到查询出来的右端点的右边那一个点上去,用一个树状数组维护每个颜色出现的位置,扫描线扫过一个点之后消除这个点所在位置的影响,增加这个点的$next$的点所在位置的影响。树状数组查询的时候利用它的性质倍增的查询,就不需要二分了。
一共有$n$次从左往右的跳跃,所以总跳跃的次数是${O(nlogn)}$的,树状数组利用倍增查询的复杂度是${O(logn)}$的,最后复杂度${O(nlog^{2}n)}$。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<map>
#include<cstring>
using namespace std;
#define maxn 1001000
#define TIMES 17
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,a[maxn],k,sum[maxn],c[maxn],xian[maxn],nextt[maxn],ans[maxn];
vector<llg>f[maxn]; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} llg lowbit(llg x) {return x&-x;} void add(llg x,llg val) {for (;x<=n+;x+=x&-x) c[x]+=val;} llg find (llg x)
{
llg pos=;
for (llg i=TIMES;i>=;i--)
{
if (pos+(<<i)<=n+ && c[pos+(<<i)]<x)
x-=c[pos+(<<i)],pos+=(<<i);
}
return pos+;
} int main()
{
yyj("E");
cin>>n;
for (llg i=;i<=n;i++) a[i]=getint();
for (llg i=;i<=n+;i++) xian[i]=n+;
for (llg i=n+;i>=;i--)
{
nextt[i]=xian[a[i]];
xian[a[i]]=i;
} for (llg i=;i<=n+;i++) add(xian[i],),f[].push_back(i);;
for (llg i=;i<=n;i++)
{
llg w=f[i].size();
for (llg j=;j<w;j++)
{
llg d=f[i][j];
llg wz=find(d+);
ans[d]++;
f[wz].push_back(d);
}
add(i,-),add(nextt[i],);
}
for (llg i=;i<=n;i++) printf("%d ",ans[i]);
return ;
}
Codeforces 786 C. Till I Collapse的更多相关文章
- Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
[题目链接] http://codeforces.com/contest/786/problem/C [题目大意] 给出一个数列,问对于不同的k,将区间划分为几个, 每个区间出现不同元素个数不超过k时 ...
- Codeforces 786C Till I Collapse
题意: 给出一个长度为n的序列,每个数值在1-n之间且为整数,现在要把这个序列划分为若干段,使得每一段的颜色种数不超过k,求最少的区间数目.对于从1到n的n种k的取值,分别输出这时的最少区间数目. 分 ...
- Codeforces 786C. Till I Collapse 主席树
题目大意: 给定一个长度为\(n\)的序列,要求将其划分为最少的若干段使得每段中不同的数字的种数不超过\(k\). 对于 \(k = 1 .. n\)输出所有的答案. \(n \leq 10^5\) ...
- Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)
大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全 ...
- Codeforces 786 B. Legacy
题目链接:http://codeforces.com/contest/786/problem/B 典型线段树优化连边,线段树上的每一个点表示这个区间的所有点,然后边数就被优化为了至多${nlogn}$ ...
- Codeforces 786 A. Berzerk
题目链接:http://codeforces.com/problemset/problem/786/A 这个题出做$DIV2$的$C$以及$DIV1$的A会不会难了一点啊... 做法和题解并不一样,只 ...
- CF786C Till I Collapse 整体二分+根号分治
题意:对于一个序列,假如说一个区间内最多能包含 $k$ 个不同的数,那么这个序列最少会被划分成几个区间 $?$ 输出 $k$ 为 $1\sim n$ 的答案. 我们每次选区间一定是贪心地将这个区间选地 ...
- [cf787E]Till I Collapse
考虑对询问分块,对于i<K的询问,暴力处理,时间复杂度为o(Kn):对于i>K的询问,发现答案都小于n/K且满足单调性,那么可以二分出每一段相同的答案,时间复杂度为$o(n^{2}log_ ...
- CF786C Till I Collapse
题目分析 首先,对于这道题,可以用贪心以一个\(O(n)\)的复杂度求解一个\(k\)的值 暴力是\(O(n^2)\)的复杂度,当然过不了. 我们手推一下样例,会发现,答案满足单调性,于是,果断想到二 ...
随机推荐
- Java开发学习教程之对象的创建与使用
java面向对象中的对象创建与使用.类是对象的抽象,为对象定义了属性和行为,但类本身既不带任何数据,也不存在于内存空间中.而对象是类的一个具体存在,既拥有独立的内存空间,也存在独特的属性和行为,属性还 ...
- nvidia-docker
参考资料 https://github.com/NVIDIA/nvidia-docker/wiki/Installation#prerequisites https://github.com/NVID ...
- sparkStrming 实时插入 mysql 今天使用echart 实现了简单数据展示 很low 但学习必须加深
- ATM开学测试(未完成)
package ATM_design; //信1705-2 20173456 张浩 import java.util.*; import java.io.File; import java.io.Fi ...
- Firefox创建firefoxprofile
我们自动化测试的时候,有时不需要图片加载出来,提高浏览器加载速度,从而提高脚本的执行速度.另外在一些网络比较差的环境下,禁用css.图片等加载可以提高访问速度 方法: 1.创建自己的firefoxpr ...
- ELK日志分析系统
部署环境 192.168.1.147 kibana.logstash.Escluster-node-1 192.168.1.151 filebeat.Escluster-node-2.nginx 软件 ...
- Golang闭包案例分析与普通函数对比
闭包案例 package main import ( "fmt" "strings" //记住一定引入strings包 ) //①编写一个函数makeSuffi ...
- Python3 离线安装TensorFlow包
Python3 离线安装TensorFlow包 1,下载包 官网地址:https://pypi.org/project/tensorflow/1.1.0rc2/#files 清华镜像:https:// ...
- eclipse maven Errors while generating javadoc on java8
With JDK 8, we are unable to get Javadoc unless your tool meets the standards of doclint. Some of it ...
- oracle基础——内存管理、优化
内存图解: 自动管理:11g:AMM 10g:ASMM SGA(system global area):由所有服务进程和后台进程共享 PGA(program global area): 由每个服务 ...