C

题意:
就是给你一个数组。接下来他会进行 qqq 次询问,每次询问将 给出两个数字 lll 与 rrr ,要你把 [l,r][l, r][l,r] 区间划分为若干个片段[l1,r1],[l2,r2],…,[lk,rk]\left[l_{1}, r_{1}\right],\left[l_{2}, r_{2}\right], \ldots,\left[l_{k}, r_{k}\right][l1​,r1​],[l2​,r2​],…,[lk​,rk​] 。要求对于任意一个片 段 [li,ri],a[li]\left[l_{i}, r_{i}\right] , a\left[l_{i}\right][li​,ri​],a[li​] 为这个片段中的最大值。牛拉底鲁想要最小化片段的数量,因此对于每次询 问,请你回答出 kkk 的最小值。

思考:
很明显,想要分最少就是贪心往后走,再转化一下就是以a[l]为起点最长的上升序列就是k。但是每次都求一遍这个k肯定超时。然后我发现,可以用维护前缀和呀,就是从后往前走,这个点的sum就是右边第一个比他大的sum+1。然后每次查询的答案就是sum[l]-sum[r]+1。但是提交WA了,然后写了几个样例发现,对于数据1 2 10 1 2查询[1,4],如果这样做答案是3-2+1 = 2,实际上答案是3。也就是对于sum[l]不是减去sum[r],而是减去这段区间最大的第一个出现的数的位置idx。为什么呢,因为最大的数后面都可以被这个数给包起来,这样答案就不会出错了。所以线段树维护区间最值,然后set存每个值的下标。idx就是set[maxn]中第一个>=l的位置。

代码:

#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define db double
#define int long long
#define PII pair<int,int >
#define mem(a,b) memset(a,b,sizeof(a))
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define node_l node<<1
#define node_r node<<1|1using namespace std;
const int mod = 1e9+7,inf = 1e18;
const int N = 1e5+10,M = 2010;struct Node{int L,R;int maxn;
}t[4*N];int T,n,m,k;
int va[N];
int sum[N];
int tr[N],R = 1e5+5;vector<int > v;
set<int > s[N];void build(int node,int l,int r)
{t[node].L = l,t[node].R = r;if(l==r){t[node].maxn = va[l];return ;}int mid = (l+r)>>1;build(node_l,l,mid);build(node_r,mid+1,r);t[node].maxn = max(t[node_l].maxn,t[node_r].maxn);
}int query(int node,int l,int r)
{if(t[node].L>=l&&t[node].R<=r) return t[node].maxn;int mid = (t[node].L+t[node].R)>>1;if(r<=mid) return query(node_l,l,r);else if(l>mid) return query(node_r,l,r);else return max(query(node_l,l,mid),query(node_r,mid+1,r));
}int get(int x)
{return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}int bit(int x)
{return x&(-x);
}void update(int x,int value)
{while(x){tr[x] = min(tr[x],value);x -= bit(x);}
}int query(int x)
{int minn = inf;while(x<=R){minn = min(minn,tr[x]);x += bit(x);}return minn;
}signed main()
{IOS;cin>>n>>m;for(int i=0;i<=R;i++) tr[i] = inf;for(int i=1;i<=n;i++){cin>>va[i];v.pb(va[i]);}sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());for(int i=1;i<=n;i++){va[i] = get(va[i]);s[va[i]].insert(i);}build(1,1,n);for(int i=n;i>=1;i--){int idx = query(va[i]+1);if(idx==inf) sum[i] = 1;else sum[i] = sum[idx]+1;update(va[i],i);}while(m--){int a,b;cin>>a>>b;int maxn = query(1,a,b);auto idx = s[maxn].lower_bound(a);cout<<sum[a]-sum[*idx]+1<<"\n";}return 0;
}

总结:
多多思考呀,注意细节和思路的正确性。

