jzoj6191-[NOI2019模拟2019.5.31]Exchange【线段树】

正题


题目大意

一个序列,给定若干个区间[l..r][l..r][l..r]
l∼rl\sim rlr任意一个位置出发,见到比手中大的数字就交换,到rrr求最小的交换次数
(注意,并不是真的交换)


解题思路

首先算出每个点的后继(在它后面第一个比他大的数)nextinext_inexti,然后由nextinext_inexti连接像iii的化就会变成一个森林。

我们可以发现两个性质

  1. 任意一个子树中的序号都是连续的
  2. 答案为只由l∼rl\sim rlr的区间内的节点构成的树深度最大的点

TTT为原来的森林

为了方便讲解我们建立一个新的森林叫做T′T'T,首先一个右指针kkk表示目前1∼k1\sim k1k的点都在T′T'T

我们将询问的有节点从小到大排序,然后每次将kkk移动到rrr,中途要加入点(加入一个点会导致T′T'T中改点在TTT中的·1子树所有深度加一)

然后询问l∼rl\sim rlr的最小深度就好了


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define Tsize(x) (t[x].r-t[x].l+1)
using namespace std;
const int N=2e6;
struct Tree_node{int l,r,w,lazy;
};
struct Q_node{int l,r,id;
}q[N];
struct Edge_node{int to,next;
}a[N];
int n,next[N],val[N],tot,m;
int ls[N],cnt,ans[N],begin[N];
struct Line_Cut_Tree{Tree_node t[N*4];void build(int x,int l,int r){t[x].l=l;t[x].r=r;if(l==r) return;int mid=(l+r)/2;build(x*2,l,mid);build(x*2+1,mid+1,r);}void downdata(int x){if(!t[x].lazy) return;t[x*2].w+=t[x].lazy;t[x*2+1].w+=t[x].lazy;t[x*2].lazy+=t[x].lazy;t[x*2+1].lazy+=t[x].lazy;t[x].lazy=0;}void change(int x,int l,int r){if(t[x].l==l&&t[x].r==r){t[x].lazy++;t[x].w++;return;}downdata(x);if(r<=t[x*2].r) change(x*2,l,r);else if(l>t[x*2].r) change(x*2+1,l,r);else change(x*2,l,t[x*2].r),change(x*2+1,t[x*2+1].l,r);t[x].w=max(t[x*2].w,t[x*2+1].w);}int ask(int x,int l,int r){if(t[x].l==l&&t[x].r==r)return t[x].w;downdata(x);if(r<=t[x*2].r) return ask(x*2,l,r);if(l>t[x*2].r) return ask(x*2+1,l,r);return max(ask(x*2,l,t[x*2].r),ask(x*2+1,t[x*2+1].l,r));t[x].w=max(t[x*2].w,t[x*2+1].w);}
}Tree;
bool cmp(Q_node x,Q_node y)
{return x.r<y.r;}
int main()
{//freopen("exchange.in","r",stdin);//freopen("exchange.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&val[i]);val[++n]=2147483647;for(int i=n-1;i>=1;i--){next[i]=i+1;while(val[i]>=val[next[i]])next[i]=next[next[i]];begin[i]=i;}begin[n]=n;for(int i=1;i<=n;i++)begin[next[i]]=min(begin[next[i]],begin[i]);for(int i=1;i<=n;i++)printf("%d ",next[i]);Tree.build(1,1,n);for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;sort(q+1,q+1+m,cmp);int right=0;for(int i=1;i<=m;i++){while(right<q[i].r)right++,Tree.change(1,begin[right],right);ans[q[i].id]=Tree.ask(1,q[i].l,q[i].r);}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试阿里挂了却拿到网易、点我达offer,一个三年经验Java程序员的面试总结

转载自 面试阿里挂了却拿到网易、点我达offer&#xff0c;一个三年经验Java程序员的面试总结 前言 15年毕业到现在有三年多了&#xff0c;最近去面试了阿里集团&#xff08;菜鸟网络&#xff0c;蚂蚁金服&#xff09;、网易、滴滴、点我达&#xff0c;最终收到点我达、网易o…

10-多对一左连接查询分步查询(查询所有订单及订单对应的客户)

左连接查询&#xff08;级联查询&#xff09; 回顾一下&#xff1a;左连接查询&#xff0c;将左边表(order)里的全部内容查出&#xff0c;右边表(customer)查满足条件的。 SELECT * FROM order AS o LEFT JOIN customer AS c on o.cust_id c.cust_id;1那么在 MyBatis 中如何…

入门干货之Grpc的.Net 封装-MagicOnion

0x01、Grpc1、介绍Google主导开发的RPC框架&#xff0c;使用HTTP/2协议并用ProtoBuf作为序列化工具&#xff0c;支持多种语言。在.NET Core “大更新” 之前&#xff0c;也就是目前来说还算是个很不错的选择。2、吐槽a、有很多性能比较的文章拿Grpc开涮.b、搭建困难&#xff0c…

欢乐纪中A组周六赛【2019.6.1】

前言 六一儿童节快乐(然而我还在学校) dalao都走了&#xff0c;导致只剩下我们这帮菜鸡在被虐 成绩 JJJ表示初中&#xff0c;HHH表示高中后面加的是几年级 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(J−2)ZYC(J-2)ZYC(J−2)ZYC1301301303030301001001000002…

11-分步查询懒加载

分步查询——懒加载模式 目录 懒加载模式示例不使用懒加载使用懒加载aggressiveLazyLoadinglazyLoadTriggerMethods所谓懒加载&#xff0c;也称延时加载&#xff0c;是指不一下子加载完全部资源。需要用到哪些资源才去加载这些资源&#xff0c;用不到的资源&#xff0c;就不去…

利用Service Fabric承载eShop On Containers

从模块化到微服务化从Pet Shop 到eShop on Container都是Microsoft在技术演进的路径上给开发者展示.Net的开发能力和架构能力的Sample工程&#xff0c;Petshop的时候更多的是展现应用的分层架构&#xff0c;设计的抽象与模块间的通讯。到了eShop on Container更多的关注在架构设…

2019阿里天猫团队Java高级工程师面试题之三轮面试

转载自 2019阿里天猫团队Java高级工程师面试题之三轮面试 作者&#xff1a;编程砖家 https://www.cnblogs.com/xiaoyangjia/p/10697324.html 一.第一面 1.五分钟自我介绍&#xff0c;说说自己的擅长及拿手的技术 自我介绍是为了考察面试者的语言表达和总结概括能力&#x…

P2680-运输计划【LCA,树上差分,二分答案】

正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树&#xff0c;给出若干条路径。选择一条边使其边权变为0&#xff0c;要求路径的长度的最大值最小。 解题思路 首先最大值最小我们可以想到二分答案&#xff0c;现在我们二分到midmidmid了…

12-多对一添加操作(添加新客户及对应的新订单)

多对一添加操作 场景&#xff1a;现在想要添加一个新客户对应一个新订单&#xff0c;那么要怎么来添加呢&#xff1f; 分析&#xff1a;由于添加订单时&#xff0c;客户对订单是一对多的关系&#xff0c;所以添加订单的时候必须要指明一位客户。 要同时添加新客户以及一个新订…

.NET Core+MySql+Nginx 容器化部署

1. 引言上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习&#xff0c;完成ASP.NET Core MySql Nginx的容器化部署。本文是基于CentOS 7.4环境进行演示&#xff0c;示例项目可以访问Docker.NetCore.MySql进行下载。2. Hello MySQL同样我们还是以循序…

HiveSQL常用优化方法全面总结

转载自 HiveSQL常用优化方法全面总结 Hive作为大数据领域常用的数据仓库组件&#xff0c;在平时设计和查询时要特别注意效率。影响Hive效率的几乎从不是数据量过大&#xff0c;而是数据倾斜、数据冗余、job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含对HiveQL语…

P3597-[POI2015]WYC【矩阵乘法,倍增】

前言 正题 题目链接:https://www.luogu.org/problemnew/show/P3597 题目大意 问第kkk长的路径长度(非简单路径) 解题思路 先考虑kkk比较小时的情况&#xff0c;我们可以求出长度为111的路径&#xff0c;长度为222的路径&#xff0c;然后以此类推找到第一个与前面的和到kkk就…

13-一对多左连接查询分步查询(查询所有客户及客户对应的订单)

查询所有客户以及对应的订单 目录 左连接查询&#xff08;不支持懒加载&#xff09;分步查询&#xff08;支持懒加载&#xff09;左连接查询&#xff08;不支持懒加载&#xff09; 场景&#xff1a;我们想要查询出所有的客户&#xff0c;并且把每个客户对应的订单也查出来。…

实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作

转载自 实战 | 利用Delta Lake使Spark SQL支持跨表CRUD操作 供稿 | eBay ADI-Carmel Team 作者 | 金澜涛 编辑 | 顾欣怡 本文7309字&#xff0c;预计阅读时间22分钟 导读 本文介绍eBay Carmel团队利用Delta Lake&#xff0c;使Spark SQL支持Teradata的Update/Delete语法。…

14-多对多关系建表

多对多关系建表 目录 多对多关系多对多关系建表原则domain多对多关系 一个老师可以教多个学生&#xff0c;一个学生可以被多个老师教。一个学生可以选择多门课程&#xff0c;一门课程可以被多个学生选择。一个用户可以选择多个角色&#xff0c;一个角色可以被多个用户选择。…

DevOps文档中心的技术实践演进

这应该算是《Git企业开发者教程》的篇外篇&#xff0c;介绍一下这个教程是怎样写出来的。相信每个技术人都有类似下面的文件夹&#xff0c;保存着你辛苦工作的成果。实际的感觉&#xff1a;看着闹心&#xff0c;弃之不舍。一份文档久经修改&#xff0c;不能定稿&#xff0c;循环…

CF7D-Palindrome Degree【字符串hash,dp】

正题 luogu链接:https://www.luogu.org/problemnew/show/CF7D 题目大意 定义kkk级回文串为一个字符串的(1,⌊n/2⌋)(1,\lfloor n/2 \rfloor)(1,⌊n/2⌋)和(n−⌊n/2⌋,n)(n-\lfloor n/2 \rfloor,n)(n−⌊n/2⌋,n)都是k−1k-1k−1级回文串。 求这个字符的所有前缀的回文串等级…

MySQL UPDATE 语句一个“经典”的坑

转载自 MySQL UPDATE 语句一个“经典”的坑 来源&#xff1a;ju.outofmemory.cn/entry/336774 有问题的SQL语句 why? 倒回去再重试验一把 最近好几次有开发同学在钉钉上问我&#xff0c;比如下图&#xff1a; 问题归纳起来就是&#xff1a;在MySQL里面update一条记录&…

jzoj4803-[NOIP2016提高A组模拟9.28]求导【模拟】

正题 题目大意 求一个标准多项式的求导 解题思路 暴力模拟即可&#xff0c;注意细节即可 一下是贴心的坑爹细节样例 (233x)−>(1)而不是(1)(233x)->(1)而不是(1)(233x)−>(1)而不是(1) (1)−>(0)而不是()(1)->(0)而不是()(1)−>(0)而不是() codecodecode …

g4e基础篇#1 为什么要使用版本控制系统

本篇是Git企业开发者教程基础篇的第一篇1. 基础篇&#xff1a;为什么要使用版本控制系统Git 分布式版本控制系统的优势Git 安装和设置初始化Git存储库(Repo)起步 1 – 创建分支和保存代码起步 2 – 了解Git历史记录起步 3 – 拉取请求 Pull Request 工作机制Git是一种版本控制系…