链接:https://ac.nowcoder.com/acm/contest/82/B
来源:牛客网

区间的连续段
时间限制:C/C++ 7秒,其他语言14秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

给你一个长为n的序列a和一个常数k

有m次询问,每次查询一个区间[l,r]内所有数最少分成多少个连续段,使得每段的和都 <= k

如果这一次查询无解,输出"Chtholly"

输入描述:

  1. 第一行三个数n,m,k
    第二行n个数表示这个序列a
    之后m行,每行给出两个数l r表示一次询问

输出描述:

  1. 输出m行,每行一个整数,表示答案
示例1

输入

复制

  1. 5 5 7
  2. 2 3 2 3 4
  3. 3 3
  4. 4 4
  5. 5 5
  6. 1 5
  7. 2 4

输出

复制

  1. 1
  2. 1
  3. 1
  4. 2
  5. 2

备注:

对于100%的数据,1 <= n , m <= 1000000 , 1 <= ai , k <= 1000000000

题意:

给你一个数组,和一个整数k,和q次询问,每一次询问给你一个l,r

问你最少把数组分成多少个连续部分,使每一个连续的sum和小于等于k。

思路:

2进制倍思想,

因为n<=1e6 所以我们倍增数组只需要开到 20  ,因为 1<<20 是1048576 >1e6

我们开倍增数组 st[i][j]  表示   第i个 数右移1<<j 到的最远的距离,

那么我们维护好这个信息后,对于每一个询问,我们只需要贪心的求解即可。

lg[i] 代表 log2(i)  可以证明 从 l到r,我们可以在 log2(r-l+1) ,log2(r-l),log2(r-l-1)...log2(1) 选择一些数加上到达。

那么我们只需要贪心的 让当前的pos 右移 log2(r-l+1) 远是否小于等于R,如果小于等于就移动,然后再更细(小)一步的移动。即可,最后判断是否移动到了R来决定输出什么即可。

