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)\)的复杂度,当然过不了. 我们手推一下样例,会发现,答案满足单调性,于是,果断想到二 ...
随机推荐
- [转载]WebService服务的三种途径Endpoint Disco WSDL 有什么不同
Endpoint: http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx web服务的URI地址,你访问之后,就会出现web服务的相 ...
- [转载]Oracle PL/SQL之LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Selenium 常用定位对象元素的方法
常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...
- 模拟ATM的功能
import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; import java.util.A ...
- APIClound 弹出层 Frame
JS api.openFrame({ name: 'showPic', url: './showPic.html', rect: { // x: api.pageParam.marginBottom, ...
- 有登陆认证的情况下如何使用Wisdom RESTClient?
访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...
- 模板(Template)系统
一.常用语法 官方文档 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 1.1变量 {{ 变量名 }} 变量名由字母数字和下划线组成. 点(.)在模板 ...
- Spring Boot 2 (四):使用 Docker 部署 Spring Boot
Spring Boot 2 (四):使用 Docker 部署 Spring Boot Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常 ...
- Windows死机的话,可能的一些猫病
一.由硬件引起的原因 [散热不良] 显示器.电源和CPU在工作中发热量非常大,因此保持良好的通风状况非常重要,如果显示器过热将会导致色彩.图象失真甚至缩短显示器寿命.工作时间太长也会导致电源或显示器散 ...
- Thinkphp5 分页带参数
原文链接:http://www.zhaisui.com/article/51.html