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

news/2024/7/8 8:58:52

题意: 给出一个序列,给出一个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


http://www.niftyadmin.cn/n/3122532.html

相关文章

JSP是什么?

JSP是什么&#xff1f;sun公司制定的一种服务器端动态页面技术规范。JSP其实是一个以“jsp”为后缀的文件&#xff0c;该文件的内容主要是html和少量的java代码&#xff0c;容器会将jsp文件自动转换成一个servlet然后执行。如何写一个JSP文件&#xff1f;step1,创建一个以“.js…

python数据科学手册pdf微盘_适合新手的Python数据科学

对于做数据工作的新手&#xff0c;学习和使用一门编程语言&#xff0c;是基本的要求。你可以根据自己的实际情况&#xff0c;选择适合自己的编程语言。做数据工作的朋友&#xff0c;有的使用R语言(我的很多数据工作就是用R语言完成)&#xff0c;有的使用Python语言(我也是用Pyt…

Java To CSharp源代码转换

前言 开发环境 客户端&#xff1a;Unity3D开发(C#) 服务器&#xff1a;Java &#xff08;基于Java7&#xff09; 日 期&#xff1a;2016年09月 需求说明 部分服务器的部分逻辑功能在客户端实现一遍&#xff0c;可以简单的理解为服务器的部分逻辑代码搬到客户端来实现一遍。 想…

java的ArrayList(线性表)和LinkedList(双向链表)的深入学习

java的ArrayList和LinkedList的实现原理是完全不一样的&#xff0c;一个是用数组&#xff0c;而另一个则是用节点(Node)。 我们经常说&#xff0c;如果查询多&#xff0c;那就用ArrayList&#xff0c;而如果删除或者添加&#xff0c;那就用LinkedList。为什么要这样子&#xff…

完全数java

完全数&#xff1a;小于本身的所有因子的和&#xff08;包括1&#xff09; public class test01 {public static void main(String[] args) {Scanner scannernew Scanner(System.in);int nscanner.nextInt();for (int i2;i<n;i){int sum0;for (int j1;j<i;j)if (i%j0) su…

[Hihocoder] 字符串排序

题目 http://hihocoder.com/problemset/problem/1712 题解 https://www.zybuluo.com/wsndy-xx/note/1135606转载于:https://www.cnblogs.com/shandongs1/p/8992290.html

C#-WebForm-★★★JQuery知识——DOM操作★★★

例如&#xff1a; $("#btn1").attr( "disabled" , "disabled" ); 例如&#xff1a; $("#d1").css( "width" , "100px" );  设置宽度为100px 例如&#xff1a; 获取<input type"text" id"txt…

mysql-5.7.15-winx64配置

1. 配置环境变量 1.1 添加path路径 选择 控制面板>系统和安全>系统>高级系统设置>环境变量 mysql文件目录的绝对路径\bin 1.2 修改mysql default.ini 配置文件 2. 以管理员身份进入命令行cmd 进入mysql的bin目录下 3. mysqld --initialize-insecure &am…