牛客练习赛85-哲学家的沉思-(上升子序列变形+树状数组+线段树+离散化+set)相关推荐

  1. 牛客练习赛85 数学家的迷题 (带修莫队/线段树)

    题意: 1:将a[id]a[id]a[id]的值改为xxx. 2:令t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a[l+1]×...×a[r−1]×a[r]t=a[l]×a ...

  2. 牛客练习赛85 A~D题题解

    比赛链接:https://ac.nowcoder.com/acm/contest/11175 目录 A 科学家的模型 B 音乐家的曲调 C 哲学家的沉思 D 数学家的迷题 A 科学家的模型 模拟题,对 ...

  3. 【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)

    题干: 链接:https://ac.nowcoder.com/acm/contest/157/C 来源:牛客网 题目描述 PH试纸,是一种检测酸碱度的试纸,试纸红色为酸性,蓝色为碱性. HtBest有 ...

  4. 2019牛客多校第七场E Find the median 权值线段树+离散化

    Find the median 题目链接: https://ac.nowcoder.com/acm/contest/887/E 题目描述 Let median of some array be the ...

  5. 【Nowcoder】2021牛客暑假集训营(第七场): xay loves trees 双指针 + 线段树 + 尺取

    传送门 题意 给你两个树,求一个最大集合,要求集合内的任意两个点在第一个树上,比如是祖先关系,在第二棵树,不能存在祖先关系 分析 某人吐槽我的题解写的太简单了,然后我觉得...承认错误死不悔改 这道题 ...

  6. 牛客练习赛72-Abrz的杯子brz的雪糕

    时隔多日的做题题解 题目: Abrz的杯子 链接: Abrz的杯子 题目大意 给你 nnn 个杯子,和 111 ~ mmm 数字,要求你将数字填入 这nnn个杯子当中 满足一下这么几个要求 111 ~ ...

  7. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  8. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  9. 牛客练习赛34 E little w and Digital Root(数位dp)

    title: 牛客练习赛34 E little w and Digital Root(数位dp) date: 2018-12-17 22:38:37 tags: 数位dp categories:ACM ...

最新文章

  1. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 )
  2. eve模拟器华为镜像_EVE-NG简单入门介绍
  3. 四管前级怎么去掉高低音音调_一些歌曲音调太高怎么才能唱上去??
  4. 【转载】linux环境下tcpdump源代码分析
  5. Java 用栈实现队列
  6. mybatisplus 操作另一个数据库的数据_实例分析:python操作数据库项目
  7. defender 报备_微软Defender获AV-TEST杀软评测最高分
  8. 剑指offer——面试题11:数值的整数次方
  9. jquery基础研究学习【基础】
  10. 笔记 c语言99乘法表
  11. hive presto sql从身份证号提取年龄和性别
  12. 服务器系统访问量统计,通过网站统计或系统监视器查看IIS并发连接数
  13. 在 Node.js 中操作 Redis
  14. iOS开发,一个使用AVPlayer实现的播放在线音乐的Demo
  15. 对象存储Minio 客户端工具类,实现文件上传、图像压缩、图像添加水印
  16. 商显市场谁主沉浮 液晶拼接屏独占鳌头
  17. 标准证件照尺寸表,网页修改证件照尺寸的方法
  18. 2020.12.08 ps临摹作业含素材
  19. 基于虚拟用户的邮件系统配置
  20. 求一长方体的体积和表面积

热门文章

  1. python手机app开发_H5 手机 App 开发入门:技术篇
  2. [nRF51822] 1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO
  3. Word-embeding 【paper】
  4. python使用正则表达式代码_python如何使用正则表达式
  5. 用户、配额管理 、 云主机类型管理 、 镜像管理 、 网络管理 、 安全和实例管理 、 计算节点扩容案例
  6. 剑指 Offer 12-20
  7. SECS/GEM EAP 设备自动化功能原理和设计方案
  8. 1111111111111111111111111111
  9. 【Linux】Linux环境基础开发工具使用 —— yum | vim | gcc g++ | gdb | make makefile | 进度条 | git
  10. 解决awvs安装后访问不了登录页面