Codeforces 786C Till I Collapse(树状数组+扫描线+倍增)
【题目链接】 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(树状数组+扫描线+倍增)的更多相关文章
- Codeforces 1197E Count The Rectangles(树状数组+扫描线)
题意: 给你n条平行于坐标轴的线,问你能组成多少个矩形,坐标绝对值均小于5000 保证线之间不会重合或者退化 思路: 从下到上扫描每一条纵坐标为y的水平的线,然后扫描所有竖直的线并标记与它相交的线,保 ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- CodeForces 828E DNA Evolution(树状数组)题解
题意:给你一个串k,进行两个操作: “1 a b”:把a位置的字母换成b “2 l r s”:求l到r有多少个字母和s匹配,匹配的条件是这样:从l开始无限循环s形成一个串ss,然后匹配ss和指定区间的 ...
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- CodeForces - 597C Subsequences 【DP + 树状数组】
题目链接 http://codeforces.com/problemset/problem/597/C 题意 给出一个n 一个 k 求 n 个数中 长度为k的上升子序列 有多少个 思路 刚开始就是想用 ...
- Codeforces 635D Factory Repairs【树状数组】
又是看了很久的题目... 题目链接: http://codeforces.com/contest/635/problem/D 题意: 一家工厂生产维修之前每天生产b个,维修了k天之后每天生产a个,维修 ...
- codeforces 570 D. Tree Requests 树状数组+dfs搜索序
链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...
- codeforces E. DNA Evolution(树状数组)
题目链接:http://codeforces.com/contest/828/problem/E 题解:就是开4个数组举一个例子. A[mod][res][i]表示到i位置膜mod余数是res的‘A’ ...
- Codeforces 567D - One-Dimensional Battle Ships - [树状数组+二分]
题目链接:https://codeforces.com/problemset/problem/567/D 题意: 在一个 $1 \times n$ 的网格上,初始摆放着 $k$ 只船,每只船的长度均为 ...
随机推荐
- bzoj4145 AMPPZ2014 The Prices 状压dp
这个题.......很可以,很小清晰......反正正经的东西我都没想到:重点在于——————我不会处理那个多出来的路费所以当时我就骚骚的弄了一颗树包状压其实这是一个类01背包的状压在每个状态用01背 ...
- HDU1054 Strategic Game(最小点覆盖)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Extend the size of ext3 partition online in VM
1. Increase disk space in vCenter 2. scan disk on the Linux VM # fdisk -lu > /tmp/fdisk. # > / ...
- 着色方案(bzoj 1079)
Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木 ...
- Things To Do Before NOI2017
TC div1 10套 数据结构 25题 网络流 10题 字符串 20题 数学 15题 图论 15题 计算几何 5题 提交答案 5题 嗯...先这些吧... 以上所有题目,博客都会有更新--- NOI ...
- codechef September Challenge 2017 Sereja and Commands
———————————————————————————— 这道题维护一下原序列的差分以及操作的差分就可以了 记得倒着差分操作 因为题目保证操作2的l r 小与当前位置 #include<cstd ...
- 汕头市队赛 yyl杯1 T1
A SRM 05 - YYL 杯 R1 背景 傻逼题 描述 给一个序列,序列里只有两种元素1和2.现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同.问有多少种方案数? 输入格式 多组数据 ...
- 【洛谷 P1337】[JSOI2004]平衡点 / 吊打XXX (模拟退火)
题目链接 正解就算了吧,谁叫我理生化 语数外 政史地都菜呢 模拟退火真玄学,不知道发生了什么就跑出答案了,原理就算了吧,能用(pianfen)就好. 当重物平衡时,势能一定是最小的,于是当我随机出一个 ...
- 填坑webpack
1.Concepts: webpack is a module bundler for modern JS applications. Since there are lots of complex ...
- Educational Codeforces Round 41 A B C D E
A. Tetris 题意 俄罗斯方块,问能得多少分. 思路 即求最小值 Code #include <bits/stdc++.h> #define F(i, a, b) for (int ...