CF765F Souvenirs 解题报告

CF765F Souvenirs

题意翻译

给出\(n(2 \le n \le 10^5 )\) ,一个长为\(n\)的序列\(a(0 \le a_i \le 10^9 )\)

给出\(m(1\le m \le 2*10^5 )\),接下来\(m\)组询问。

每组询问给出一个\(l,r(1\le l < r\le n )\),代表询问最小的\(|a_i-a_j|\) 的值(\(l\le i <j\le r\)\(a_i\) 可以等于\(a_j\)


蒟蒻\(\tt{Dew}\)又双叒叕花大几个小时去弄懂这个题,而直到现在,我也只是明白了这个题为什么可以这么做,却不是太明白这种题如何去想。


首先可以看出这个题说不定可以莫队套平衡树卡过去,没什么别的想法还是写写吧,估计比暴力还是强一些的。

然后考虑一些思考的出发点,比如

  • 值域?二分值域?划分修改?
  • 移动询问的指针?
  • 把询问给线段树分治掉?
  • 单调性?

不妨先考虑一些简单的暴力,比如说,我们把询问按右指针排序,然后开始处理它们。

若当前处理到的位置为\(r\),我们对\(r\)前面的位置\(i\)维护答案数组\(ans_i\),代表区间\([i,r]\)的答案,每次移动右指针时,我们暴力更新每个位置的答案。

考虑修补这个暴力。

  • 发现询问\(ans_i\)也可以看做询问\(\min_{i\le k <r} ans_k\),这启发我们去区间查询,然后每次移动时不修改所有的值,选择线段树进行维护。
  • 具体的,在线段树上点代表的区间上,存下这个区间所有的\(a_i\),然后在这个区间上二分就能够更新这个区间的答案了。
  • 然后发现复杂度更高了,按道理有些值是不需要修改的,哪些值呢?
  • 发现\(ans_i\)数组是单调不升的。如果我们成功修改了位置靠右的某个值,并设当前的答案为\(mi\)(注意这个是包含原本节点的答案的最小值),那么在一个某个在\(Ta\)左边的节点上贡献的答案不如\(mi\)时,我们就没有必要进入这个节点的子节点了。
  • 这样做的复杂度单次操作是\(\log n \log Maxa_i\)的,原因其实很简单,每次成功贡献答案后答案必定减半。为什么?如果\(r\)\(j\)的答案为\(mi_j\)\(r\)\(i\)的答案为\(mi_i\),为了避免\(i\)直接把\(j\)给更新掉,一定有\(mi_i< \frac{mi_j}{2}\)

总结:积累做题经验,多开脑洞..


Code:

#include <cstdio>
#include <algorithm>
#include <vector>
const int N=1e5+10;
struct node
{int i,l,r;bool friend operator <(node n1,node n2){return n1.r<n2.r;}
}q[N<<2];
int ans[N<<2],Ans[N<<2],n,m,a[N],mi;
std::vector <int> seg[N<<2];
int min(int x,int y){return x<y?x:y;}
#define ls id<<1
#define rs id<<1|1
const int inf=0x3f3f3f3f;
void build(int id,int l,int r)
{for(int i=l;i<=r;i++) seg[id].push_back(a[i]);std::sort(seg[id].begin(),seg[id].end());ans[id]=inf;if(l==r) return;int mid=l+r>>1;build(ls,l,mid),build(rs,mid+1,r);
}
void change(int id,int l,int r,int p,int x)
{if(r<=p){std::vector <int>::iterator it=std::upper_bound(seg[id].begin(),seg[id].end(),x);if(it!=seg[id].end()) ans[id]=min(ans[id],*it-x);if(it!=seg[id].begin()) ans[id]=min(ans[id],x-*(it-1));if(mi<=ans[id]) return;//右边已经有比Ta优秀的了if(l==r){mi=min(mi,ans[id]);return;}}int mid=l+r>>1;if(p>mid) change(rs,mid+1,r,p,x);//注意先走右边change(ls,l,mid,p,x);ans[id]=min(ans[id],min(ans[ls],ans[rs]));mi=min(mi,ans[id]);//最后更新Ta
}
int query(int id,int L,int R,int l,int r)
{if(L==l&&R==r) return ans[id];int Mid=L+R>>1;if(r<=Mid) return query(ls,L,Mid,l,r);else if(l>Mid) return query(rs,Mid+1,R,l,r);else return min(query(ls,L,Mid,l,Mid),query(rs,Mid+1,R,Mid+1,r));
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",a+i);build(1,1,n);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);q[i].i=i;}std::sort(q+1,q+1+m);for(int p=1,i=2;i<=n;i++){mi=inf;change(1,1,n,i-1,a[i]);for(;p<=m&&q[p].r<=i;++p)Ans[q[p].i]=query(1,1,n,q[p].l,i);}for(int i=1;i<=m;i++)printf("%d\n",Ans[i]);return 0;
}

2018.11.29

转载于:https://www.cnblogs.com/butterflydew/p/10040347.html

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

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

相关文章

grunt使用小记之开篇:grunt概述

Grunt是什么&#xff1f; Grunt是一个自动化的项目构建工具。如果你需要重复的执行像压缩&#xff0c;编译&#xff0c;单元测试&#xff0c;代码检查以及打包发布的任务。那么你可以使用Grunt来处理这些任务&#xff0c;你所需要做的只是配置好Grunt&#xff0c;这样能很大程度…

linux下使用nginx搭建集群,CentOS(linux) 下Nginx的安装(Nginx+Tomcat集群第一步)

CentOS(linux) 下Nginx的安装(NginxTomcat集群)CentOS 7.4(腾讯云)pcre库zlib库opensslNginx服务器安装gcc g开发类库yum -y install gcc automake autoconf libtool makeyum install gcc gcc-cwget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz解压pcre库tar -zxvf pcre-8…

Mybatis中 sequence不能自增长

解决方案&#xff1a; 参考&#xff1a; http://leeyee.github.io/blog/2013/08/22/mybatis-auto-increment-primary-key/ <insert id"addSupplier" parameterType"com.pinganfu.GouTong.common.dal.model.SmsSupplierDO" > <selectKey resultT…

在线生成透明ICO图标神器

此神器的链接为&#xff1a;http://ico.duduxuexi.com/ 大家可以将这个网址收藏好&#xff0c;本人亲测十分好用&#xff01;对我们的ios,安卓以及windows开发都有极大的好处。转载于:https://www.cnblogs.com/geeksongs/p/10040935.html

Vim的使用和快捷键介绍

参考&#xff1a;Linux–Vim的使用以及快捷键大全 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-12 12:43:19 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107297756 目录安装vim三种常用的模式三种常用模式的切换vim 快捷键1.一般模…

手机当电脑麦克风 linux,WO Mic让手机成为电脑的无线麦克风

WO Mic 是一款可以让 Android 手机成为电脑无线麦克风的应用&#xff0c;支持 windows 和 Linux&#xff0c;除了 WiFi&#xff0c;还能使用蓝牙以及 USB 数据线(只有安卓支持数据线连接)。官方下载页面如下&#xff1a;一、windows下安装连接windows主机上需要安装客户端和驱动…

如何编写 Cloud9 JavaScript IDE 的功能扩展

上周末我们在JSConf.eu发布了 Cloud9 IDE &#xff0c;同时发布了对应的GitHub项目。在4天时间里该项目得到340个人的关注和将近50个fork。Cloud9的口号是由"由Javascripters 为Javascripters创建的IED"&#xff0c;这口号有点递归&#xff0c;它意味着你可以hack这个…

make工具和Makefile基础语法(含有交叉编译、pthread_create()的处理)

目录含有交叉编译、pthread_create()处理初次使用1、编写Makefile文件2、make3、make cleanMakefile基本语法1、Makefile规则格式2、变量3、变量赋值符&#xff08;、:、?、&#xff09;4、模式规则&#xff08;通配符&#xff09;5、自动化变量6、伪目标7、条件判断8、函数使…

Object对象

原文地址&#xff1a;https://wangdoc.com/javascript/ JavaScript原生提供Object对象。JavaScript的所有其他对象都继承自Object对象&#xff0c;即都是Object的实例。Object对象的原生方法分为两类&#xff1a;Object本身的方法与Object的实例方法。Object对象本身的方法 所谓…

树莓派超声波模块测距

参考&#xff1a;树莓派超声波模块测距及C语言demo 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-07-22 16:54:16 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/107516949 前面这篇博文已经讲过了&#xff1a;树莓派外设开发基础&#xf…

spring cloud (一、服务注册demo_eureka)

首先我的博客记理论知识很少&#xff0c;大家对spring boot、spring cloud 、分布式 、微服务什么的一点概念都没有的还请先去百度看看理论&#xff0c;知道了是做什么用的&#xff0c;然后再写下demo ,这样学起来才没有那么迷糊&#xff01; 我一般写下的demo都是我踩了很多坑…

JavaFX 的 UI 控件集 ControlsFX

出处&#xff1a;http://www.oschina.net/p/controlsfx JavaFX 的 UI 控件集 ControlsFX ControlsFX 开源项目旨在为 JavaFX 开发提供更多的 UI 控件和其他工具。 该项目主要针对JavaFX 8.0&#xff08;捆绑在JDK 8中&#xff09;&#xff0c;考虑到JavaFX中已经包含了一些控件…

c语言link错误什么原因,C语言 OpenCV错误:“LINK:致命错误LNK1104:无法打开文件’opencv_core231d.lib’”...

我正在尝试在visual studio opencv中编译一个简单的代码,但是遇到了这个错误.码&#xff1a;#include #include using namespace cv;int main ( int argc, char **argv ){Mat im_gray;Mat img_bw;Mat img_final;Mat im_rgb imread("001.jpg");cvtColor(im_rgb,im_gr…

shell 脚本编写使用

目录一、什么是shell 脚本二、shell 脚本写法三、shell 脚本语法1、第一个 shell 脚本2、read命令3、数值计算4、test命令5、中括号判断符6、默认变量7、条件判断8、函数9、循环一、什么是shell 脚本 终端中输入一系列命令完成一些操作&#xff0c;但是我们一条一条输入命令&a…

javaweb开发之处理表单上传文件和文件下载

2019独角兽企业重金招聘Python工程师标准>>> 一、基于表单的上传文件 1. enctype属性 当表单需要上传文件时&#xff0c;需指定表单 enctype 的值为 multipart/form-data。 在 form 元素的语法中&#xff0c;enctype 属性指定将数据发送到服务器时浏览器使用的编码…

单片机预备知识(电平、进制转换、字节、数据类型)

参考&#xff1a;郭天祥十天带你精通51单片机 网址&#xff1a;https://www.bilibili.com/video/BV1DW411a7mz/?spm_id_from333.788.videocard.0 目录电平特性二进制进制转换1K字节等于多少字节基本数据类型电平特性 二进制 进制转换 也可参考这篇&#xff1a;进制问题和C语言…

c语言程序设计王新萍课后答案,C语言程序设计教程

C语言程序设计教程出版时间&#xff1a;2010年12月定  价&#xff1a;29.80I S B N &#xff1a;9787121116322所属分类&#xff1a;标  签&#xff1a;计算机技术 电子电脑 程序与语言本书由多年从事C语言教学的教师编写。全书共分11章&#xff0c;主要内容包括&#xf…

vue之filter用法

1、全局写法&#xff1a; 全局过滤器必须写在vue实例创建之前。 Vue.filter(testfilter, function (value,text) {// 返回处理后的值return valuetext}) 2、局部写法&#xff1a; 在组件实例对象里挂载。 filters: {changemsg:(val,text)>{return val text}}, 3、使用&…

[summary] 单调队列

2019独角兽企业重金招聘Python工程师标准>>> 很久没做单调队列了╮(╯_╰)╭ 已经不太会了.... 单调队列究其本质就是队列,加上队尾可以删除. 队列都是从队尾插入,队首输出.单调队列也一样. 以队尾到队首递增的单调队列为例,我们需要保证队列的单调性,所以当插入一…

判断同构数 c语言,基于visual Studio2013解决C语言竞赛题之0413同构数

JQuery的基础和应用1.什么是? DOM的作用:提供了一种动态的操作HTML元素的方法. jQuery是一个优秀的js库.用来操作HTML元素的工具. jQuery和DOM ...tomcat 8在win8&period;1中的配置配置jdk: 三个步骤: 1.环境变量>新建 JAVA_HOME C:\Program Files\Java\jdk1.…