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

CF765F Souvenirs 解题报告相关推荐

  1. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  2. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  3. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  4. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  5. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  6. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告(八) prufer 序列与 Cayley 公式(ACM / OI)超高质量题解

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

  8. 解题报告(一)E、(BZOJ4589)Hard Nim(博弈论 + FWT)

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

  9. 解题报告(五)组合计数(ACM / OI)超高质量题解

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

最新文章

  1. kodi教程_KODI清理缓存插件安装设置教程
  2. 锚文本的作用是什么?网站SEO优化时又需要注意哪些问题?
  3. 作幼儿教育软件的感受(2005-05-09)
  4. [转载] 中华典故故事(孙刚)——13 马虎
  5. java中的io系统详解(转)
  6. Python爬虫入门(1):综述
  7. Mysql -uroot -p 登陆不上_MySQL命令行登陆,远程登陆MySQL 的方法
  8. Java开发代码规范之编程规约---命名风格
  9. 统考计算机和英语百度网盘,《计算机专业英语》在线考试系统
  10. Spring : ApplicationContext和BeanFactory
  11. CentOS下编译安装Gcc-4.9
  12. PHP的静态变量和引用函数
  13. 广东技能大赛软件测试项目,我校喜获2019年全国职业院校技能大赛软件测试赛项二等奖...
  14. 可变剪切|rmats
  15. google aviator:Java逻辑公式引擎
  16. java文件分割与合并
  17. LCMS零件同步-字符串解析
  18. docker安装apollo
  19. 【Python】动量策略回测(日内高频数据)
  20. redis 学习参考网站(中文官方网站)

热门文章

  1. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖
  2. Clojure:导入lein项目到IntelliJ IDEA
  3. CodeForces369C On Changing Tree
  4. IIS 6.0支持.SHTML
  5. [转]算术编码+统计模型=数据压缩 - 第二部分:统计模型
  6. 使用SQL Server 2008提供的表分区向导
  7. 27 JSX函数子元素的应用与思考
  8. 前端后台管理系统梳理
  9. Apache 设置http跳转至HTTPS访问
  10. 勒索病毒攻击应急防范