当前位置: 首页 > news >正文

acd - 1427 - Nice Sequence(线段树)

题意:一个由n个数组成的序列(序列元素的范围是[0, n])。求最长前缀 j 。使得在这个前缀 j 中对于随意的数 i1 < i2。都满足随意的 m <= j。i1 在前 m 个数里出现的次数 >= i2 在前 m 个数里出现的次数 - k (1 ≤ n ≤ 200 000, 0 ≤ k ≤ 200 000)。

题目链接:http://acdream.info/problem?pid=1427

——>>第一个前缀 j 不满足。那么后面的前缀一定不满足(由于前缀 j 不满足)。

所以,从左往右扫描,每次取全部数字 i 的最少出现次数与当前扫描到的数出现的次数比較看是否满足条件就可以。

      全部数字 i 指的是哪些数字呢?是已经出现过的数吗?例子2说明不是。。是不大于当前出现过的最大整数吗?WA告诉我不是。

。而是 <= a[j] 的全部非负整数。

      全部数字 i 出现次数的最小值。我想到了RMQ和线段树,最后选了线段树来维护这个最小值。

#include <cstdio>
#include <cstring>
#include <algorithm>

#define lc (o << 1)
#define rc ((o << 1) | 1)

using std::min;
using std::max;

const int MAXN = 200000 + 10;
const int INF = 0x3f3f3f3f;

int n, k, Max;
int minv[MAXN << 2], cnt[MAXN];
int a[MAXN];

void Read()
{
    Max = -1;
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", a + i);
        ++a[i];
        if (a[i] > Max)
        {
            Max = a[i];
        }
    }
}

void Build(int o, int L, int R)
{
    minv[o] = 0;
    if (L == R) return;
    int M = (L + R) >> 1;
    Build(lc, L, M);
    Build(rc, M + 1, R);
}

void Update(int o, int L, int R, int q)
{
    if (L == R)
    {
        minv[o] = cnt[q];
        return;
    }
    int M = (L + R) >> 1;
    if (q <= M) Update(lc, L, M, q);
    else Update(rc, M + 1, R, q);
    minv[o] = min(minv[lc], minv[rc]);
}

int Query(int o, int L, int R, int ql, int qr)
{
    if (ql <= L && R <= qr)
    {
        return minv[o];
    }
    int ret = INF;
    int M = (L + R) >> 1;
    if (ql <= M) ret = min(ret, Query(lc, L, M, ql, qr));
    if (qr > M) ret= min(ret, Query(rc, M + 1, R, ql, qr));

    return ret;
}

void Solve()
{
    int i;

    memset(cnt, 0, sizeof(cnt));
    for (i = 1; i <= n; ++i)
    {
        ++cnt[a[i]];
        Update(1, 1, Max, a[i]);
        if (Query(1, 1, Max, 1, a[i]) < cnt[a[i]] - k) break;
    }
    printf("%d\n", i - 1);
}

int main()
{
    while (scanf("%d%d", &n, &k) == 2)
    {
        Read();
        Build(1, 1, Max);
        Solve();
    }

    return 0;
}


转载于:https://www.cnblogs.com/jzssuanfa/p/6806149.html

相关文章:

  • TCP协议设计原理
  • bzoj 4033: [HAOI2015]树上染色 [树形DP]
  • justgage.js的使用
  • requests模块
  • C#访问修饰符学习整理
  • 5.5下午
  • 『ORACLE』 创建表(11g)
  • javascript基础 方法
  • Objective-C语言精华概要
  • 【计划】2017年5月计划
  • Coder-Strike 2014 - Round 2
  • 线程的状态
  • jquery 实现考试倒计时
  • Android知识点textview加横线的属性
  • 配置链路聚合(端口聚合)
  • __proto__ 和 prototype的关系
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Apache Zeppelin在Apache Trafodion上的可视化
  • avalon2.2的VM生成过程
  • ESLint简单操作
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Javascript 原型链
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • markdown编辑器简评
  • MySQL的数据类型
  • Service Worker
  • session共享问题解决方案
  • SQLServer之创建显式事务
  • V4L2视频输入框架概述
  • 大型网站性能监测、分析与优化常见问题QA
  • 如何设计一个微型分布式架构?
  • 入手阿里云新服务器的部署NODE
  • 说说动画卡顿的解决方案
  • 项目实战-Api的解决方案
  • 一个项目push到多个远程Git仓库
  • 【云吞铺子】性能抖动剖析(二)
  • C# - 为值类型重定义相等性
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $refs 、$nextTic、动态组件、name的使用
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (第二周)效能测试
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .net framework4与其client profile版本的区别
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET学习教程二——.net基础定义+VS常用设置