题目链接

点我跳转

题目大意

给定一个长度为 \(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. 学习String源码的部分方法

    先看构造器: private final char value[]; //char类型的数组 以下均会用到 private int hash; //缓存字符串的哈希值 //以下均会用到 public ...

  2. Linux安装与使用

    1.安装 1.1安装VMware 1.1.1VM12版本安装 1)下载:网盘:链接:https://pan.baidu.com/s/1Jnr--KIy3bSTvRhtB8nfiQ 提取码:czna 2 ...

  3. 500GJava/Hadoop/Spark/机器学习...视频教程免费分享 百度云持续更新

    参加工作这么长时间了,工作中遇到了不少技能都是看视频教程学习的,相比较看书而言看视频确实比较容易理解.分享一下自己看过的和收集的视频教程. 资源包括: 大数据方面的Hadoop(云帆,小象学院,八斗学 ...

  4. 007-变量的作用域和LED点阵

    变量 一.局部变量和全局变量 局部变量:函数内申明的变量,只在函数内有效. 全局变量:函数外部申明的变量.一个源程序文件有一个或者多个函数,全局变量对他们都起作用. 备注:全局变量有副作用,降低了函数 ...

  5. AJAX基本操作

    XMLHttpRequest对象: XMLHttpRequest 是 AJAX 的基础.所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject) ...

  6. Git 常用命令 和 安装

    这年头不会点git还真不能与别人进行代码交流 安装 windowns版下载:https://git-scm.com/download/win ,下载完成后就自己手动安装 ,很简单就不多说. Ubunt ...

  7. 比较String 字符串的字节大小

    package com.ittx.edi.erp;import java.io.File;import java.io.FileWriter;import java.io.IOException;pu ...

  8. Cookie实现记住密码、自动登录

    前端代码 <form id="form" action="xxx" method="post"> <div> < ...

  9. GitlabCI/CD&Kubernetes项目交付流水线实践

    GitlabCI实践 GitLabCI/CD基础概念 为什么要做CI/CD? GitLab CI/CD简介 GitLabCI VS Jenkins 安装部署GitLab服务 GitLabRunner实 ...

  10. 配置redis 4.0.11 集群

    配置redis 4.0.11 集群 准备redis 软件和redis配置文件 启动Redis服务 /data/soft/redis/src/redis-check-aof --fix /log/red ...