题目描述

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

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

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

输入描述:

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

输出描述:

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

输入

5 5 7
2 3 2 3 4
3 3
4 4
5 5
1 5
2 4

输出

1
1
1
2
2

sol:初看以为是线段树题,但是肯定会被卡。   我们用st表预处理,st[i][j]表示i点右移1<<j刀的最远距离。  和求LCA的道理一样,只要没到达边界,贪就完事了。

#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
ll a[maxn]; int st[maxn][],lg[maxn];
int main()
{
int N,M,K,L,R,pos,res;
scanf("%d%d%d",&N,&M,&K);
rep(i,,N) lg[i]=lg[i>>]+;
rep(i,,N) scanf("%lld",&a[i]);
rep(i,,N) a[i]+=a[i-];
rep(i,,) st[N+][i]=N+;
for(int i=N;i>=;i--){
pos=upper_bound(a+,a+N+,a[i-]+K)-a;
st[i][]=pos;
rep(j,,) st[i][j]=st[st[i][j-]][j-];
}
rep(i,,M){
scanf("%d%d",&L,&R);
pos=L; res=;
for(int j=lg[R-L+];j>=;j--) {
if(st[pos][j]<=R) pos=st[pos][j],res+=(<<j);
}
if(st[pos][]<=R) puts("Chtholly");
else printf("%d\n",res+);
}
return ;
}

来自WXK更加NB的做法,目前时间上RK1。

先不考虑K的限制:对于每个点L,我们找到右边界R,[L,R),连边L->R,表示从L出发,最多走到R-1,下一步的起点是R。 然后倒着建树,父亲唯一的,对应的是下一步。   得到dep,得到dfs序。  那么我们dep做差就能逼近答案。   (边--对应了区间划分)

dep做差的前提是我们选择的参照物一致,都是树根,但并非询问的L或者R,会导致答案可能多1,所以我们应该靠齐参照物L,那么我们还要找到L对应到dep[R]的那一层的祖先(这里保存了每一层的节点,利用dfs序找),看它的位置是否包括了R,不包括的话,答案-1。

(由于K的存在,实际操作的是一个森林。

(道理就是一个尺子,量长度,向下取整。 如果我以[0,1]作为起点,答案可能+1,可能是正确的,逼近了这个答案后去验证。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
using namespace std;
const int maxn=1e6+;
int a[maxn],dep[maxn],dfn[maxn],To[maxn];
int pre[maxn],tot; ll sum[maxn];
vector<int>G[maxn],C[maxn]; //G保存树,C保存每一层。
void dfs(int u,int f){
dep[u]=dep[f]+; dfn[u]=++tot; To[tot]=u;
C[dep[u]].push_back(tot);
for(int i=;i<G[u].size();i++) dfs(G[u][i],u);
}
int Ac(){
int N,Q,K,L,R;
scanf("%d%d%d",&N,&Q,&K);
rep(i,,N) scanf("%d",&a[i]); a[N+]=K+;
rep(i,,N+) pre[i]=pre[i-]+(a[i]>K), sum[i]=sum[i-]+a[i];
int now=N+;
for(int i=N;i>=;i--){
if(a[i]>K) { now=i; continue;}
int pos=upper_bound(sum+,sum+N+,sum[i-]+K)-sum;
pos=min(pos,now); G[pos].push_back(i);
}
for(int i=N+;i>=;i--) if(a[i]>K) dfs(i,i+);
while(Q--){
scanf("%d%d", &L, &R);
if(pre[R]-pre[L-]!=){
puts("Chtholly");
continue;
}
int res=dep[L]-dep[R]+;
int pos=upper_bound(C[dep[R]].begin(),C[dep[R]].end(),dfn[L])-C[dep[R]].begin();
if(To[C[dep[R]][pos-]]>R) res--;
printf("%d\n",res);
}
return ;
}
int main(){
Ac();
return ;
}

牛客82-B:区间的连续段 (ST表,贪心)(WXK牛逼)的更多相关文章

  1. 牛客练习赛14B 区间的连续段

    题目链接 点我跳转 题目大意 给定一个长度为 \(N\) 的序列 \(A\) 和一个常数 \(K\) 有 \(M\) 次询问 每次询问查询一个区间 \([L , R]\) 内所有数最少分成多少个连续段 ...

  2. 区间的连续段~ST表(模板题)

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

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

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

  4. HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]

    一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...

  5. P2486 [SDOI2011]染色(树剖)区间覆盖+区间的连续段

    https://www.luogu.org/problemnew/show/P2486 值的一看https://www.cnblogs.com/Tony-Double-Sky/p/9283262.ht ...

  6. 牛客练习赛16 A 字典序最大的子序列【贪心】

    链接:https://www.nowcoder.com/acm/contest/84/A 来源:牛客网 [出处]:http://codeforces.com/contest/196/problem/A ...

  7. hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset  清空所有内存2.New x  分配一个大小为x的内存块返回,返 ...

  8. 牛客多校第八场 G Gemstones 栈/贪心

    题意: 对于一个序列,把可以把连着三个相同的字母拿走,问最多拿走多少组. 题解: 直接模拟栈,三个栈顶元素相同则答案+1,并弹出栈 #include<bits/stdc++.h> usin ...

  9. [暴力+前缀和]2019牛客暑期多校训练营(第六场)Upgrading Technology

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

随机推荐

  1. 进入docker 内部

    $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash

  2. appium 弹窗处理

    测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...

  3. TCP/IP学习笔记3--传输方式的分类

    网络通信中有多中分类方法: )分组较短.出错几率降低,每次重发的数据量也降低,不仅提高了可靠性,也降低了时延.缺点:(1)因为数据进入交换节点后要经历存储转发这一过程,从而引起的转发时延(包含接受分组 ...

  4. Python2.7+virtualenv+CUDA 10.0版的pytorch v1.3.0 +运行人群计数crowdcount-mcnn网络

    Python2.7$ python2 -m virtualenv pytorchenv$ source pytorchenv/bin/activate $ pip install ipython py ...

  5. mybatisGenerator

    mybatisGenerator,可以自定义生成的xml,dao接口文件名称,可以自动在生成的实体类上添加数据库字段的注释 项目结构: 在generatorConfig.xml配置好数据库和对应的表, ...

  6. Git手册(一):基本操作

    Git小册 本手册参考自runoob及其他网络资源,仅用于学习交流 Git工作流程   一般工作流程   1.克隆 Git 资源作为工作目录.   2.在克隆的资源上添加或修改文件.   3.如果其他 ...

  7. Wing电信平台操作方法

    Wing电信平台操作文档 当前文档编制于2019/9/3 一.登陆 登陆网址 https://www.ctwing.cn/ 点击右上角控制台 点击左侧栏点击产品中心 选择需要注册的产品 二.注册设备 ...

  8. Ali-Tomcat 安装

    通过在 Eclipse 安装 Tomcat4e 插件,或者在 Intellij Idea 安装配置 Ali-tomcat,可以快 速方便地启动并调试基于 EDAS 服务化框架 HSF 开发的应用. 1 ...

  9. quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0

    quartz2.3.0系列目录 官网下载地址:http://www.quartz-scheduler.org/downloads/ 本系列demo全部来源于官网,仅仅是简化和汉化了注释!一部分代码de ...

  10. Locust性能测试_百度案例

    一.安装: 1.Locust在PyPI上可用,可以通过pip或easy_install安装:pip install locustio                2.查看Locust可用选项:loc ...