luogu P1712 [NOI2016]区间
题目描述
在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。
对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值。
求所有合法方案中最小的花费。如果不存在合法的方案,输出 −1
输入描述:
第一行包含两个正整数 n,m用空格隔开,意义如上文所述。保证 1≤m≤n
接下来 n行,每行表示一个区间,包含用空格隔开的两个整数 li 和 ri 为该区间的左右端点。
N<=500000,M<=200000,0≤li≤ri≤10^9
输出描述:
只有一行,包含一个正整数,即最小花费。
按照区间长度排序,把区间端点离散化.
这样做不影响答案,我们也可以更加方便处理
线段树区间维护最大值就解决了
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+10,inf=1<<30;
#define int long long
#define ls (p<<1)
#define rs (p<<1)|1
struct node{
int l,r,sum,add;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
}tree[4*N];
#define mid ((l(p)+r(p))>>1)
inline void pushdown(int p){
add(ls)+=add(p);
add(rs)+=add(p);
sum(ls)+=add(p);
sum(rs)+=add(p);
add(p)=0;
}
inline void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r)return;
build(ls,l,mid);
build(rs,mid+1,r);
}
inline int ask(int p,int l,int r){
if(l<=l(p)&&r(p)<=r)return sum(p);
int ans=0;
if(add(p))pushdown(p);
if(l<=mid)ans=max(ans,ask(ls,l,r));
if(r>mid)ans=max(ans,ask(rs,l,r));
return ans;
}
inline void change(int p,int l,int r,int d){
if(l<=l(p)&&r(p)<=r){sum(p)+=d;add(p)+=d;return;}
if(add(p))pushdown(p);
if(l<=mid)change(ls,l,r,d);
if(r>mid)change(rs,l,r,d);
sum(p)=max(sum(ls),sum(rs));
}
struct E{
int l,r,len;
}e[N];
bool cmp(E t1,E t2){return t1.len<t2.len;}
int A[N],n,m;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld%lld",&e[i].l,&e[i].r);
e[i].len=e[i].r-e[i].l;
A[i]=e[i].l;
A[i+n]=e[i].r;
}
sort(A+1,A+1+2*n);sort(e+1,e+1+n,cmp);
int len=unique(A+1,A+1+2*n)-A-1;
for(int i=1;i<=n;i++){
e[i].l=lower_bound(A+1,A+1+len,e[i].l)-A;
e[i].r=lower_bound(A+1,A+1+len,e[i].r)-A;
}
build(1,1,2*n);
int l=1,r=0,ans=inf;
while(r<n){
while(r<n&&sum(1)<m){++r;change(1,e[r].l,e[r].r,1);}
if(sum(1)<m)break;int tmp;
while(sum(1)>=m)tmp=e[l].len,change(1,e[l].l,e[l].r,-1),++l;
ans=min(ans,e[r].len-tmp);
}
printf("%lld\n",ans==inf?-1:ans);
}
luogu P1712 [NOI2016]区间的更多相关文章
- Luogu P1712 [NOI2016]区间(线段树)
P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...
- luogu P1712 [NOI2016]区间 贪心 尺取法 线段树 二分
LINK:区间 没想到尺取法. 先说暴力 可以发现答案一定可以转换到端点处 所以在每个端点从小到大扫描线段就能得到答案 复杂度\(n\cdot m\) 再说我的做法 想到了二分 可以进行二分答案 从左 ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- P1712 [NOI2016]区间
题目描述 在数轴上有 NN 个闭区间 [l_1,r_1],[l_2,r_2],...,[l_n,r_n][l1,r1],[l2,r2],...,[ln,rn] .现在要从中选出 MM 个区 ...
- 洛谷 P1712 [NOI2016]区间(线段树)
传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次 ...
- 并不对劲的bzoj4651:loj2086:uoj222:p1712:[NOI2016]区间
题目大意 有\(n\)(\(n\leq 5*10^5\))个闭区间\([L_1,R_1],[L_2,R_2],...,[L_n,R_n]\)(\(\forall i\in [1,n],0\leq L_ ...
- [洛谷P1712] NOI2016 区间
问题描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一 ...
- 洛谷$P1712\ [NOI2016]$区间 线段树
正解:线段树 解题报告: 传送门$QwQ$ $umm$很久以前做的了来补个题解$QwQ$ 考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权 ...
随机推荐
- 「CF630C」Lucky Numbers
更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description The numbers of all offices in the new ...
- Java基础语法03-数组
四数组 数组概念: 数组就是用于存储数据的长度固定的容器,多个数据的数据类型要一致. 百科:数组(array),就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,以 ...
- python3学习,有c++的基础
# 为注释一行 ''' ''' 和 """ """为注释多行 用缩进表示代码块,不用{},同一等级代码用的缩进数一致 一条语句写在多行:a= ...
- 易初大数据 2019年11月7日 spss 王庆超
许多统计过程也都提供描述性统计指标的输出. (2)描述(D):该过程进行一般性的统计描述.它可以输出均值.均值的标准误.方差.标准差.范围(极差).最大值.最小值.峰度和偏度. (3)探索(E):该过 ...
- swoole不断的切换前端链接方法 防止攻击
php不断的切换前端链接方法 防止攻击 swoole写法 每分钟生成一次url后缀 返回到客户端让他们更新 //定时器要写在WorkerStart这个里面哦$ws->on('WorkerStar ...
- mysql group by分组查询后 查询个数
mysql group by分组查询后 查询个数2个方法随便你选 <pre>select count(distinct colA) from table1;</pre>< ...
- 012.Kubernetes二进制部署worker节点Flannel
一 部署flannel 1.1 安装flannel kubernetes 要求集群内各节点(包括 master 节点)能通过 Pod 网段互联互通.flannel 使用 vxlan 技术为各节点创建一 ...
- C++图像加Lidar点云转写rosbag
近期需要处理一批Lidar+image的数据,拿到的是其他格式,但要转存成rosbag使用,参考部分网上做法,完成并记录. 1.Lidar处理 主要是将Lidar点云信息按点转为pcl::PointX ...
- 关于@Autowired 与@Resource的
@Autowired注解是spring自己定义的,@Resource是由JSR-250规范定义的注解. @Resource的作用相当于@Autowired,只不过@Autowired按byType自动 ...
- tornado的使用-上传图片
tornado的使用-上传图片