题意: 给出一个序列,给出一个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 + 5;
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 = 0;for(int i = 20; i >= 0; i--){if(p + (1<<i) <= n && c[p + (1<<i)] < x) {x -= c[p + (1<<i)];p += (1<<i);}}return p+1;
}void gao(int i){if(!S[i].empty()){Modify(*S[i].begin(), 1);S[i].erase(*S[i].begin());}
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++) scanf("%d", a+i), S[a[i]].insert(i);for(int i = 1; i <= n; i++){L[1].pb(i);gao(i);}for(int i = 1; i <= n; i++){for(auto x : L[i]){int y = Find(x+1);L[y].pb(x);ans[x]++;}Modify(i, -1);gao(a[i]);}for(int i = 1; i <= n; i++) printf("%d ", ans[i]);
}

转载于:https://www.cnblogs.com/Saurus/p/6610316.html

Codeforces Round #401 (Div. 1) C(set+树状数组)相关推荐

  1. CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

    CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段) 树状数组仅仅能实现线段树区间改动和区间查询的功能,能够取代不须要lazy tag的线段树.且 ...

  2. CodeForces - 641ELittle Artem and Time Machine——map+树状数组

    [题目描述] CodeForces - 641ELittle Artem and Time Machine [题目分析] 题目的意思大概是有三种操作 1.在时间t加入一个数字x 2.在时间t删除一个数 ...

  3. CodeForces 869E The Untended Antiquity 二维树状数组,随机hash

    CodeForces 869E 题意: n*m 的格子,有三种操作, 1.在一个矩形周围加一层障碍.2.把一个矩形周围的障碍去掉. 3.询问两个格子是否可达.     题目保证不会有矩形障碍交叉,且去 ...

  4. codeforces 869 E. The Untended Antiquity(树状数组)

    题目链接:http://codeforces.com/contest/869/problem/E 题解:这题是挺好想到solution的但是不太好写,由于题目的特殊要求每个矩形不会重贴所以只要这两个点 ...

  5. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  6. Codeforces数学1600----day1[同余定理,树状数组+两次二分,,组合计数]

    1.C. Kuroni and Impossible Calculation **知识点:同余定理 ** #include <iostream> #include <cstdio&g ...

  7. Codeforces #528 Div2 F (1087F) Rock-Paper-Scissors Champion 树状数组+set

    题意:n个人站成一排,初始时刻每个人手中都有一个图案,可能是石头,剪刀,布3个中的1种,之后会随机选取相邻的两个人玩石头剪刀布的游戏,输的人会离开(如果两个人图案相同,则随机选择一个人离开).执行(n ...

  8. Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表

    题目链接:http://codeforces.com/contest/777/problem/C C. Alyona and Spreadsheet time limit per test 1 sec ...

  9. Codeforces Round #401 (Div. 2) E. Hanoi Factory 栈

    E. Hanoi Factory 链接: http://codeforces.com/contest/777/problem/E 题解: 排序b从小到大,在b相同排序a从小到大,使其满足如果i-1不能 ...

最新文章

  1. 【iOS】通过NSURLProtocol提高Web加载速度
  2. knockout 学习笔记
  3. mfc作为服务端,android作为客服端进行socket通讯,android在wifi下手机与电脑的socket通信...
  4. Redis 数据结构 :SDS、链表、字典、跳表、整数集合、压缩列表
  5. 大牛书单 | 数据库专题好书分享
  6. decimal类型对象里面定义什么类型_奥斯塔罗 单身开启桃花雷达 现阶段的我适合什么类型的对象?...
  7. PJSIP学习笔记——PJSUA层发起呼叫的主要流程
  8. Asp.net 中 Eval 调用后台函数的写法
  9. 论文浅尝 | 基于知识图谱的智能调研方法(DI佳作)
  10. 如何使用Trie树,设计实践Google一样的输入提示功能
  11. 九、装配bean--通过properties文件注入值
  12. 域控服务器取消验证_AD域控
  13. 2018服务器 芯片组,2018最新主板知识详解,详谈DIY(主板篇)
  14. 学习Flask-SQLAlchmy管理数据库知识记录点
  15. java io装饰类,Java IO 装饰类新说
  16. xp电脑多少位怎么看_怎么看电脑是32位还是64位
  17. VS2010 C++环境下DLL和LIB文件目录及名称修改
  18. 在win7中chm打不开的方法
  19. 如何实现基于Electron的截图识字App(一)
  20. 循环群、对称群、陪集和拉格朗日定理、正规子群和商群

热门文章

  1. 来自Riot 的一份游戏美术教程(五):技术美术
  2. 开发笔记:掉落系统模块设计思路
  3. 寻路算法实例解析:贪吃蛇AI的实现
  4. 分分合合分分,谷歌医疗走向大败退
  5. ubuntu创建文件夹和删除文件
  6. Ajax工作流程(原生Ajax)
  7. ASP.NET Core微服务(二)——【ASP.NET Core Swagger配置】
  8. GoldenGate的ADD SCHEMATRANDATA命令研究
  9. ORACLE TEXT DATASTORE PREFERENCE(五)
  10. 小米11和小米10至尊版纪念版哪个好