细节见代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <iomanip>
  12. #define ALL(x) (x).begin(), (x).end()
  13. #define rt return
  14. #define dll(x) scanf("%I64d",&x)
  15. #define xll(x) printf("%I64d\n",x)
  16. #define sz(a) int(a.size())
  17. #define all(a) a.begin(), a.end()
  18. #define rep(i,x,n) for(int i=x;i<n;i++)
  19. #define repd(i,x,n) for(int i=x;i<=n;i++)
  20. #define pii pair<int,int>
  21. #define pll pair<long long ,long long>
  22. #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  23. #define MS0(X) memset((X), 0, sizeof((X)))
  24. #define MSC0(X) memset((X), '\0', sizeof((X)))
  25. #define pb push_back
  26. #define mp make_pair
  27. #define fi first
  28. #define se second
  29. #define eps 1e-6
  30. #define gg(x) getInt(&x)
  31. #define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
  32. using namespace std;
  33. typedef long long ll;
  34. ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
  35. ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
  36. ll powmod(ll a, ll b, ll MOD) {ll ans = ; while (b) {if (b % )ans = ans * a % MOD; a = a * a % MOD; b /= ;} return ans;}
  37. inline void getInt(int* p);
  38. const int maxn = ;
  39. const int inf = 0x3f3f3f3f;
  40. /*** TEMPLATE CODE * * STARTS HERE ***/
  41. ll n, m, k;
  42. ll a[maxn];
  43. ll lg[maxn];
  44. int st[maxn][];
  45.  
  46. int main()
  47. {
  48. //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
  49. //freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
  50. gbtb;
  51. cout << ( << ) << endl;
  52. cin >> n >> m >> k;
  53. repd(i, , n)
  54. {
  55. cin >> a[i];
  56. }
  57. repd(i, , n)
  58. {
  59. lg[i] = lg[i / ] + ;
  60. }
  61.  
  62. repd(i, , n)
  63. {
  64. a[i] += a[i - ];
  65. }
  66. int pos;
  67. repd(i, , )
  68. {
  69. st[n + ][i] = n + ;
  70. }
  71. for (int i = n; i >= ; i--)
  72. {
  73. pos = upper_bound(a + , a + + n, a[i - ] + k) - a;
  74. st[i][] = pos;
  75. repd(j, , )
  76. {
  77. st[i][j] = st[st[i][j - ]][j - ];
  78. }
  79. }
  80. int l, r;
  81. repd(t, , m)
  82. {
  83. cin >> l >> r;
  84. pos = l;
  85. int ans = ;
  86. for (int j = lg[r - l + ]; j >= ; j--)
  87. {
  88. if (st[pos][j] <= r)
  89. {
  90. pos = st[pos][j];
  91. ans += ( << j);
  92. }
  93. }
  94. if (st[pos][] <= r)
  95. {
  96. cout << "Chtholly" << endl;
  97. } else
  98. {
  99. cout << ans + << endl;
  100. }
  101. }
  102.  
  103. return ;
  104. }
  105.  
  106. inline void getInt(int* p) {
  107. char ch;
  108. do {
  109. ch = getchar();
  110. } while (ch == ' ' || ch == '\n');
  111. if (ch == '-') {
  112. *p = -(getchar() - '');
  113. while ((ch = getchar()) >= '' && ch <= '') {
  114. *p = *p * - ch + '';
  115. }
  116. }
  117. else {
  118. *p = ch - '';
  119. while ((ch = getchar()) >= '' && ch <= '') {
  120. *p = *p * + ch - '';
  121. }
  122. }
  123. }

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

  1. 牛客练习赛14 D 比较月亮大小 【水】

    链接:https://www.nowcoder.com/acm/contest/82/D 来源:牛客网 比较月亮大小 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其 ...

  2. 牛客练习赛14 D比较月亮大小 (实现)

    链接:https://ac.nowcoder.com/acm/contest/82/D来源:牛客网 题目描述 点点是一名出色的狼人.众所周知,狼人只有在满月之夜才会变成狼. 同时,月亮的大小随着时间变 ...

  3. 牛客练习赛14 E - 无向图中的最短距离 (bfs+bitset)

    一个链接:https://ac.nowcoder.com/acm/contest/82/E来源:牛客网 无向图中的最短距离 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144 ...

  4. 牛客练习赛14 A n的约数 (数论)

    链接:https://ac.nowcoder.com/acm/contest/82/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. ide破解

    https://blog.csdn.net/yangying496875002/article/details/73603303

  2. 在windows下使用Mingw搭建模拟Linux

    1.到官网下载最新版Mingw 2.点击安装,最好选择默认路径,如果不是的话,路径中一定不能有空格. 3.选择安装,mingw-developer-toolkit.mingw32-base.mingw ...

  3. mysql 批量删表

    Select CONCAT( 'drop table ', table_name, ';' ) FROM information_schema.tables Where table_name LIKE ...

  4. 2018.03.27 python pandas merge join 使用

    #2.16 合并 merge-join import numpy as np import pandas as pd df1 = pd.DataFrame({'key1':['k0','k1','k2 ...

  5. Linux下安装Elasticsearch6.5

    1.安装JDK8(Elastic 需要 Java 8 环境) 1)下载jdk8文件:http://www.oracle.com/technetwork/java/javase/downloads/jd ...

  6. Scratch少儿编程系列:(二)界面介绍及相关概念

    本系列后续所有Scratch的讲解均基于2.0版本介绍.系统启动后,界面如下: Scratch主要包括6个区域: 1. 菜单:新建.打开.保存 Scratch文件,2.0版本文件后缀名为 .sb2 2 ...

  7. IP子网的划分

    一.划分子网的具体步骤 已知192.168.1.0/24,划分8个子网(一个ip划分8个子网,即网络位不再是24位)1100 0000.1010 1000.0000 0001.0000 00001 . ...

  8. .net core 学习小结之 PostMan报415

    首先415的官方解释是:对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝. 也就是说我所准备的数据格式并不是后台代码使用的数据格式 后台代码如下 using ...

  9. C#获取当前路径7中方法

    //获取模块的完整路径. string path1 = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; //获取 ...

  10. [转帖]22款让Kubernetes锦上添花的开源工具

    22款让Kubernetes锦上添花的开源工具 http://soft.zhiding.cn/software_zone/2019/0506/3117650.shtml 找时间尝试一下. 至顶网软件频 ...