【uoj222】 NOI2016—区间
http://uoj.ac/problem/222 (题目链接)
题意
有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值。
Solution
线段树+滑动窗口。这道题很好做,可是在考场上就差一点点,我愣是没想出来。
先将区间按长度排序,保证它们的长度是递增的,这样就可以滑动窗口了。将区间的端点离散化后,用线段树维护每个节点被覆盖的次数,记录当前区间被覆盖次数最多的点被覆盖多少次,当次数达到要求是更新答案,将头指针向后移动。
代码
// uoj222
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline int getint() {
int x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=10000010;
struct data {int l,r,len;}a[maxn];
struct tree {int l,r,s,tag;}tr[maxn<<2];
int b[maxn<<2],n,m,ans,cnt; bool cmp(data a,data b) {
return a.len<b.len;
}
void build(int k,int s,int t) {
tr[k].l=s;tr[k].r=t;tr[k].s=tr[k].tag=0;
if (s==t) return;
int mid=(s+t)>>1;
build(k<<1,s,mid);
build(k<<1|1,mid+1,t);
}
void pushdown(int k) {
tr[k<<1].s+=tr[k].tag;tr[k<<1|1].s+=tr[k].tag;
tr[k<<1].tag+=tr[k].tag;tr[k<<1|1].tag+=tr[k].tag;
tr[k].tag=0;
}
void update(int k,int s,int t,int val) {
int l=tr[k].l,r=tr[k].r;
if (tr[k].tag!=0) pushdown(k);
if (s==l && r==t) {tr[k].tag+=val;tr[k].s+=val;return;}
int mid=(l+r)>>1;
if (t<=mid) update(k<<1,s,t,val);
else if (s>mid) update(k<<1|1,s,t,val);
else update(k<<1,s,mid,val),update(k<<1|1,mid+1,t,val);
tr[k].s=max(tr[k<<1].s,tr[k<<1|1].s);
}
int main() {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) {
scanf("%d%d",&a[i].l,&a[i].r);
b[++cnt]=a[i].l;b[++cnt]=a[i].r;
a[i].len=a[i].r-a[i].l;
}
sort(a+1,a+1+n,cmp);sort(b+1,b+1+cnt);
build(1,1,cnt);
for (int i=1;i<=n;i++)
a[i].l=lower_bound(b+1,b+1+cnt,a[i].l)-b,a[i].r=lower_bound(b+1,b+1+cnt,a[i].r)-b;
ans=inf;
int L=1,R=1;
while (R<=n) {
update(1,a[R].l,a[R].r,1);
while (tr[1].s>=m) {
ans=min(ans,a[R].len-a[L].len);
update(1,a[L].l,a[L].r,-1);
L++;
}
R++;
}
printf("%d",ans<inf?ans:-1);
return 0;
}
【uoj222】 NOI2016—区间的更多相关文章
- UOJ222 NOI2016 区间 线段树+FIFO队列
首先将区间按长度排序后离散化端点(这里的“长度”指的是离散化之前区间的实际长度) 然后模拟一个队列,区间按排好的顺序依次进入,直到某个点被覆盖了M次.之后依次出队,直到所有点都被覆盖小于M次 修改和询 ...
- BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针
BZOJ_4653_[Noi2016]区间_线段树+离散化+双指针 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间, ...
- [Noi2016]区间[离散化+线段树维护+决策单调性]
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 621 Solved: 329[Submit][Status][D ...
- [NOI2016]区间 线段树
[NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...
- [BZOJ4653][NOI2016]区间 贪心+线段树
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MB Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],. ...
- 【BZOJ4653】[Noi2016]区间 双指针法+线段树
[BZOJ4653][Noi2016]区间 Description 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含 ...
- [NOI2016]区间 题解(决策单调性+线段树优化)
4653: [Noi2016]区间 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1593 Solved: 869[Submit][Status][ ...
- Luogu P1712 [NOI2016]区间(线段树)
P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间, ...
- 【题解】P1712 [NOI2016]区间(贪心+线段树)
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
随机推荐
- java10-1 Object类
Object:类 Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...
- kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装ubuntu虚拟机)-(5)
之前介绍了在webvirtmgr平台下创建centos,windows server 2008的虚拟机,今天说下创建ubuntu虚拟机的过程. (1)首先下载ubuntu16.04的iso镜像放到/u ...
- Linux下利用CGroup控制CPU、内存以及IO的操作记录
CGroup及其子系统的介绍在这里就不赘述了,可以参考:Linux下CGroup使用说明梳理废话不多说,这里记录下利用CGroup控制CPU.内存以及IO的操作记录: libcgroup工具安装这里以 ...
- S2小测--索引--视图
1. 关于Sql server 视图 视图是一个虚拟表,我们在查询视图的时候,实际上是对基础表的查询.视图不仅可以作为SELECT查询的目标,也可以作为修改语句的目 标.理论上它可以像普通的物理表一 ...
- android实现点击背景图片不同区域实现不同事件
有时候我们拿到一张背景图片,客户要求点击图片的不同区域去跳转或者实现不同的操作事件.我们首先要确认图片的点击区域,往往我们会在布局文件那里下手,但是这样不好做适配,所以我实现了以下方法,基本功能可以实 ...
- Implement Stack using Queues
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- Linux 守护进程二(激活守护进程)
//守护进程--读文件 #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...
- python 3 安装 scrapy 并运行成功
今天,python 3 安装 scrapy, 并运行成功.特此纪念! 我的环境:windows 10(64位) + python 3.5.2(64位) 其中几个要点说明一下: 1.有几个依赖库需要事先 ...
- LeetCode:Text Justification
题目链接 Given an array of words and a length L, format the text such that each line has exactly L chara ...
- 20145208 实验二 Java面向对象程序设计
20145208 实验二 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...