博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NOI2016]区间
阅读量:7124 次
发布时间:2019-06-28

本文共 960 字,大约阅读时间需要 3 分钟。

先把所有区间按长度从小到大排序,我们选择一些连续的区间就可以得到最优解(最优解加上几个多余的区间就是排好序之后连续的区间)

枚举左右端点,用线段树维护区间加和询问$\max$可以做到$O\left(n^2\log_2n\right)$

但实际上我们只需要从小到大枚举右端点,此时左端点的选择是单调不降的,因为如果当前选择的区间已经满足要求,把左端点往左挪不会使答案变小,时间复杂度$O(n\log_2n)$

#include
#include
using namespace std;const int inf=2147483647;int mx[4000010],d[4000010];void pushup(int x){mx[x]=max(mx[x<<1],mx[x<<1|1]);}void ad(int x,int v){ d[x]+=v; mx[x]+=v;}void pushdown(int x){ if(d[x]){ ad(x<<1,d[x]); ad(x<<1|1,d[x]); d[x]=0; }}void modify(int L,int R,int v,int l,int r,int x){ if(L<=l&&r<=R)return ad(x,v); pushdown(x); int mid=(l+r)>>1; if(L<=mid)modify(L,R,v,l,mid,x<<1); if(mid
<<1|1); pushup(x);}struct seg{ int l,r,d;}p[500010];bool operator<(seg a,seg b){return a.d
=m){ ans=min(ans,p[i].d-p[l].d); modify(p[l].l,p[l].r,-1,1,N,1); l++; } } if(ans==inf)ans=-1; printf("%d",ans);}

转载于:https://www.cnblogs.com/jefflyy/p/9240188.html

你可能感兴趣的文章
从Express到Nestjs,谈谈Nestjs的设计思想和使用方法
查看>>
Java的8中基本数据类型
查看>>
Android 原生app获取用户授权访问Autodesk云应用数据
查看>>
LeetCode 310. Minimum Height Trees
查看>>
《Java编程思想》读书笔记-对象导论
查看>>
计算机体系
查看>>
算法 - 时间复杂度
查看>>
如何截取视频片段 批量截取片段的方法
查看>>
OKR与Scrum如何强强联手
查看>>
dva中组件的懒加载
查看>>
IOS开发错误library not found for -lXXX
查看>>
Java动态追踪技术探究
查看>>
LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
查看>>
Redis 使用记录(五)
查看>>
手挽手带你学VUE:二档 组件开发以及常用全局api
查看>>
60 个让程序员崩溃的瞬间,太TM真实了
查看>>
详解 Solidity 事件Event - 完全搞懂事件的使用
查看>>
CAS 算法 —— Compare and Swap
查看>>
js实现在input框中动态添加图标
查看>>
element-ui配合vue分页
查看>>