牛客82-B:区间的连续段 (ST表,贪心)(WXK牛逼)
题目描述
给你一个长为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牛逼)的更多相关文章
- 牛客练习赛14B 区间的连续段
题目链接 点我跳转 题目大意 给定一个长度为 \(N\) 的序列 \(A\) 和一个常数 \(K\) 有 \(M\) 次询问 每次询问查询一个区间 \([L , R]\) 内所有数最少分成多少个连续段 ...
- 区间的连续段~ST表(模板题)
链接:https://www.nowcoder.com/acm/contest/82/B来源:牛客网 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客练习赛14 B 区间的连续段 (倍增)
链接:https://ac.nowcoder.com/acm/contest/82/B来源:牛客网 区间的连续段 时间限制:C/C++ 7秒,其他语言14秒 空间限制:C/C++ 262144K,其他 ...
- HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]
一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...
- P2486 [SDOI2011]染色(树剖)区间覆盖+区间的连续段
https://www.luogu.org/problemnew/show/P2486 值的一看https://www.cnblogs.com/Tony-Double-Sky/p/9283262.ht ...
- 牛客练习赛16 A 字典序最大的子序列【贪心】
链接:https://www.nowcoder.com/acm/contest/84/A 来源:牛客网 [出处]:http://codeforces.com/contest/196/problem/A ...
- hdu 2871 Memory Control (区间合并 连续段的起始位置 点所属段的左右端点)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871 题意: 四种操作: 1.Reset 清空所有内存2.New x 分配一个大小为x的内存块返回,返 ...
- 牛客多校第八场 G Gemstones 栈/贪心
题意: 对于一个序列,把可以把连着三个相同的字母拿走,问最多拿走多少组. 题解: 直接模拟栈,三个栈顶元素相同则答案+1,并弹出栈 #include<bits/stdc++.h> usin ...
- [暴力+前缀和]2019牛客暑期多校训练营(第六场)Upgrading Technology
链接:https://ac.nowcoder.com/acm/contest/886/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
随机推荐
- 进入docker 内部
$ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash
- appium 弹窗处理
测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...
- TCP/IP学习笔记3--传输方式的分类
网络通信中有多中分类方法: )分组较短.出错几率降低,每次重发的数据量也降低,不仅提高了可靠性,也降低了时延.缺点:(1)因为数据进入交换节点后要经历存储转发这一过程,从而引起的转发时延(包含接受分组 ...
- 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 ...
- mybatisGenerator
mybatisGenerator,可以自定义生成的xml,dao接口文件名称,可以自动在生成的实体类上添加数据库字段的注释 项目结构: 在generatorConfig.xml配置好数据库和对应的表, ...
- Git手册(一):基本操作
Git小册 本手册参考自runoob及其他网络资源,仅用于学习交流 Git工作流程 一般工作流程 1.克隆 Git 资源作为工作目录. 2.在克隆的资源上添加或修改文件. 3.如果其他 ...
- Wing电信平台操作方法
Wing电信平台操作文档 当前文档编制于2019/9/3 一.登陆 登陆网址 https://www.ctwing.cn/ 点击右上角控制台 点击左侧栏点击产品中心 选择需要注册的产品 二.注册设备 ...
- Ali-Tomcat 安装
通过在 Eclipse 安装 Tomcat4e 插件,或者在 Intellij Idea 安装配置 Ali-tomcat,可以快 速方便地启动并调试基于 EDAS 服务化框架 HSF 开发的应用. 1 ...
- quartz2.3.0系列目录——带您由浅入深全面掌握quartz2.3.0
quartz2.3.0系列目录 官网下载地址:http://www.quartz-scheduler.org/downloads/ 本系列demo全部来源于官网,仅仅是简化和汉化了注释!一部分代码de ...
- Locust性能测试_百度案例
一.安装: 1.Locust在PyPI上可用,可以通过pip或easy_install安装:pip install locustio 2.查看Locust可用选项:loc ...