【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,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
随机推荐
- AC日记——铺地毯 洛谷 P1003(水水水水水~)
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- [转] Linux下防火墙iptables用法规则详及其防火墙配置
from: http://www.cnblogs.com/yi-meng/p/3213925.html 备注: 排版还不错,建议看以上的链接. iptables规则 规则--顾名思义就是规矩和原则,和 ...
- static,静态关键字的详解
一,使用static声明属性 class Person{ // 定义Person类 String name ; // 定义name属性,暂时不封装 int age ; // 定义age属性,暂时不封装 ...
- linux系统终端命令提示符设置(PS1)记录
PS(Prompt Sign)指的是命令提示符,在日常运维工作中为了方面操作管理,有时会设定PS1环境变量.废话不多说,下面开始记录下Linux中PS1设置 在/etc/.bashrc中,找到PS1变 ...
- 会报编译器警告的Xcode 6.3新特性:Nullability Annotations
最近在用Xcode 6.3写代码,一些涉及到对象的代码会报如下编译器警告: 1 Pointer is missing a nullability type specifier (__nonnull o ...
- PHP中的魔术变量
PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量. 名称 说明 __LINE__ 文件中的当前行号. __FILE__ 文件的完整路径和文件名 ...
- 14Spring_AOP编程(AspectJ)_环绕通知
在目标方法执行前后,进行代码增强 (阻止目标方法的执行 ) 环绕通知实现任何通知效果. 案例如下: 案例结构:
- Entity Framework版本历史概览
转自:http://www.cnblogs.com/fecktty2013/archive/2014/09/26/entityframework-overview.html EF版本 .net fra ...
- C语言 break跳出循环
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <stri ...
- Console的使用——Google Chrome代码调试
Google Chrome控制台为开发者提供了网页和应用程序调试的几种方法,本文通过基本操作.控制台API.命令行API来介绍控制台的使用. 基本操作 1.开启控制台 可以通过下列三种方式开启 ...