题目链接

点我跳转

题目大意

给定一个长度为 \(N\) 的序列 \(A\) 和一个常数 \(K\)

有 \(M\) 次询问

每次询问查询一个区间 \([L , R]\) 内所有数最少分成多少个连续段

使得每段的和都 \(<= K\) ,若无解则输出 "\(Chtholly\)"

解题思路

简单回忆一下倍增求 \(LCA\) 思想:

  • \(f[i][j]\) 表示以 \(i\) 为起点,往上跳 \(i + 2^j\) 步后得到的祖先
  • 因为往上跳 \(2^j\) 等价于先往上跳 \(2^{j - 1}\) 步后再往上跳 \(2^{j - 1}\) 步
  • 所以可得: \(f[i][j] = f[f[i][j - 1]][j - 1]\)

回到这道题:

暴力的做法即遍历区间 \([l,r]\) ,贪心的让每段的长度尽可能大

考虑用倍增思想优化:

定义 \(f[i][j]\) 表示:

以 \(i\) 为起点,分成 \(2 ^ j\) 个连续段后,所能到达的最远位置的下一个位置(其中每个段的和都不超过 \(K\))

那么不难得到: \(f[i][j] = f[f[i][j - 1]][j - 1]\)

然后对于询问 \(L , R\), \(j\) 从高位往低位枚举:

如果 \(f[L][j] > R\) 则表示从 \(L\) 开始划分出 \(2^j\) 个连续段是 \(OK\) 的

但是 \(2^j\) 连续段可能太多了(题目要求划分的连续段个数最少

所以就继续往下枚举

如果 \(f[L][j] < R\),则表示从 \(L\) 开始划分出 \(2^j\) 个连续段是不够的

那就先划分出 \(2^j\) 个连续段,然后再从 \(f[L][j]\) 的位置继续划分

即 \(ans += 1 << j\) ,\(L = f[L][j]\)

AC_Code

#include<bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10;

int f[N][22];

int n , m , k , a[N] , sum[N];

long long pre[N];

signed main()
{
cin >> n >> m >> k; for(int i = 1 ; i <= n ; i ++)
{
cin >> a[i] , pre[i] = pre[i - 1] + a[i]; sum[i] = sum[i - 1] + (a[i] > k);
}
for(int j = 0 ; j <= 21 ; j ++) f[n + 1][j] = n + 1; for(int j = 0 ; j <= 21 ; j ++)
{
for(int i = 1 ; i <= n ; i ++)
{
f[i][0] = upper_bound(pre + i , pre + 1 + n , k - a[i] + pre[i]) - pre; if(!j) continue ; f[i][j] = f[f[i][j - 1]][j - 1];
}
}
while(m --)
{
int l , r , ans = 0; cin >> l >> r; if(sum[r] - sum[l - 1])
{
cout << "Chtholly\n"; continue ;
}
for(int j = 21 ; j >= 0 ; j --)
{
if(f[l][j] - 1 < r)
{
ans += 1 << j; l = f[l][j];
}
}
cout << ans + 1 << '\n';
}
return 0;
}

牛客练习赛14B 区间的连续段的更多相关文章

  1. 牛客82-B:区间的连续段 (ST表,贪心)(WXK牛逼)

    题目描述 给你一个长为n的序列a和一个常数k 有m次询问,每次查询一个区间[l,r]内所有数最少分成多少个连续段,使得每段的和都 <= k 如果这一次查询无解,输出"Chtholly& ...

  2. 牛客练习赛14 B 区间的连续段 (倍增)

    链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...

  3. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  4. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  5. 牛客练习赛53 A 超越学姐爱字符串 (DP)

    牛客练习赛53 超越学姐爱字符串 链接:https://ac.nowcoder.com/acm/contest/1114/A来源:牛客网 超越学姐非常喜欢自己的名字,以至于英文字母她只喜欢" ...

  6. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  7. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  8. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  9. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

随机推荐

  1. Linux下安装mysql-5.7.28详细步骤

    一.下载Mysql 下载地址:https://downloads.mysql.com/archives/community/ 二.环境配置 检测系统是否自带Mysql # rmp -qa|grep m ...

  2. ElementUI使用总结

    首先声明,我这总结的官网都有,只是将自己使用时遇到的问题,重新记录一下,官网地址:https://element.eleme.cn/ 1.表格内指定行数给定不同样式(类似于隔行变色,也能叫指定行数不同 ...

  3. list.add(int index, E element)和list.addAll(list1)

    List.add(int index, E element): 在列表的指定位置插入指定元素(可选操作).将当前处于该位置的元素(如果有的话)和所有后续元素向右移动(在其索引中加 1). 参数:ind ...

  4. (嘎吧)--微软的 C# , IL,CLR, Cup 之间关系以及扩展联想

    还是啰嗦下:文章短并不代表文章质量不高.我最喜欢用干货性的以及总结性的语言 让大家明白文章要表达的内容.这一切,都是来自多年对.NET 的一些领悟以及一些理解. 不长篇大论,一本人也没时间,二本人也不 ...

  5. Virtual DOM 简直就是挥霍

    彻底澄清"Virtual DOM 飞快"的神话. 注意:原文发表于2018-12-27,随着框架不断演进,部分内容可能已不适用. 近年来,如果你有使用过 JavaScript 框架 ...

  6. 由endl对printf和cout的思考

    [前言]二者的区别就不介绍了.二者使用方法: printf("%s",a); cout<<a<<endl; endl的作用是什么? 一.endl作用 众所周 ...

  7. hive中更改表impala中不能生效

    hive中的更新或者新建表impala 不能实时更新 Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的meta ...

  8. Service Cloud 零基础(五)Trailhead学习 Embedded Chat

    本篇参考:https://trailhead.salesforce.com/content/learn/modules/web-chat 想一下我们为什么要用service cloud呢?为什么要有s ...

  9. python+unittest+ddt数据驱动进行接口自动化测试

    所谓数据驱动测试,简单的理解为数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据测试场景中,使用外部数据源实现对输入输出与期望值的参数化,避 ...

  10. Elastic App Search 快速构建 ES 应用

    公号:码农充电站pro 主页:https://codeshellme.github.io App Search 是 Elastic 家族中的一个产品,它可以帮助我们(基于 ES)快速高效的构建搜索应用 ...