Codeforces Round #401 (Div. 1) C(set+树状数组)
题意: 给出一个序列,给出一个k,要求给出一个划分方案,使得连续区间内不同的数不超过k个,问划分的最少区间个数,输出时将k=1~n的答案都输出
比赛的时候想的有点偏,然后写了个nlog^2n的做法,T了
赛后发现有更加巧妙的做法
题解:
首先,可以贪心地想
也就是说从第一个数开始,每个区间都尽量往后选,直到不能选为止,可以证明这样是最优的
那么如果按照这个方案,实际上区间的选取都是固定的。
所以位置为i的数有可能是k=1,k=2....k=t的起点
如果当前位置是i,我们考虑如何更新答案
首先对答案有影响的只有在i右边的不同类别的第一个数,比如i右边有1 2 3 1 2,那么有影响的只有前3个数
所以考虑动态插入一个树状数组
也就是说当前位置是i,k=t,那么k=t的下一个区间的位置就是去找树状数组内的一个区间,内部有t个不同的数(树状数组也可以查询这个问题)
然后从1到n枚举区间的起点,过程中更新k=t的下一个位置,并在每个位置用vector存包含了k为若干值的情况
(可以证明vector最多存nlogn个点,n+n/2+n/3+....+n/n约等于nlogn)
可以使用一个数组next存下一个位置的情况,也可以使用set来维护这个位置信息。
代码如下
#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#define pb push_back
using namespace std;
const int maxn = 1e5 + ;
int c[maxn], ans[maxn], a[maxn];
set<int> S[maxn];
vector<int> L[maxn];
int n;
void Modify(int x, int s){
for(; x <= n; x += x&(-x)) c[x] += s;
}
int Find(int x){ //实际上只找x-1个数字
int p = ;
for(int i = ; i >= ; i--){
if(p + (<<i) <= n && c[p + (<<i)] < x) {
x -= c[p + (<<i)];
p += (<<i);
}
}
return p+;
} void gao(int i){
if(!S[i].empty()){
Modify(*S[i].begin(), );
S[i].erase(*S[i].begin());
}
} int main()
{
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", a+i), S[a[i]].insert(i);
for(int i = ; i <= n; i++){
L[].pb(i);
gao(i);
}
for(int i = ; i <= n; i++){
for(auto x : L[i]){
int y = Find(x+);
L[y].pb(x);
ans[x]++;
}
Modify(i, -);
gao(a[i]);
}
for(int i = ; i <= n; i++) printf("%d ", ans[i]);
}
Codeforces Round #401 (Div. 1) C(set+树状数组)的更多相关文章
- CF Educational Codeforces Round 10 D. Nested Segments 离散化+树状数组
题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...
- Educational Codeforces Round 10 D. Nested Segments 离线树状数组 离散化
D. Nested Segments 题目连接: http://www.codeforces.com/contest/652/problem/D Description You are given n ...
- Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】
任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...
- Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组
E. Zbazi in Zeydabad 题目连接: http://www.codeforces.com/contest/628/problem/D Description A tourist wan ...
- HDU5465/BestCoder Round #56 (div.2) 二维树状数组
Clarke and puzzle 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一个数c_{i, j}ci ...
- Codeforces Round #401 (Div. 2) 离翻身就差2分钟
Codeforces Round #401 (Div. 2) 很happy,现场榜很happy,完全将昨晚的不悦忘了.终判我校一片惨白,小董同学怒怼D\E,离AK就差一个C了,于是我AC了C题还剩35 ...
- Codeforces 703D Mishka and Interesting sum(树状数组+扫描线)
[题目链接] http://codeforces.com/contest/703/problem/D [题目大意] 给出一个数列以及m个询问,每个询问要求求出[L,R]区间内出现次数为偶数的数的异或和 ...
- CodeForces 380C Sereja and Brackets(扫描线+树状数组)
[题目链接] http://codeforces.com/problemset/problem/380/C [题目大意] 给出一个括号序列,求区间内左右括号匹配的个数. [题解] 我们发现对于每个右括 ...
- Codeforces 703D Mishka and Interesting sum 离线+树状数组
链接 Codeforces 703D Mishka and Interesting sum 题意 求区间内数字出现次数为偶数的数的异或和 思路 区间内直接异或的话得到的是出现次数为奇数的异或和,要得到 ...
随机推荐
- 关于api接口
前阵子一直疯狂的找关于php的api接口方面的资料来学习,总结了一下,无非就是请求数据,然后返回数据,当然也要设置相关安全措施,比如认证口令 等.返回数据格式是json 还是xml 看自己需求咯
- PHP入门笔记--基础语法二
一.函数 自定义函数 任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义. <?php function foo() { function bar() { echo &qu ...
- ctf题目writeup(3)
题目地址: https://www.ichunqiu.com/battalion 1. 这个是个mp3,给的校验是为了下载下来的. 下来之后丢进audicity中 放大后根据那个音块的宽度来确定是 . ...
- 新手学习ARM,对片内ram、SDRAM、NOR FLASH和NAND FLASH启动这几个概念的理解
片内的ram用来存储启动代码,在2440初始化sdram之前,代码就在片内ram中运行.片内ram装载的是norflash中的内容,即u-boot. uboot放在norflash里,nandflas ...
- React 省市区三级联动
省市区所对应的数据来自:http://www.zgguan.com/zsfx/jsjc/6541.html react中的代码是: export default class AddReceive ex ...
- 实现一个带有指纹加密功能的笔记本(Android)第一部分
自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.gree ...
- python--基本类型之字符串
String(字符串): 定义和创建字符串: 定义:字符串是一个有序的字符的集合,用于存储和表示基本的文本信息.注意:字符串的单引号和双引号都无法取消特殊字符的含义,如果想让引号内 var1='Hel ...
- .net core 新建一个web api 的步骤 初级
1.使用VS2017 选择 .net core web应用程序. 2.选择web api(空). 3.如果需要用iis express调试,则需要修改 program.cs. 4.在Controlle ...
- 获取单片机唯一id(stm32获取单片机唯一id)
stm32唯一id: 不同型号的stm32单片机,id不在同一地址上!具体地址可以通过用户手册中的Device electronic signature>Unique device ID reg ...
- Python的re模块的常用方法
一.re的match与search方法 1.re.match方法 re.match 尝试从字符串的起始位置匹配一个模式,匹配成功re.match方法返回一个匹配的对象,如果不是起始位置匹配成功的话,m ...